#!/bin/sh # ============================================================================ # Instalador web do cpanel-bootstrap (RapidCloud) # ---------------------------------------------------------------------------- # Este wrapper PODE ser executado via pipe — ele baixa o script principal # para o disco (exigência da fase 2) e o executa em seguida: # # curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL \ # https://get.rapidcloud.com.br/install.sh | bash # # Para usar outra origem, informe a URL e o SHA-256 ao bash que recebe o pipe: # curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL \ # https://get.rapidcloud.com.br/install.sh | \ # CPANEL_BOOTSTRAP_URL=https://outro-host/cpanel-bootstrap.sh \ # CPANEL_BOOTSTRAP_SHA256=sha256_com_64_caracteres bash # # O SHA-256 e opcional para a origem oficial e obrigatorio para outra origem. # Overrides do bootstrap tambem devem ser informados ao bash que recebe o pipe: # curl --proto '=https' --proto-redir '=https' --tlsv1.2 -fsSL \ # https://get.rapidcloud.com.br/install.sh | SSH_PORT=2222 bash # ============================================================================ set -eu DEFAULT_URL="https://get.rapidcloud.com.br/cpanel-bootstrap.sh" URL="${CPANEL_BOOTSTRAP_URL:-$DEFAULT_URL}" EXPECTED_SHA256="${CPANEL_BOOTSTRAP_SHA256:-}" ALLOW_INSECURE="${CPANEL_BOOTSTRAP_ALLOW_INSECURE:-0}" DEST="/root/cpanel-bootstrap.sh" MAX_BYTES=5242880 TMP_FILE="" die() { echo "ERRO: $*" >&2 exit 1 } cleanup() { if [ -n "$TMP_FILE" ] && [ -e "$TMP_FILE" ]; then rm -f "$TMP_FILE" fi } trap cleanup 0 trap 'exit 129' HUP trap 'exit 130' INT trap 'exit 143' TERM if [ "$(id -u)" -ne 0 ]; then die "execute como root." fi umask 077 case "$URL" in *[![:print:]]*|*[[:space:]]*) die "CPANEL_BOOTSTRAP_URL nao pode conter espacos nem caracteres de controle." ;; *\"*|*\\*) die "CPANEL_BOOTSTRAP_URL nao pode conter aspas nem barras invertidas." ;; esac case "$ALLOW_INSECURE" in 0|1) ;; *) die "CPANEL_BOOTSTRAP_ALLOW_INSECURE aceita somente 0 ou 1." ;; esac CUSTOM_URL=0 if [ "$URL" != "$DEFAULT_URL" ]; then CUSTOM_URL=1 fi if [ "$CUSTOM_URL" -eq 1 ] && [ -z "$EXPECTED_SHA256" ]; then die "CPANEL_BOOTSTRAP_SHA256 e obrigatorio ao usar CPANEL_BOOTSTRAP_URL customizada." fi if [ -n "$EXPECTED_SHA256" ]; then if [ "${#EXPECTED_SHA256}" -ne 64 ]; then die "CPANEL_BOOTSTRAP_SHA256 deve conter exatamente 64 caracteres hexadecimais." fi case "$EXPECTED_SHA256" in *[!0-9A-Fa-f]*) die "CPANEL_BOOTSTRAP_SHA256 contem caracteres invalidos." ;; esac command -v sha256sum >/dev/null 2>&1 || die "sha256sum nao foi encontrado." EXPECTED_SHA256=$(printf '%s' "$EXPECTED_SHA256" | tr '[:upper:]' '[:lower:]') fi case "$URL" in https://*) DOWNLOAD_SCHEME="https" ;; http://*) if [ "$ALLOW_INSECURE" -ne 1 ]; then die "a URL deve usar HTTPS. Para um laboratorio HTTP, defina CPANEL_BOOTSTRAP_ALLOW_INSECURE=1 e informe o SHA-256." fi DOWNLOAD_SCHEME="http" echo "AVISO: download HTTP liberado explicitamente; a integridade sera validada pelo SHA-256." >&2 ;; *) die "CPANEL_BOOTSTRAP_URL deve usar HTTPS (ou HTTP com liberacao explicita)." ;; esac command -v curl >/dev/null 2>&1 || die "curl nao foi encontrado." command -v bash >/dev/null 2>&1 || die "bash nao foi encontrado." command -v mktemp >/dev/null 2>&1 || die "mktemp nao foi encontrado." command -v prlimit >/dev/null 2>&1 || die "prlimit nao foi encontrado (pacote util-linux)." TMP_FILE=$(mktemp /root/.cpanel-bootstrap.XXXXXX) || die "nao foi possivel criar o arquivo temporario em /root." chmod 0600 "$TMP_FILE" || die "nao foi possivel proteger o arquivo temporario." if [ "$CUSTOM_URL" -eq 1 ]; then echo "Baixando cpanel-bootstrap.sh de uma origem customizada (URL ocultada do log)." else echo "Baixando cpanel-bootstrap.sh da origem oficial RapidCloud." fi if [ "$DOWNLOAD_SCHEME" = "https" ]; then printf 'url = "%s"\n' "$URL" | \ prlimit --core=0:0 --fsize="${MAX_BYTES}:${MAX_BYTES}" -- curl -q --config - \ --fail --silent --show-error --location \ --proto '=https' --proto-redir '=https' --tlsv1.2 \ --connect-timeout 15 --max-time 300 \ --retry 3 --retry-delay 2 --retry-max-time 300 --retry-all-errors \ --max-filesize "$MAX_BYTES" \ --output "$TMP_FILE" \ || die "falha ao baixar o cpanel-bootstrap.sh." else printf 'url = "%s"\n' "$URL" | \ prlimit --core=0:0 --fsize="${MAX_BYTES}:${MAX_BYTES}" -- curl -q --config - \ --fail --silent --show-error --location \ --proto '=http,https' --proto-redir '=http,https' \ --connect-timeout 15 --max-time 300 \ --retry 3 --retry-delay 2 --retry-max-time 300 --retry-all-errors \ --max-filesize "$MAX_BYTES" \ --output "$TMP_FILE" \ || die "falha ao baixar o cpanel-bootstrap.sh." fi DOWNLOADED_BYTES=$(wc -c < "$TMP_FILE" | tr -d '[:space:]') case "$DOWNLOADED_BYTES" in ''|*[!0-9]*) die "nao foi possivel validar o tamanho do arquivo baixado." ;; esac if [ "$DOWNLOADED_BYTES" -eq 0 ]; then die "o arquivo baixado esta vazio." fi if [ "$DOWNLOADED_BYTES" -gt "$MAX_BYTES" ]; then die "o arquivo baixado excede o limite de $MAX_BYTES bytes." fi # Sanidade: rejeita paginas de erro e outros conteudos antes de chamar o bash. if ! head -n 1 "$TMP_FILE" | grep -Eq '^#!.*[/ ]bash([[:space:]]|$)'; then die "o conteudo baixado nao parece ser o cpanel-bootstrap.sh (confira a URL)." fi if [ -n "$EXPECTED_SHA256" ]; then ACTUAL_SHA256=$(sha256sum "$TMP_FILE") ACTUAL_SHA256=${ACTUAL_SHA256%% *} if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then die "SHA-256 invalido (esperado $EXPECTED_SHA256, recebido $ACTUAL_SHA256)." fi fi if ! bash -n "$TMP_FILE"; then die "o script baixado possui erro de sintaxe e nao sera instalado." fi chmod 0700 "$TMP_FILE" || die "nao foi possivel ajustar as permissoes do script." mv -fT "$TMP_FILE" "$DEST" || die "nao foi possivel instalar o script em $DEST." TMP_FILE="" if [ "$#" -eq 0 ]; then echo "Script validado e salvo em ${DEST} — iniciando a fase 1..." else echo "Script validado e salvo em ${DEST} — repassando a opção solicitada..." fi echo "" exec bash "$DEST" "$@"