#!/bin/bash # ============================================================================== # SCRIPT PARA ADICIONAR O SNIPPET DE ERROS PERSONALIZADOS # # Descrição: Este script percorre todos os ficheiros de configuração de site # em /etc/nginx/sites-available/ e adiciona a diretiva # 'include /etc/nginx/snippets/custom_errors.conf;' aos blocos # de servidor HTTPS (porta 443). # ============================================================================== set -e # --- Variáveis de Configuração --- SITES_DIR="/etc/nginx/sites-available" SNIPPET_PATH="/etc/nginx/snippets/custom_errors.conf" SNIPPET_LINE="include ${SNIPPET_PATH}; # Carrega as páginas de erro personalizadas" # --- Funções de Ajuda --- info() { echo -e "\e[32m[INFO]\e[0m $1"; } warn() { echo -e "\e[33m[AVISO]\e[0m $1"; } # --- Início da Execução --- info "Iniciando o processo de adição do snippet de erros..." if [ "$EUID" -ne 0 ]; then echo "ERRO: Este script precisa de ser executado como root." >&2 exit 1 fi # Verifica se o ficheiro do snippet existe antes de continuar. if [ ! -f "$SNIPPET_PATH" ]; then echo "ERRO: O ficheiro do snippet '${SNIPPET_PATH}' não foi encontrado." >&2 echo "Por favor, crie o ficheiro de snippet antes de executar este script." >&2 exit 1 fi # Percorre cada ficheiro de configuração no diretório de sites disponíveis. for file in "$SITES_DIR"/*.conf; do # Verifica se é um ficheiro regular. if [[ ! -f "$file" ]]; then continue fi # Usa 'awk' para processar o ficheiro. # Esta abordagem é mais segura do que 'sed' para inserções complexas. awk -v snippet_line=" ${SNIPPET_LINE}" ' BEGIN { in_https_server_block = 0 snippet_added = 0 } # Verifica se a linha já existe no ficheiro para evitar duplicação. /include \/etc\/nginx\/snippets\/custom_errors.conf;/ { snippet_exists = 1 } # Deteta o início de um bloco 'server' que escuta na porta 443. /server *{/ { # Lê as próximas linhas para ver se contêm 'listen 443 ssl'. getline line1 getline line2 if (line1 ~ /listen 443 ssl/ || line2 ~ /listen 443 ssl/) { in_https_server_block = 1 } # Imprime as linhas que já lemos. print $0 print line1 print line2 next } # Deteta o fim de um bloco de servidor. /}/ { if (in_https_server_block) { in_https_server_block = 0 } } # Se estivermos dentro de um bloco HTTPS e encontrarmos a linha 'server_name', # adicionamos o nosso snippet depois dela. /server_name/ { print $0 if (in_https_server_block && !snippet_added && !snippet_exists) { print snippet_line snippet_added = 1 } next } # Imprime todas as outras linhas. { print } ' "$file" > "${file}.tmp" && sudo mv "${file}.tmp" "$file" # Informa o utilizador sobre o que foi feito. if grep -q "include ${SNIPPET_PATH};" "$file"; then info "Snippet de erros verificado/adicionado em: $(basename "$file")" fi done echo "" info "Processo concluído!" info "Por favor, teste a sua nova configuração com 'sudo nginx -t' e depois recarregue com 'sudo systemctl reload nginx'."