install-synology-prompt.sh
· 13 KiB · Bash
Orginalformat
#!/usr/bin/env bash
#
# install-synology-prompt.sh
#
# Universal installer for Synology SysAdmin Prompt.
#
# -------------------------------------------------------------------------------
# USAGE
# -------------------------------------------------------------------------------
#
# Recommended:
#
# bash install-synology-prompt.sh
#
# Do NOT normally run this installer using:
#
# sudo bash install-synology-prompt.sh
#
# The script will request sudo privileges itself when required.
#
#
# What this installer does:
#
# 1. Verifies that the machine looks like Synology DSM.
# 2. Verifies that Bash is available.
# 3. Downloads synology-prompt.sh.
# 4. Installs it as:
#
# /etc/synology-prompt.sh
#
# with:
#
# owner: root
# group: root
# mode : 0644
#
# 5. Adds a small loader to the current user's ~/.profile.
# 6. Preserves existing user configuration.
# 7. Adds root integration to /root/.profile.
# 8. Preserves Synology's original root profile.
# 9. Makes "sudo -i" use Bash + the same prompt.
#
#
# Requirements:
#
# - Synology DSM
# - Bash
# - sudo access
# - wget or curl
#
#
# Nerd Font:
#
# Nerd Font is NOT installed on Synology.
# Install/use a Nerd Font in your SSH client or terminal.
#
# -------------------------------------------------------------------------------
set -u
# ==============================================================================
# CONFIGURATION
# ==============================================================================
PROMPT_URL="https://gist.darto.id/dartokloning/d0bd9f4e277a4242acbc7fb153c9a440/download/HEAD/synology-prompt.sh"
PROMPT_FILE="/etc/synology-prompt.sh"
USER_MARKER_BEGIN="# >>> Synology SysAdmin Prompt >>>"
USER_MARKER_END="# <<< Synology SysAdmin Prompt <<<"
ROOT_MARKER_BEGIN="# >>> Synology SysAdmin Prompt - Root >>>"
ROOT_MARKER_END="# <<< Synology SysAdmin Prompt - Root <<<"
# ==============================================================================
# OUTPUT HELPERS
# ==============================================================================
info()
{
printf '\n== %s ==\n' "$1"
}
ok()
{
printf ' -> %s\n' "$1"
}
warn()
{
printf 'WARNING: %s\n' "$1" >&2
}
die()
{
printf 'ERROR: %s\n' "$1" >&2
exit 1
}
# ==============================================================================
# DETECT CURRENT USER
# ==============================================================================
# The installer is intended to be launched as the normal DSM user.
if [ "$(id -u)" -eq 0 ]; then
die "Jalankan installer sebagai user DSM biasa, bukan dengan 'sudo bash'. Gunakan: bash install-synology-prompt.sh"
fi
CURRENT_USER="$(id -un)"
CURRENT_HOME="${HOME:-}"
[ -n "$CURRENT_HOME" ] ||
die "HOME untuk user ${CURRENT_USER} tidak ditemukan."
[ -d "$CURRENT_HOME" ] ||
die "Home directory tidak ditemukan: ${CURRENT_HOME}"
# ==============================================================================
# VERIFY SYNOLOGY DSM
# ==============================================================================
info "1. Memeriksa Synology DSM"
if [ ! -f /etc.defaults/VERSION ]; then
die "File /etc.defaults/VERSION tidak ditemukan. Mesin ini tidak terlihat seperti Synology DSM."
fi
DSM_VERSION="$(
sed -n 's/^productversion="\([^"]*\)".*/\1/p' \
/etc.defaults/VERSION 2>/dev/null |
head -n 1
)"
DSM_BUILD="$(
sed -n 's/^buildnumber="\([^"]*\)".*/\1/p' \
/etc.defaults/VERSION 2>/dev/null |
head -n 1
)"
ok "Synology DSM terdeteksi."
if [ -n "$DSM_VERSION" ]; then
ok "DSM version: ${DSM_VERSION}"
fi
if [ -n "$DSM_BUILD" ]; then
ok "DSM build: ${DSM_BUILD}"
fi
ok "User: ${CURRENT_USER}"
ok "Home: ${CURRENT_HOME}"
# ==============================================================================
# VERIFY BASH
# ==============================================================================
info "2. Memeriksa Bash"
command -v bash >/dev/null 2>&1 ||
die "Bash tidak ditemukan."
BASH_PATH="$(command -v bash)"
ok "Bash ditemukan: ${BASH_PATH}"
BASH_VERSION_TEXT="$(
bash --version 2>/dev/null |
head -n 1
)"
[ -n "$BASH_VERSION_TEXT" ] &&
ok "$BASH_VERSION_TEXT"
# ==============================================================================
# VERIFY SUDO
# ==============================================================================
info "3. Memeriksa sudo"
command -v sudo >/dev/null 2>&1 ||
die "sudo tidak ditemukan."
printf ' -> Meminta privilege sudo...\n'
sudo -v ||
die "Tidak mendapatkan privilege sudo."
ok "sudo siap digunakan."
# ==============================================================================
# VERIFY DOWNLOAD TOOL
# ==============================================================================
info "4. Memeriksa downloader"
if command -v wget >/dev/null 2>&1; then
DOWNLOAD_TOOL="wget"
ok "Menggunakan wget."
elif command -v curl >/dev/null 2>&1; then
DOWNLOAD_TOOL="curl"
ok "Menggunakan curl."
else
die "wget maupun curl tidak ditemukan."
fi
# ==============================================================================
# VERIFY URL
# ==============================================================================
if [ "$PROMPT_URL" = "PASTE_RAW_GIST_URL_HERE" ] ||
[ -z "$PROMPT_URL" ]; then
die "PROMPT_URL belum diisi. Edit installer dan isi URL raw/download synology-prompt.sh dari Gist."
fi
# ==============================================================================
# TEMPORARY DIRECTORY
# ==============================================================================
TMP_DIR="$(mktemp -d)" ||
die "Tidak dapat membuat temporary directory."
TMP_PROMPT="${TMP_DIR}/synology-prompt.sh"
cleanup()
{
rm -rf "$TMP_DIR"
}
trap cleanup EXIT
# ==============================================================================
# DOWNLOAD PROMPT
# ==============================================================================
info "5. Download synology-prompt.sh"
if [ "$DOWNLOAD_TOOL" = "wget" ]; then
wget -q -O "$TMP_PROMPT" "$PROMPT_URL" ||
die "Gagal download: ${PROMPT_URL}"
else
curl -fsSL "$PROMPT_URL" -o "$TMP_PROMPT" ||
die "Gagal download: ${PROMPT_URL}"
fi
[ -s "$TMP_PROMPT" ] ||
die "File hasil download kosong."
# Basic sanity check.
if ! grep -q 'Synology DSM SysAdmin Prompt\|Universal Powerline-style SysAdmin prompt' "$TMP_PROMPT"; then
warn "File berhasil didownload tetapi signature prompt tidak ditemukan."
warn "Periksa PROMPT_URL sebelum melanjutkan."
exit 1
fi
ok "Prompt berhasil didownload."
# ==============================================================================
# INSTALL SYSTEM-WIDE PROMPT
# ==============================================================================
info "6. Install system-wide prompt"
sudo cp "$TMP_PROMPT" "$PROMPT_FILE" ||
die "Gagal menyalin prompt ke ${PROMPT_FILE}."
sudo chown root:root "$PROMPT_FILE" ||
die "Gagal mengatur ownership ${PROMPT_FILE}."
sudo chmod 0644 "$PROMPT_FILE" ||
die "Gagal mengatur permission ${PROMPT_FILE}."
ok "Installed: ${PROMPT_FILE}"
ok "Owner: root:root"
ok "Mode: 0644"
# ==============================================================================
# USER PROFILE
# ==============================================================================
info "7. Konfigurasi user ${CURRENT_USER}"
USER_PROFILE="${CURRENT_HOME}/.profile"
# Create profile if it does not exist.
if [ ! -e "$USER_PROFILE" ]; then
touch "$USER_PROFILE" ||
die "Tidak dapat membuat ${USER_PROFILE}."
ok "Membuat ${USER_PROFILE}."
fi
# Backup only once.
USER_BACKUP="${USER_PROFILE}.before-synology-prompt"
if [ ! -e "$USER_BACKUP" ]; then
cp -a "$USER_PROFILE" "$USER_BACKUP" ||
die "Gagal membuat backup ${USER_BACKUP}."
ok "Backup dibuat: ${USER_BACKUP}"
else
ok "Backup user profile sudah ada, tidak ditimpa."
fi
# Remove an existing managed block, making installation idempotent.
USER_TMP="${TMP_DIR}/user-profile"
awk \
-v begin="$USER_MARKER_BEGIN" \
-v end="$USER_MARKER_END" '
$0 == begin { skip=1; next }
$0 == end { skip=0; next }
!skip { print }
' "$USER_PROFILE" > "$USER_TMP" ||
die "Gagal memproses ${USER_PROFILE}."
cat >> "$USER_TMP" <<'EOF'
# >>> Synology SysAdmin Prompt >>>
#
# Start Bash for interactive sessions and load the system-wide prompt.
#
case "$-" in
*i*)
if [ -z "${SYNO_USER_PROMPT:-}" ]; then
export SYNO_USER_PROMPT=1
exec bash --noprofile --rcfile /etc/synology-prompt.sh -i
fi
;;
esac
# <<< Synology SysAdmin Prompt <<<
EOF
cp "$USER_TMP" "$USER_PROFILE" ||
die "Gagal memperbarui ${USER_PROFILE}."
ok "User profile dikonfigurasi."
# ==============================================================================
# ROOT PROFILE
# ==============================================================================
info "8. Konfigurasi root"
ROOT_PROFILE="/root/.profile"
ROOT_BACKUP="/root/.profile.before-synology-prompt"
# DSM normally has /root/.profile, but create it safely if absent.
if ! sudo test -e "$ROOT_PROFILE"; then
sudo touch "$ROOT_PROFILE" ||
die "Gagal membuat ${ROOT_PROFILE}."
sudo chown root:root "$ROOT_PROFILE"
sudo chmod 0600 "$ROOT_PROFILE"
ok "Membuat ${ROOT_PROFILE}."
fi
# Backup only once.
if ! sudo test -e "$ROOT_BACKUP"; then
sudo cp -a "$ROOT_PROFILE" "$ROOT_BACKUP" ||
die "Gagal membuat backup ${ROOT_BACKUP}."
ok "Backup dibuat: ${ROOT_BACKUP}"
else
ok "Backup root profile sudah ada, tidak ditimpa."
fi
ROOT_TMP="${TMP_DIR}/root-profile"
sudo cat "$ROOT_PROFILE" |
awk \
-v begin="$ROOT_MARKER_BEGIN" \
-v end="$ROOT_MARKER_END" '
$0 == begin { skip=1; next }
$0 == end { skip=0; next }
!skip { print }
' > "$ROOT_TMP" ||
die "Gagal memproses ${ROOT_PROFILE}."
cat >> "$ROOT_TMP" <<'EOF'
# >>> Synology SysAdmin Prompt - Root >>>
#
# Preserve Synology's original root initialization above.
# For interactive root login (for example: sudo -i),
# replace ash with Bash and load the system-wide prompt.
#
case "$-" in
*i*)
if [ -z "${SYNO_ROOT_PROMPT:-}" ]; then
export SYNO_ROOT_PROMPT=1
cd /root 2>/dev/null || true
exec bash --noprofile --rcfile /etc/synology-prompt.sh -i
fi
;;
esac
# <<< Synology SysAdmin Prompt - Root <<<
EOF
sudo cp "$ROOT_TMP" "$ROOT_PROFILE" ||
die "Gagal memperbarui ${ROOT_PROFILE}."
sudo chown root:root "$ROOT_PROFILE"
ok "Root profile dikonfigurasi."
# ==============================================================================
# VERIFY
# ==============================================================================
info "9. Verifikasi"
if sudo test -r "$PROMPT_FILE"; then
ok "${PROMPT_FILE} readable."
else
die "${PROMPT_FILE} tidak dapat dibaca."
fi
if grep -Fq "$USER_MARKER_BEGIN" "$USER_PROFILE"; then
ok "User loader ditemukan."
else
die "User loader tidak ditemukan."
fi
if sudo grep -Fq "$ROOT_MARKER_BEGIN" "$ROOT_PROFILE"; then
ok "Root loader ditemukan."
else
die "Root loader tidak ditemukan."
fi
# ==============================================================================
# DONE
# ==============================================================================
printf '\n'
printf '====================================================================\n'
printf ' Synology SysAdmin Prompt berhasil di-install\n'
printf '====================================================================\n'
printf '\n'
printf 'Prompt file:\n'
printf ' %s\n' "$PROMPT_FILE"
printf '\nUser:\n'
printf ' %s\n' "$CURRENT_USER"
printf '\nCara menggunakan:\n'
printf '\n'
printf ' 1. Logout dari SSH lalu login kembali.\n'
printf '\n'
printf ' ATAU untuk test tanpa logout:\n'
printf '\n'
printf ' exec bash --noprofile --rcfile %s -i\n' "$PROMPT_FILE"
printf '\n'
printf ' 2. Untuk masuk ke root:\n'
printf '\n'
printf ' sudo -i\n'
printf '\n'
printf ' Root otomatis menggunakan warning palette merah/kuning.\n'
printf '\n'
printf ' 3. Jika icon Powerline/Nerd Font tidak tampil dengan benar,\n'
printf ' gunakan Nerd Font pada terminal CLIENT, bukan pada Synology.\n'
printf '\n'
printf 'Contoh prompt user:\n'
printf '\n'
printf ' ╭ user NAS ~ 52%% Selasa, 29 September 2026 14:00:00 \n'
printf ' ╰> $\n'
printf '\n'
printf 'Contoh root:\n'
printf '\n'
printf ' sudo -i\n'
printf '\n'
printf ' ╭ root NAS ~ 24%% ...\n'
printf ' ╰> #\n'
printf '\n'
printf 'Backup:\n'
printf ' User : %s\n' "$USER_BACKUP"
printf ' Root : %s\n' "$ROOT_BACKUP"
printf '\n'
printf 'Selesai.\n'
| 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' |