#!/bin/sh export HOME="$(getent passwd "$USER" | cut -d: -f6)" # Configurações de Robustez compatíveis com POSIX sh set -eu # Captura apenas sinais de interrupção do usuário (Ctrl+C) ou do sistema trap 'echo "\n[AVISO] O script foi interrompido pelo usuário!" ; exit 1' INT TERM # Função auxiliar para realizar downloads seguros safe_download() { url="$1" dest="$2" echo "Baixando: $url..." if ! wget -q -c "$url" -O "$dest.tmp"; then echo "[ERRO] Falha ao baixar $url. Abortando para evitar danos ao sistema." rm -f "$dest.tmp" exit 1 fi mv "$dest.tmp" "$dest" } # Adiciona parâmetros de vídeo ao cmdline.txt configurar_cmdline() { cmdline_file="" # Verifica onde o cmdline.txt está localizado no DietPi atual if [ -f "/boot/firmware/cmdline.txt" ]; then cmdline_file="/boot/firmware/cmdline.txt" elif [ -f "/boot/cmdline.txt" ]; then cmdline_file="/boot/cmdline.txt" fi if [ -n "$cmdline_file" ]; then echo "Configurando parâmetros de vídeo em $cmdline_file..." # Lê a primeira linha do arquivo primeira_linha=$(head -n 1 "$cmdline_file") # Evita duplicar a configuração se ela já existir no arquivo if ! echo "$primeira_linha" | grep -q "vc4.force_hotplug=1"; then # Remove espaços no final de forma compatível com POSIX sh usando sed primeira_linha=$(echo "$primeira_linha" | sed 's/[[:space:]]*$//') primeira_linha="$primeira_linha video=HDMI-A-1:D video=HDMI-A-2:D vc4.force_hotplug=1" # Sobrescreve apenas a primeira linha mantendo a integridade do arquivo echo "$primeira_linha" > "$cmdline_file" echo "Parâmetros de vídeo adicionados com sucesso ao cmdline.txt!" else echo "Parâmetros de vídeo já configurados anteriormente no cmdline.txt." fi else echo "[AVISO] Arquivo cmdline.txt não encontrado em /boot ou /boot/firmware." fi } spice() { echo "Iniciando configuração do SPICE..." cd /root # Downloads seguros antes de substituir safe_download "https://primeapp.net.br/dietpi/menu/spice/menu" "menu" safe_download "https://primeapp.net.br/dietpi/openbox/spice/autostart" "autostart" safe_download "https://primeapp.net.br/dietpi/remoto/spice/remoto" "remoto" safe_download "https://primeapp.net.br/dietpi/start/custom.sh" "custom.sh" safe_download "https://primeapp.net.br/dietpi/default/keyboard" "keyboard" safe_download "https://primeapp.net.br/dietpi/config/config.txt" "config.txt" safe_download "https://primeapp.net.br/dietpi/openvpn/ca.crt" "ca.crt" safe_download "https://primeapp.net.br/dietpi/openvpn/LINUX.conf" "LINUX.conf" safe_download "https://primeapp.net.br/dietpi/openvpn/chave.key" "chave.key" safe_download "https://primeapp.net.br/dietpi/wallpaper/wallpaper.png" "wallpaper.png" safe_download "https://primeapp.net.br/dietpi/banner/banner" "banner" safe_download "https://primeapp.net.br/dietpi/banner/.dietpi-banner" ".dietpi-banner" safe_download "https://primeapp.net.br/dietpi/banner/.dietpi-banner_custom" ".dietpi-banner_custom" safe_download "https://primeapp.net.br/dietpi/etc/sysctl.conf" "sysctl.conf" echo "Atualizando pacotes e instalando dependências do SPICE..." apt-get update && apt-get -y dist-upgrade apt-get -y install netcat-traditional openvpn locate xserver-xorg xinit openbox virt-viewer feh \ gstreamer1.0-libav gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad libgstreamer-plugins-base1.0-dev \ libgstreamer1.0-dev gstreamer1.0-alsa systemctl start openvpn-server@server.service || echo "[AVISO] Não foi possível iniciar o OpenVPN." apt-get -y autoremove && apt-get -y clean chmod +x menu remoto custom.sh autostart banner # Estrutura de pastas mkdir -p /etc/prime /var/lib/dietpi/dietpi-autostart if [ -f "/root/conexao" ]; then cp -a conexao /etc/prime/ rm -f /root/conexao else rm -f /root/conexao /etc/prime/conexao fi # Cópia dos arquivos para o sistema cp -a config.txt /boot/ 2>/dev/null || cp -a config.txt /boot/firmware/ 2>/dev/null || true cp -a menu /usr/bin/ cp -a remoto /usr/bin/ cp -a custom.sh /var/lib/dietpi/dietpi-autostart/ cp -a autostart /etc/xdg/openbox/ cp -a keyboard /etc/default/ cp -a .dietpi-banner .dietpi-banner_custom /boot/dietpi/ cp -a ca.crt LINUX.conf chave.key /etc/openvpn/ cp -a sysctl.conf /etc/ cp -a wallpaper.png banner /etc/prime/ chmod 777 /var/lib/dietpi/dietpi-autostart/custom.sh chmod 777 /etc/xdg/openbox/autostart chmod 600 -R /etc/openvpn # Aplica a alteração do cmdline.txt configurar_cmdline # Limpeza local rm -f config.txt menu remoto custom.sh autostart keyboard .dietpi-banner .dietpi-banner_custom conexao ca.crt LINUX.conf chave.key sysctl.conf wallpaper.png banner updatedb echo "SPICE configurado com sucesso!" } rdp() { versao_rdp="" versao_sugerida="" # --- INSTALAÇÃO SILENCIOSA DO GIT COM BARRA DE PROGRESSO --- if ! command -v git > /dev/null 2>&1; then ( echo 20 apt-get update > /dev/null 2>&1 echo 60 apt-get -y install git > /dev/null 2>&1 echo 100 ) | whiptail --title "Preparando Ambiente" --gauge "Sincronizando índices e instalando dependências necessárias..." 8 60 0 fi # --- IDENTIFICAÇÃO AUTOMÁTICA DA ÚLTIMA VERSÃO ESTÁVEL --- ( echo 50 # Captura as tags, filtra apenas números/pontos estáveis, ordena e pega a última detectada=$(git -c net.connectTimeout=5 ls-remote --tags https://github.com/FreeRDP/FreeRDP.git | \ cut -d'/' -f3 | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | tail -n1) # Caso falhe por rede, define um fallback padrão seguro if [ -z "$detectada" ]; then detectada="3.30.0" fi echo "$detectada" > /tmp/freerdp_detected_version echo 100 ) | whiptail --title "Buscando Versões" --gauge "Verificando a versão estável mais recente no GitHub..." 8 60 0 versao_sugerida=$(cat /tmp/freerdp_detected_version) rm -f /tmp/freerdp_detected_version # Loop para solicitar e validar a versão do FreeRDP via Git while true; do tmp_file=$(mktemp) # O campo agora vem pré-preenchido com a $versao_sugerida encontrada if ! whiptail --title "Versão do FreeRDP" --inputbox "Digite a versão/branch do FreeRDP que deseja instalar:" 10 60 "$versao_sugerida" 2>"$tmp_file"; then echo "Operação cancelada pelo usuário." rm -f "$tmp_file" exit 0 fi versao_rdp=$(cat "$tmp_file" | xargs) rm -f "$tmp_file" if [ -z "$versao_rdp" ]; then whiptail --title "Erro" --msgbox "A versão não pode ser vazia!" 8 40 continue fi # --- TELA DE AGUARDE COM TIMEOUT REAL --- tmp_status=$(mktemp) ( echo 20 if git -c net.connectTimeout=5 ls-remote --exit-code https://github.com/FreeRDP/FreeRDP.git "$versao_rdp" >/dev/null 2>&1 || \ git -c net.connectTimeout=5 ls-remote --exit-code https://github.com/FreeRDP/FreeRDP.git "refs/heads/$versao_rdp" >/dev/null 2>&1; then echo 0 > "$tmp_status" else echo 1 > "$tmp_status" fi echo 100 ) | whiptail --title "Conectando ao GitHub" --gauge "Conectando ao repositório oficial...\nVerificando se a versão '$versao_rdp' existe..." 8 60 0 checa_versao=$(cat "$tmp_status") rm -f "$tmp_status" if [ "$checa_versao" = "0" ]; then break else whiptail --title "Versão Inválida" --msgbox "A versão ou branch '$versao_rdp' não foi encontrada no GitHub do FreeRDP.\n\nPor favor, tente novamente." 10 60 fi done echo "Iniciando configuração do RDP..." cd /root # Downloads seguros antes de substituir safe_download "https://primeapp.net.br/dietpi/menu/rdp/menu" "menu" safe_download "https://primeapp.net.br/dietpi/start/custom.sh" "custom.sh" safe_download "https://primeapp.net.br/dietpi/default/keyboard" "keyboard" safe_download "https://primeapp.net.br/dietpi/config/config.txt" "config.txt" safe_download "https://primeapp.net.br/dietpi/openvpn/ca.crt" "ca.crt" safe_download "https://primeapp.net.br/dietpi/openvpn/LINUX.conf" "LINUX.conf" safe_download "https://primeapp.net.br/dietpi/openvpn/chave.key" "chave.key" safe_download "https://primeapp.net.br/dietpi/banner/banner" "banner" safe_download "https://primeapp.net.br/dietpi/banner/.dietpi-banner" ".dietpi-banner" safe_download "https://primeapp.net.br/dietpi/banner/.dietpi-banner_custom" ".dietpi-banner_custom" safe_download "https://primeapp.net.br/dietpi/etc/sysctl.conf" "sysctl.conf" echo "Atualizando pacotes e instalando dependências de compilação..." apt-get -y dist-upgrade # Dependências de compilação do FreeRDP apt-get -y install autotools-dev libjpeg-dev libudev-dev libdbus-glib-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev zlib1g-dev libglib2.0-dev libxkbcommon-dev libcunit1-dev \ doxygen build-essential debhelper cdbs dpkg-dev cmake cmake-curses-gui clang-format ccache opencl-c-headers ocl-icd-opencl-dev libmp3lame-dev libopus-dev libsoxr-dev libsdl2-dev libxfixes-dev \ libpam0g-dev pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libopenh264-dev libfaac-dev \ libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libgsm1-dev libusb-1.0-0-dev uuid-dev libxml2-dev libfaad-dev libsdl2-ttf-dev libcjson-dev libxcursor-dev \ liburiparser-dev libkrb5-dev libsystemd-dev libfuse3-dev libswscale-dev libcairo2-dev libavutil-dev libavcodec-dev libswresample-dev libpkcs11-helper1-dev libusb-dev libxv-dev libmbedtls-dev echo "Limpando instalações anteriores do FreeRDP para evitar conflitos..." rm -f /usr/local/bin/xfreerdp /usr/local/bin/wlfreerdp /usr/local/bin/sdlfreerdp rm -rf /usr/local/lib/libfreerdp* /usr/local/lib/libwinpr* rm -rf /usr/local/lib/freerdp3 /usr/local/lib/freerdp2 rm -rf /usr/local/include/freerdp3 /usr/local/include/winpr3 # Atualiza o cache do linker do sistema para esquecer as bibliotecas antigas ldconfig # Clone e Compilação do FreeRDP rm -rf /root/FreeRDP git clone https://github.com/FreeRDP/FreeRDP.git --branch "$versao_rdp" /root/FreeRDP cd /root/FreeRDP cmake -DALLOW_IN_SOURCE_BUILD=ON -DCHANNEL_URBDRC=ON -DWITH_FFMPEG=ON -DWITH_SWSCALE=ON -DWITH_DSP_FFMPEG=ON -DWITH_PCSC=ON -DWITH_OPENH264=ON -DWITH_OPENCL=ON -DWITH_GSM=ON -DWITH_LAME=ON -DWITH_FAAD2=ON -DWITH_FAAC=ON -DWITH_SOXR=ON -DWITH_X11=ON . # Compila usando múltiplos núcleos make -j"$(nproc)" make install cd /root && rm -rf FreeRDP # Purga de dependências de compilação desnecessárias apt-get -y remove --purge git autotools-dev libjpeg-dev libudev-dev libdbus-glib-1-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev zlib1g-dev libglib2.0-dev libxkbcommon-dev libcunit1-dev \ doxygen build-essential debhelper cdbs dpkg-dev cmake cmake-curses-gui clang-format ccache opencl-c-headers ocl-icd-opencl-dev libmp3lame-dev libopus-dev libsoxr-dev libsdl2-dev libxfixes-dev \ libpam0g-dev pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libopenh264-dev libfaac-dev \ libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libgsm1-dev libusb-1.0-0-dev uuid-dev libxml2-dev libfaad-dev libsdl2-ttf-dev libcjson-dev libxcursor-dev \ liburiparser-dev libkrb5-dev libsystemd-dev libfuse3-dev libswscale-dev libcairo2-dev libavutil-dev libavcodec-dev libswresample-dev libpkcs11-helper1-dev libusb-dev libxv-dev libmbedtls-dev # Dependências de execução apt-get -y install alsa-utils netcat-traditional openvpn libwinpr3-3 libfuse3-4 locate xserver-xorg xinit libcjson1 liburiparser1 libasound2t64 libusb-1.0-0 pcscd libpcsclite1 pcsc-tools libccid \ libgdbm6t64 libjpeg62-turbo libpng16-16t64 opensc libengine-pkcs11-openssl libopenh264-8 libflac14 libcjson1 liburiparser1 libxinerama1 libxcursor1 libxi6 libcups2t64 libmpg123-0t64 \ libpulse0 libsndfile1 libswscale8 libavcodec61 libsndio7.0 systemctl start openvpn-server@server.service || echo "[AVISO] Não foi possível iniciar o OpenVPN." apt-get -y autoremove && apt-get -y clean chmod +x menu custom.sh banner # Configuração de pastas mkdir -p /etc/prime /var/lib/dietpi/dietpi-autostart if [ -f "/root/conexao" ]; then cp -a conexao /etc/prime/ rm -f /root/conexao else rm -f /root/conexao /etc/prime/conexao fi # Cópia dos arquivos para o sistema cp -a config.txt /boot/ 2>/dev/null || cp -a config.txt /boot/firmware/ 2>/dev/null || true cp -a menu /usr/bin/ cp -a custom.sh /var/lib/dietpi/dietpi-autostart/ cp -a keyboard /etc/default/ cp -a .dietpi-banner .dietpi-banner_custom /boot/dietpi/ cp -a ca.crt LINUX.conf chave.key /etc/openvpn/ cp -a sysctl.conf /etc/ cp -a banner /etc/prime/ chmod 777 /var/lib/dietpi/dietpi-autostart/custom.sh chmod 600 -R /etc/openvpn # Aplica a alteração do cmdline.txt configurar_cmdline # Limpeza local rm -f config.txt menu custom.sh keyboard .dietpi-banner .dietpi-banner_custom conexao ca.crt LINUX.conf chave.key sysctl.conf banner updatedb echo "RDP configurado e compilado com sucesso usando a versão $versao_rdp!" } # --- FLUXO DO MENU PRINCIPAL --- tmp_menu=$(mktemp) if ! whiptail --title "Menu" --menu "Escolha uma das opções abaixo:" 15 50 4 \ "1" "SPICE" \ "2" "RDP" 2>"$tmp_menu"; then rm -f "$tmp_menu" exit 0 fi item=$(cat "$tmp_menu") rm -f "$tmp_menu" if [ "$item" = "1" ]; then if [ -f "/etc/prime/conexao" ]; then tmp_resp=$(mktemp) if ! whiptail --title "Conexão Remota" --menu "Existe um arquivo de conexão. Deseja manter?" 15 60 6 \ "1" "Sim" \ "2" "Não" 2>"$tmp_resp"; then rm -f "$tmp_resp" exit 0 fi resposta=$(cat "$tmp_resp") rm -f "$tmp_resp" case "$resposta" in 1) cp -a /etc/prime/conexao /root spice ;; 2) rm -f /etc/prime/conexao spice ;; *) whiptail --title "Aviso" --msgbox "Operação Cancelada pelo Usuário." 8 78 ;; esac else spice fi elif [ "$item" = "2" ]; then if [ -f "/etc/prime/conexao" ]; then tmp_resp=$(mktemp) if ! whiptail --title "Conexão Remota" --menu "Existe um arquivo de conexão. Deseja manter?" 15 60 6 \ "1" "Sim" \ "2" "Não" 2>"$tmp_resp"; then rm -f "$tmp_resp" exit 0 fi resposta=$(cat "$tmp_resp") rm -f "$tmp_resp" case "$resposta" in 1) cp -a /etc/prime/conexao /root rdp ;; 2) rm -f /etc/prime/conexao rdp ;; *) whiptail --title "Aviso" --msgbox "Operação Cancelada pelo Usuário." 8 78 ;; esac else rdp fi fi # === AUTOEXCLUSÃO === rm -f -- "$0"