最後活躍 1790666426

install-synology-prompt.sh 原始檔案
1#!/usr/bin/env bash
2#
3# install-synology-prompt.sh
4#
5# Universal installer for Synology SysAdmin Prompt.
6#
7# -------------------------------------------------------------------------------
8# USAGE
9# -------------------------------------------------------------------------------
10#
11# Recommended:
12#
13# bash install-synology-prompt.sh
14#
15# Do NOT normally run this installer using:
16#
17# sudo bash install-synology-prompt.sh
18#
19# The script will request sudo privileges itself when required.
20#
21#
22# What this installer does:
23#
24# 1. Verifies that the machine looks like Synology DSM.
25# 2. Verifies that Bash is available.
26# 3. Downloads synology-prompt.sh.
27# 4. Installs it as:
28#
29# /etc/synology-prompt.sh
30#
31# with:
32#
33# owner: root
34# group: root
35# mode : 0644
36#
37# 5. Adds a small loader to the current user's ~/.profile.
38# 6. Preserves existing user configuration.
39# 7. Adds root integration to /root/.profile.
40# 8. Preserves Synology's original root profile.
41# 9. Makes "sudo -i" use Bash + the same prompt.
42#
43#
44# Requirements:
45#
46# - Synology DSM
47# - Bash
48# - sudo access
49# - wget or curl
50#
51#
52# Nerd Font:
53#
54# Nerd Font is NOT installed on Synology.
55# Install/use a Nerd Font in your SSH client or terminal.
56#
57# -------------------------------------------------------------------------------
58
59
60set -u
61
62
63# ==============================================================================
64# CONFIGURATION
65# ==============================================================================
66
67PROMPT_URL="https://gist.darto.id/dartokloning/d0bd9f4e277a4242acbc7fb153c9a440/download/HEAD/synology-prompt.sh"
68
69PROMPT_FILE="/etc/synology-prompt.sh"
70
71USER_MARKER_BEGIN="# >>> Synology SysAdmin Prompt >>>"
72USER_MARKER_END="# <<< Synology SysAdmin Prompt <<<"
73
74ROOT_MARKER_BEGIN="# >>> Synology SysAdmin Prompt - Root >>>"
75ROOT_MARKER_END="# <<< Synology SysAdmin Prompt - Root <<<"
76
77
78# ==============================================================================
79# OUTPUT HELPERS
80# ==============================================================================
81
82info()
83{
84 printf '\n== %s ==\n' "$1"
85}
86
87
88ok()
89{
90 printf ' -> %s\n' "$1"
91}
92
93
94warn()
95{
96 printf 'WARNING: %s\n' "$1" >&2
97}
98
99
100die()
101{
102 printf 'ERROR: %s\n' "$1" >&2
103 exit 1
104}
105
106
107# ==============================================================================
108# DETECT CURRENT USER
109# ==============================================================================
110
111# The installer is intended to be launched as the normal DSM user.
112if [ "$(id -u)" -eq 0 ]; then
113 die "Jalankan installer sebagai user DSM biasa, bukan dengan 'sudo bash'. Gunakan: bash install-synology-prompt.sh"
114fi
115
116CURRENT_USER="$(id -un)"
117CURRENT_HOME="${HOME:-}"
118
119[ -n "$CURRENT_HOME" ] ||
120 die "HOME untuk user ${CURRENT_USER} tidak ditemukan."
121
122[ -d "$CURRENT_HOME" ] ||
123 die "Home directory tidak ditemukan: ${CURRENT_HOME}"
124
125
126# ==============================================================================
127# VERIFY SYNOLOGY DSM
128# ==============================================================================
129
130info "1. Memeriksa Synology DSM"
131
132if [ ! -f /etc.defaults/VERSION ]; then
133 die "File /etc.defaults/VERSION tidak ditemukan. Mesin ini tidak terlihat seperti Synology DSM."
134fi
135
136DSM_VERSION="$(
137 sed -n 's/^productversion="\([^"]*\)".*/\1/p' \
138 /etc.defaults/VERSION 2>/dev/null |
139 head -n 1
140)"
141
142DSM_BUILD="$(
143 sed -n 's/^buildnumber="\([^"]*\)".*/\1/p' \
144 /etc.defaults/VERSION 2>/dev/null |
145 head -n 1
146)"
147
148ok "Synology DSM terdeteksi."
149
150if [ -n "$DSM_VERSION" ]; then
151 ok "DSM version: ${DSM_VERSION}"
152fi
153
154if [ -n "$DSM_BUILD" ]; then
155 ok "DSM build: ${DSM_BUILD}"
156fi
157
158ok "User: ${CURRENT_USER}"
159ok "Home: ${CURRENT_HOME}"
160
161
162# ==============================================================================
163# VERIFY BASH
164# ==============================================================================
165
166info "2. Memeriksa Bash"
167
168command -v bash >/dev/null 2>&1 ||
169 die "Bash tidak ditemukan."
170
171BASH_PATH="$(command -v bash)"
172
173ok "Bash ditemukan: ${BASH_PATH}"
174
175BASH_VERSION_TEXT="$(
176 bash --version 2>/dev/null |
177 head -n 1
178)"
179
180[ -n "$BASH_VERSION_TEXT" ] &&
181 ok "$BASH_VERSION_TEXT"
182
183
184# ==============================================================================
185# VERIFY SUDO
186# ==============================================================================
187
188info "3. Memeriksa sudo"
189
190command -v sudo >/dev/null 2>&1 ||
191 die "sudo tidak ditemukan."
192
193printf ' -> Meminta privilege sudo...\n'
194
195sudo -v ||
196 die "Tidak mendapatkan privilege sudo."
197
198ok "sudo siap digunakan."
199
200
201# ==============================================================================
202# VERIFY DOWNLOAD TOOL
203# ==============================================================================
204
205info "4. Memeriksa downloader"
206
207if command -v wget >/dev/null 2>&1; then
208
209 DOWNLOAD_TOOL="wget"
210 ok "Menggunakan wget."
211
212elif command -v curl >/dev/null 2>&1; then
213
214 DOWNLOAD_TOOL="curl"
215 ok "Menggunakan curl."
216
217else
218
219 die "wget maupun curl tidak ditemukan."
220fi
221
222
223# ==============================================================================
224# VERIFY URL
225# ==============================================================================
226
227if [ "$PROMPT_URL" = "PASTE_RAW_GIST_URL_HERE" ] ||
228 [ -z "$PROMPT_URL" ]; then
229
230 die "PROMPT_URL belum diisi. Edit installer dan isi URL raw/download synology-prompt.sh dari Gist."
231fi
232
233
234# ==============================================================================
235# TEMPORARY DIRECTORY
236# ==============================================================================
237
238TMP_DIR="$(mktemp -d)" ||
239 die "Tidak dapat membuat temporary directory."
240
241TMP_PROMPT="${TMP_DIR}/synology-prompt.sh"
242
243cleanup()
244{
245 rm -rf "$TMP_DIR"
246}
247
248trap cleanup EXIT
249
250
251# ==============================================================================
252# DOWNLOAD PROMPT
253# ==============================================================================
254
255info "5. Download synology-prompt.sh"
256
257if [ "$DOWNLOAD_TOOL" = "wget" ]; then
258
259 wget -q -O "$TMP_PROMPT" "$PROMPT_URL" ||
260 die "Gagal download: ${PROMPT_URL}"
261
262else
263
264 curl -fsSL "$PROMPT_URL" -o "$TMP_PROMPT" ||
265 die "Gagal download: ${PROMPT_URL}"
266fi
267
268
269[ -s "$TMP_PROMPT" ] ||
270 die "File hasil download kosong."
271
272
273# Basic sanity check.
274if ! grep -q 'Synology DSM SysAdmin Prompt\|Universal Powerline-style SysAdmin prompt' "$TMP_PROMPT"; then
275
276 warn "File berhasil didownload tetapi signature prompt tidak ditemukan."
277 warn "Periksa PROMPT_URL sebelum melanjutkan."
278
279 exit 1
280fi
281
282ok "Prompt berhasil didownload."
283
284
285# ==============================================================================
286# INSTALL SYSTEM-WIDE PROMPT
287# ==============================================================================
288
289info "6. Install system-wide prompt"
290
291sudo cp "$TMP_PROMPT" "$PROMPT_FILE" ||
292 die "Gagal menyalin prompt ke ${PROMPT_FILE}."
293
294sudo chown root:root "$PROMPT_FILE" ||
295 die "Gagal mengatur ownership ${PROMPT_FILE}."
296
297sudo chmod 0644 "$PROMPT_FILE" ||
298 die "Gagal mengatur permission ${PROMPT_FILE}."
299
300ok "Installed: ${PROMPT_FILE}"
301ok "Owner: root:root"
302ok "Mode: 0644"
303
304
305# ==============================================================================
306# USER PROFILE
307# ==============================================================================
308
309info "7. Konfigurasi user ${CURRENT_USER}"
310
311USER_PROFILE="${CURRENT_HOME}/.profile"
312
313# Create profile if it does not exist.
314if [ ! -e "$USER_PROFILE" ]; then
315
316 touch "$USER_PROFILE" ||
317 die "Tidak dapat membuat ${USER_PROFILE}."
318
319 ok "Membuat ${USER_PROFILE}."
320fi
321
322
323# Backup only once.
324USER_BACKUP="${USER_PROFILE}.before-synology-prompt"
325
326if [ ! -e "$USER_BACKUP" ]; then
327
328 cp -a "$USER_PROFILE" "$USER_BACKUP" ||
329 die "Gagal membuat backup ${USER_BACKUP}."
330
331 ok "Backup dibuat: ${USER_BACKUP}"
332
333else
334
335 ok "Backup user profile sudah ada, tidak ditimpa."
336fi
337
338
339# Remove an existing managed block, making installation idempotent.
340USER_TMP="${TMP_DIR}/user-profile"
341
342awk \
343 -v begin="$USER_MARKER_BEGIN" \
344 -v end="$USER_MARKER_END" '
345 $0 == begin { skip=1; next }
346 $0 == end { skip=0; next }
347 !skip { print }
348 ' "$USER_PROFILE" > "$USER_TMP" ||
349 die "Gagal memproses ${USER_PROFILE}."
350
351
352cat >> "$USER_TMP" <<'EOF'
353
354# >>> Synology SysAdmin Prompt >>>
355#
356# Start Bash for interactive sessions and load the system-wide prompt.
357#
358case "$-" in
359 *i*)
360 if [ -z "${SYNO_USER_PROMPT:-}" ]; then
361 export SYNO_USER_PROMPT=1
362 exec bash --noprofile --rcfile /etc/synology-prompt.sh -i
363 fi
364 ;;
365esac
366# <<< Synology SysAdmin Prompt <<<
367EOF
368
369
370cp "$USER_TMP" "$USER_PROFILE" ||
371 die "Gagal memperbarui ${USER_PROFILE}."
372
373ok "User profile dikonfigurasi."
374
375
376# ==============================================================================
377# ROOT PROFILE
378# ==============================================================================
379
380info "8. Konfigurasi root"
381
382ROOT_PROFILE="/root/.profile"
383ROOT_BACKUP="/root/.profile.before-synology-prompt"
384
385# DSM normally has /root/.profile, but create it safely if absent.
386if ! sudo test -e "$ROOT_PROFILE"; then
387
388 sudo touch "$ROOT_PROFILE" ||
389 die "Gagal membuat ${ROOT_PROFILE}."
390
391 sudo chown root:root "$ROOT_PROFILE"
392 sudo chmod 0600 "$ROOT_PROFILE"
393
394 ok "Membuat ${ROOT_PROFILE}."
395fi
396
397
398# Backup only once.
399if ! sudo test -e "$ROOT_BACKUP"; then
400
401 sudo cp -a "$ROOT_PROFILE" "$ROOT_BACKUP" ||
402 die "Gagal membuat backup ${ROOT_BACKUP}."
403
404 ok "Backup dibuat: ${ROOT_BACKUP}"
405
406else
407
408 ok "Backup root profile sudah ada, tidak ditimpa."
409fi
410
411
412ROOT_TMP="${TMP_DIR}/root-profile"
413
414sudo cat "$ROOT_PROFILE" |
415awk \
416 -v begin="$ROOT_MARKER_BEGIN" \
417 -v end="$ROOT_MARKER_END" '
418 $0 == begin { skip=1; next }
419 $0 == end { skip=0; next }
420 !skip { print }
421 ' > "$ROOT_TMP" ||
422 die "Gagal memproses ${ROOT_PROFILE}."
423
424
425cat >> "$ROOT_TMP" <<'EOF'
426
427# >>> Synology SysAdmin Prompt - Root >>>
428#
429# Preserve Synology's original root initialization above.
430# For interactive root login (for example: sudo -i),
431# replace ash with Bash and load the system-wide prompt.
432#
433case "$-" in
434 *i*)
435 if [ -z "${SYNO_ROOT_PROMPT:-}" ]; then
436 export SYNO_ROOT_PROMPT=1
437 cd /root 2>/dev/null || true
438 exec bash --noprofile --rcfile /etc/synology-prompt.sh -i
439 fi
440 ;;
441esac
442# <<< Synology SysAdmin Prompt - Root <<<
443EOF
444
445
446sudo cp "$ROOT_TMP" "$ROOT_PROFILE" ||
447 die "Gagal memperbarui ${ROOT_PROFILE}."
448
449sudo chown root:root "$ROOT_PROFILE"
450
451ok "Root profile dikonfigurasi."
452
453
454# ==============================================================================
455# VERIFY
456# ==============================================================================
457
458info "9. Verifikasi"
459
460if sudo test -r "$PROMPT_FILE"; then
461 ok "${PROMPT_FILE} readable."
462else
463 die "${PROMPT_FILE} tidak dapat dibaca."
464fi
465
466
467if grep -Fq "$USER_MARKER_BEGIN" "$USER_PROFILE"; then
468 ok "User loader ditemukan."
469else
470 die "User loader tidak ditemukan."
471fi
472
473
474if sudo grep -Fq "$ROOT_MARKER_BEGIN" "$ROOT_PROFILE"; then
475 ok "Root loader ditemukan."
476else
477 die "Root loader tidak ditemukan."
478fi
479
480
481# ==============================================================================
482# DONE
483# ==============================================================================
484
485printf '\n'
486printf '====================================================================\n'
487printf ' Synology SysAdmin Prompt berhasil di-install\n'
488printf '====================================================================\n'
489printf '\n'
490
491printf 'Prompt file:\n'
492printf ' %s\n' "$PROMPT_FILE"
493
494printf '\nUser:\n'
495printf ' %s\n' "$CURRENT_USER"
496
497printf '\nCara menggunakan:\n'
498printf '\n'
499printf ' 1. Logout dari SSH lalu login kembali.\n'
500printf '\n'
501printf ' ATAU untuk test tanpa logout:\n'
502printf '\n'
503printf ' exec bash --noprofile --rcfile %s -i\n' "$PROMPT_FILE"
504printf '\n'
505printf ' 2. Untuk masuk ke root:\n'
506printf '\n'
507printf ' sudo -i\n'
508printf '\n'
509printf ' Root otomatis menggunakan warning palette merah/kuning.\n'
510printf '\n'
511printf ' 3. Jika icon Powerline/Nerd Font tidak tampil dengan benar,\n'
512printf ' gunakan Nerd Font pada terminal CLIENT, bukan pada Synology.\n'
513printf '\n'
514printf 'Contoh prompt user:\n'
515printf '\n'
516printf ' ╭  user   NAS   ~   52%%   Selasa, 29 September 2026   14:00:00 \n'
517printf ' ╰> $\n'
518printf '\n'
519printf 'Contoh root:\n'
520printf '\n'
521printf ' sudo -i\n'
522printf '\n'
523printf ' ╭  root   NAS   ~   24%%  ...\n'
524printf ' ╰> #\n'
525printf '\n'
526printf 'Backup:\n'
527printf ' User : %s\n' "$USER_BACKUP"
528printf ' Root : %s\n' "$ROOT_BACKUP"
529printf '\n'
530printf 'Selesai.\n'