Dernière activité 1790666426

dartokloning's Avatar dartokloning a révisé ce gist 1790666426. Aller à la révision

1 file changed, 530 insertions

install-synology-prompt.sh(fichier créé)

@@ -0,0 +1,530 @@
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 +
60 + set -u
61 +
62 +
63 + # ==============================================================================
64 + # CONFIGURATION
65 + # ==============================================================================
66 +
67 + PROMPT_URL="https://gist.darto.id/dartokloning/d0bd9f4e277a4242acbc7fb153c9a440/download/HEAD/synology-prompt.sh"
68 +
69 + PROMPT_FILE="/etc/synology-prompt.sh"
70 +
71 + USER_MARKER_BEGIN="# >>> Synology SysAdmin Prompt >>>"
72 + USER_MARKER_END="# <<< Synology SysAdmin Prompt <<<"
73 +
74 + ROOT_MARKER_BEGIN="# >>> Synology SysAdmin Prompt - Root >>>"
75 + ROOT_MARKER_END="# <<< Synology SysAdmin Prompt - Root <<<"
76 +
77 +
78 + # ==============================================================================
79 + # OUTPUT HELPERS
80 + # ==============================================================================
81 +
82 + info()
83 + {
84 + printf '\n== %s ==\n' "$1"
85 + }
86 +
87 +
88 + ok()
89 + {
90 + printf ' -> %s\n' "$1"
91 + }
92 +
93 +
94 + warn()
95 + {
96 + printf 'WARNING: %s\n' "$1" >&2
97 + }
98 +
99 +
100 + die()
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.
112 + if [ "$(id -u)" -eq 0 ]; then
113 + die "Jalankan installer sebagai user DSM biasa, bukan dengan 'sudo bash'. Gunakan: bash install-synology-prompt.sh"
114 + fi
115 +
116 + CURRENT_USER="$(id -un)"
117 + CURRENT_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 +
130 + info "1. Memeriksa Synology DSM"
131 +
132 + if [ ! -f /etc.defaults/VERSION ]; then
133 + die "File /etc.defaults/VERSION tidak ditemukan. Mesin ini tidak terlihat seperti Synology DSM."
134 + fi
135 +
136 + DSM_VERSION="$(
137 + sed -n 's/^productversion="\([^"]*\)".*/\1/p' \
138 + /etc.defaults/VERSION 2>/dev/null |
139 + head -n 1
140 + )"
141 +
142 + DSM_BUILD="$(
143 + sed -n 's/^buildnumber="\([^"]*\)".*/\1/p' \
144 + /etc.defaults/VERSION 2>/dev/null |
145 + head -n 1
146 + )"
147 +
148 + ok "Synology DSM terdeteksi."
149 +
150 + if [ -n "$DSM_VERSION" ]; then
151 + ok "DSM version: ${DSM_VERSION}"
152 + fi
153 +
154 + if [ -n "$DSM_BUILD" ]; then
155 + ok "DSM build: ${DSM_BUILD}"
156 + fi
157 +
158 + ok "User: ${CURRENT_USER}"
159 + ok "Home: ${CURRENT_HOME}"
160 +
161 +
162 + # ==============================================================================
163 + # VERIFY BASH
164 + # ==============================================================================
165 +
166 + info "2. Memeriksa Bash"
167 +
168 + command -v bash >/dev/null 2>&1 ||
169 + die "Bash tidak ditemukan."
170 +
171 + BASH_PATH="$(command -v bash)"
172 +
173 + ok "Bash ditemukan: ${BASH_PATH}"
174 +
175 + BASH_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 +
188 + info "3. Memeriksa sudo"
189 +
190 + command -v sudo >/dev/null 2>&1 ||
191 + die "sudo tidak ditemukan."
192 +
193 + printf ' -> Meminta privilege sudo...\n'
194 +
195 + sudo -v ||
196 + die "Tidak mendapatkan privilege sudo."
197 +
198 + ok "sudo siap digunakan."
199 +
200 +
201 + # ==============================================================================
202 + # VERIFY DOWNLOAD TOOL
203 + # ==============================================================================
204 +
205 + info "4. Memeriksa downloader"
206 +
207 + if command -v wget >/dev/null 2>&1; then
208 +
209 + DOWNLOAD_TOOL="wget"
210 + ok "Menggunakan wget."
211 +
212 + elif command -v curl >/dev/null 2>&1; then
213 +
214 + DOWNLOAD_TOOL="curl"
215 + ok "Menggunakan curl."
216 +
217 + else
218 +
219 + die "wget maupun curl tidak ditemukan."
220 + fi
221 +
222 +
223 + # ==============================================================================
224 + # VERIFY URL
225 + # ==============================================================================
226 +
227 + if [ "$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."
231 + fi
232 +
233 +
234 + # ==============================================================================
235 + # TEMPORARY DIRECTORY
236 + # ==============================================================================
237 +
238 + TMP_DIR="$(mktemp -d)" ||
239 + die "Tidak dapat membuat temporary directory."
240 +
241 + TMP_PROMPT="${TMP_DIR}/synology-prompt.sh"
242 +
243 + cleanup()
244 + {
245 + rm -rf "$TMP_DIR"
246 + }
247 +
248 + trap cleanup EXIT
249 +
250 +
251 + # ==============================================================================
252 + # DOWNLOAD PROMPT
253 + # ==============================================================================
254 +
255 + info "5. Download synology-prompt.sh"
256 +
257 + if [ "$DOWNLOAD_TOOL" = "wget" ]; then
258 +
259 + wget -q -O "$TMP_PROMPT" "$PROMPT_URL" ||
260 + die "Gagal download: ${PROMPT_URL}"
261 +
262 + else
263 +
264 + curl -fsSL "$PROMPT_URL" -o "$TMP_PROMPT" ||
265 + die "Gagal download: ${PROMPT_URL}"
266 + fi
267 +
268 +
269 + [ -s "$TMP_PROMPT" ] ||
270 + die "File hasil download kosong."
271 +
272 +
273 + # Basic sanity check.
274 + if ! 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
280 + fi
281 +
282 + ok "Prompt berhasil didownload."
283 +
284 +
285 + # ==============================================================================
286 + # INSTALL SYSTEM-WIDE PROMPT
287 + # ==============================================================================
288 +
289 + info "6. Install system-wide prompt"
290 +
291 + sudo cp "$TMP_PROMPT" "$PROMPT_FILE" ||
292 + die "Gagal menyalin prompt ke ${PROMPT_FILE}."
293 +
294 + sudo chown root:root "$PROMPT_FILE" ||
295 + die "Gagal mengatur ownership ${PROMPT_FILE}."
296 +
297 + sudo chmod 0644 "$PROMPT_FILE" ||
298 + die "Gagal mengatur permission ${PROMPT_FILE}."
299 +
300 + ok "Installed: ${PROMPT_FILE}"
301 + ok "Owner: root:root"
302 + ok "Mode: 0644"
303 +
304 +
305 + # ==============================================================================
306 + # USER PROFILE
307 + # ==============================================================================
308 +
309 + info "7. Konfigurasi user ${CURRENT_USER}"
310 +
311 + USER_PROFILE="${CURRENT_HOME}/.profile"
312 +
313 + # Create profile if it does not exist.
314 + if [ ! -e "$USER_PROFILE" ]; then
315 +
316 + touch "$USER_PROFILE" ||
317 + die "Tidak dapat membuat ${USER_PROFILE}."
318 +
319 + ok "Membuat ${USER_PROFILE}."
320 + fi
321 +
322 +
323 + # Backup only once.
324 + USER_BACKUP="${USER_PROFILE}.before-synology-prompt"
325 +
326 + if [ ! -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 +
333 + else
334 +
335 + ok "Backup user profile sudah ada, tidak ditimpa."
336 + fi
337 +
338 +
339 + # Remove an existing managed block, making installation idempotent.
340 + USER_TMP="${TMP_DIR}/user-profile"
341 +
342 + awk \
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 +
352 + cat >> "$USER_TMP" <<'EOF'
353 +
354 + # >>> Synology SysAdmin Prompt >>>
355 + #
356 + # Start Bash for interactive sessions and load the system-wide prompt.
357 + #
358 + case "$-" 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 + ;;
365 + esac
366 + # <<< Synology SysAdmin Prompt <<<
367 + EOF
368 +
369 +
370 + cp "$USER_TMP" "$USER_PROFILE" ||
371 + die "Gagal memperbarui ${USER_PROFILE}."
372 +
373 + ok "User profile dikonfigurasi."
374 +
375 +
376 + # ==============================================================================
377 + # ROOT PROFILE
378 + # ==============================================================================
379 +
380 + info "8. Konfigurasi root"
381 +
382 + ROOT_PROFILE="/root/.profile"
383 + ROOT_BACKUP="/root/.profile.before-synology-prompt"
384 +
385 + # DSM normally has /root/.profile, but create it safely if absent.
386 + if ! 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}."
395 + fi
396 +
397 +
398 + # Backup only once.
399 + if ! 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 +
406 + else
407 +
408 + ok "Backup root profile sudah ada, tidak ditimpa."
409 + fi
410 +
411 +
412 + ROOT_TMP="${TMP_DIR}/root-profile"
413 +
414 + sudo cat "$ROOT_PROFILE" |
415 + awk \
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 +
425 + cat >> "$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 + #
433 + case "$-" 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 + ;;
441 + esac
442 + # <<< Synology SysAdmin Prompt - Root <<<
443 + EOF
444 +
445 +
446 + sudo cp "$ROOT_TMP" "$ROOT_PROFILE" ||
447 + die "Gagal memperbarui ${ROOT_PROFILE}."
448 +
449 + sudo chown root:root "$ROOT_PROFILE"
450 +
451 + ok "Root profile dikonfigurasi."
452 +
453 +
454 + # ==============================================================================
455 + # VERIFY
456 + # ==============================================================================
457 +
458 + info "9. Verifikasi"
459 +
460 + if sudo test -r "$PROMPT_FILE"; then
461 + ok "${PROMPT_FILE} readable."
462 + else
463 + die "${PROMPT_FILE} tidak dapat dibaca."
464 + fi
465 +
466 +
467 + if grep -Fq "$USER_MARKER_BEGIN" "$USER_PROFILE"; then
468 + ok "User loader ditemukan."
469 + else
470 + die "User loader tidak ditemukan."
471 + fi
472 +
473 +
474 + if sudo grep -Fq "$ROOT_MARKER_BEGIN" "$ROOT_PROFILE"; then
475 + ok "Root loader ditemukan."
476 + else
477 + die "Root loader tidak ditemukan."
478 + fi
479 +
480 +
481 + # ==============================================================================
482 + # DONE
483 + # ==============================================================================
484 +
485 + printf '\n'
486 + printf '====================================================================\n'
487 + printf ' Synology SysAdmin Prompt berhasil di-install\n'
488 + printf '====================================================================\n'
489 + printf '\n'
490 +
491 + printf 'Prompt file:\n'
492 + printf ' %s\n' "$PROMPT_FILE"
493 +
494 + printf '\nUser:\n'
495 + printf ' %s\n' "$CURRENT_USER"
496 +
497 + printf '\nCara menggunakan:\n'
498 + printf '\n'
499 + printf ' 1. Logout dari SSH lalu login kembali.\n'
500 + printf '\n'
501 + printf ' ATAU untuk test tanpa logout:\n'
502 + printf '\n'
503 + printf ' exec bash --noprofile --rcfile %s -i\n' "$PROMPT_FILE"
504 + printf '\n'
505 + printf ' 2. Untuk masuk ke root:\n'
506 + printf '\n'
507 + printf ' sudo -i\n'
508 + printf '\n'
509 + printf ' Root otomatis menggunakan warning palette merah/kuning.\n'
510 + printf '\n'
511 + printf ' 3. Jika icon Powerline/Nerd Font tidak tampil dengan benar,\n'
512 + printf ' gunakan Nerd Font pada terminal CLIENT, bukan pada Synology.\n'
513 + printf '\n'
514 + printf 'Contoh prompt user:\n'
515 + printf '\n'
516 + printf ' ╭  user   NAS   ~   52%%   Selasa, 29 September 2026   14:00:00 \n'
517 + printf ' ╰> $\n'
518 + printf '\n'
519 + printf 'Contoh root:\n'
520 + printf '\n'
521 + printf ' sudo -i\n'
522 + printf '\n'
523 + printf ' ╭  root   NAS   ~   24%%  ...\n'
524 + printf ' ╰> #\n'
525 + printf '\n'
526 + printf 'Backup:\n'
527 + printf ' User : %s\n' "$USER_BACKUP"
528 + printf ' Root : %s\n' "$ROOT_BACKUP"
529 + printf '\n'
530 + printf 'Selesai.\n'
Plus récent Plus ancien