#!/usr/bin/env bash # install-telegram.sh — Install Telegram Desktop from the latest official Linux build. # Hardened: official download endpoint, arch-aware, idempotent, --dry-run. set -euo pipefail IFS=$'\n\t' readonly SCRIPT_NAME="${0##*/}" DRY_RUN=0 DOWNLOAD_URL="https://telegram.org/dl/desktop/linux" usage() { cat <&2; exit 1; } run() { if (( DRY_RUN )); then printf ' DRY-RUN: %s\n' "$*"; else eval "$@"; fi; } trap 'rc=$?; (( rc )) && printf "\033[1;31m[%s] failed at line %s (exit %d)\033[0m\n" "${SCRIPT_NAME%.sh}" "$LINENO" "$rc" >&2' ERR while (( $# )); do case "$1" in --dry-run) DRY_RUN=1 ;; -h|--help) usage; exit 0 ;; *) die "Unknown argument: $1 (try --help)" ;; esac shift done (( EUID == 0 )) || die "Must run as root. Try: sudo $SCRIPT_NAME" [[ -r /etc/os-release ]] || die "/etc/os-release not found." # shellcheck disable=SC1091 . /etc/os-release case "${ID:-}:${ID_LIKE:-}" in *ubuntu*|*debian*) : ;; *) die "Unsupported distro: ${PRETTY_NAME:-unknown}." ;; esac MACHINE="$(uname -m)" case "$MACHINE" in x86_64|amd64) : ;; *) die "Telegram's official Linux desktop tarball targets x86_64 (detected: $MACHINE)." ;; esac log "Detected: ${PRETTY_NAME:-unknown}, arch: $MACHINE" export DEBIAN_FRONTEND=noninteractive log "Installing prerequisites..." run "apt-get update -qq" run "apt-get install -y curl ca-certificates tar xz-utils desktop-file-utils hicolor-icon-theme" STAGE="$(mktemp -d -t telegram.XXXXXX)" trap 'rm -rf "$STAGE"' EXIT ARCHIVE="$STAGE/telegram.tar.xz" log "Downloading latest Telegram Desktop..." run "curl -fL -o '$ARCHIVE' '$DOWNLOAD_URL'" if (( DRY_RUN )); then printf ' DRY-RUN: extract %s\n' "$ARCHIVE" printf ' DRY-RUN: install Telegram to /opt/Telegram\n' printf ' DRY-RUN: create /usr/local/bin/telegram-desktop symlink and desktop launcher\n' log "Done." exit 0 fi log "Extracting Telegram..." run "tar -xJf '$ARCHIVE' -C '$STAGE'" [[ -x "$STAGE/Telegram/Telegram" ]] || die "Unexpected archive layout: Telegram/Telegram not found." log "Installing Telegram..." run "rm -rf /opt/Telegram" run "install -d -m 0755 /opt" run "cp -a '$STAGE/Telegram' /opt/Telegram" run "ln -sfn /opt/Telegram/Telegram /usr/local/bin/telegram-desktop" run "install -d -m 0755 /usr/share/applications /usr/share/icons/hicolor/256x256/apps" if [[ -f /opt/Telegram/telegram.png ]]; then run "install -m 0644 /opt/Telegram/telegram.png /usr/share/icons/hicolor/256x256/apps/telegram.png" fi cat >/usr/share/applications/telegram-desktop.desktop <<'EOF' [Desktop Entry] Type=Application Name=Telegram Desktop GenericName=Messenger Comment=Official Telegram desktop messaging app Exec=/opt/Telegram/Telegram -- %u Icon=telegram Terminal=false Categories=Network;InstantMessaging;Chat; MimeType=x-scheme-handler/tg; StartupNotify=false StartupWMClass=TelegramDesktop Keywords=telegram;chat;messenger; EOF run "desktop-file-validate /usr/share/applications/telegram-desktop.desktop" run "update-desktop-database /usr/share/applications" run "gtk-update-icon-cache -f -t /usr/share/icons/hicolor >/dev/null 2>&1 || true" if command -v xdg-mime >/dev/null 2>&1; then run "xdg-mime default telegram-desktop.desktop x-scheme-handler/tg || true" fi log "Installed: $(/opt/Telegram/Telegram --version 2>/dev/null || echo Telegram Desktop)" log "Done."