From cc78cf5ac1ea7ad7b7d2362f5091e9e43f2138f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Toledo=20Goncalves?= Date: Tue, 16 Sep 2025 22:49:12 +0000 Subject: [PATCH] Atualizar Instal-Proxy-Sinc.sh --- Instal-Proxy-Sinc.sh | 201 ++++++++++++++++++++++++++++--------------- 1 file changed, 133 insertions(+), 68 deletions(-) diff --git a/Instal-Proxy-Sinc.sh b/Instal-Proxy-Sinc.sh index 9d102d4..e616410 100644 --- a/Instal-Proxy-Sinc.sh +++ b/Instal-Proxy-Sinc.sh @@ -1,24 +1,25 @@ #!/bin/bash -# ============================================================================== -# INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO PROFISSIONAL) -# -# Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys -# Descrição: Instala e configura um serviço de versionamento robusto e -# auto-documentado para configurações de servidor. -# ============================================================================== +# ==============================================================================# +# INSTALADOR DO SERVIÇO PROXY-SINC # +# # +# Descrição: Instala e configura um serviço de versionamento robusto e # +# auto-documentado para configurações de servidor. # +# ==============================================================================# set -e # --- Variáveis de Configuração --- +# Define os caminhos de instalação padrão para os componentes do serviço. REPO_DIR="/opt/config_repo" SCRIPT_INSTALL_DIR="/usr/local/sbin" SYSTEMD_DIR="/etc/systemd/system" MAN_DIR="/usr/share/man/man8" CONFIG_DIR="/etc/proxy-sinc" PATHS_FILE="${CONFIG_DIR}/paths.conf" -# A URL para o script de atualização deve apontar para o ficheiro RAW. -UPDATE_SCRIPT_URL="https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/Instal-Proxy-Sinc.sh" +# URL do repositório onde o script de instalação (este ficheiro) está guardado. +# Usado pelo comando de auto-atualização 'proxy-sinc-update'. +UPDATE_REPO_URL="https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder/raw/branch/main/Instal-Proxy-Sinc.sh" # --- Funções de Ajuda --- info() { echo -e "\e[32m[INFO]\e[0m $1"; } @@ -28,32 +29,44 @@ warn() { echo -e "\e[33m[AVISO]\e[0m $1"; } # --- Início da Execução --- info "Iniciando a instalação/atualização do serviço Proxy-Sinc..." +# Garante que o script está a ser executado como root. if [ "$EUID" -ne 0 ]; then error "Este script precisa de ser executado como root." fi # --- 1. Verificação de Dependências --- -info "A verificar as dependências (git, rsync)..." +info "A verificar as dependências..." apt-get update > /dev/null +# Garante que as ferramentas essenciais (git, rsync) estão instaladas. apt-get install -y git rsync > /dev/null +# Verifica se o leitor de man pages está instalado e, se não estiver, instala-o. +if ! command -v man &> /dev/null; then + warn "O comando 'man' não foi encontrado. A instalar 'man-db'..." + apt-get install -y man-db > /dev/null +fi info "Dependências satisfeitas." # --- 2. Configuração das Credenciais e do Repositório --- info "Configurando a autenticação para o Gitea..." +# Recolhe as informações necessárias do utilizador. read -p "Por favor, insira a URL HTTP ou HTTPS do seu repositório Gitea: " GIT_URL read -p "Por favor, insira o seu NOME DE UTILIZADOR do Gitea: " GITEA_USERNAME read -s -p "Por favor, insira o seu TOKEN DE ACESSO do Gitea (ficará oculto): " GITEA_TOKEN echo "" +# REQUISITO 4: Pede a identificação do colaborador para o registo de deploy. +read -p "Identificação do Colaborador para o registo (Login AD/Email): " DEPLOYER_ID -if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ]; then - error "Todos os campos (URL, Utilizador, Token) são obrigatórios." +if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ] || [ -z "$DEPLOYER_ID" ]; then + error "Todos os campos (URL, Utilizador, Token, Colaborador) são obrigatórios." fi +# Constrói a URL de autenticação para o Git. GIT_PROTOCOL=$(echo "$GIT_URL" | grep -o '^https\?://') GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https\?://||') AUTH_GIT_URL="${GIT_PROTOCOL}${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}" +# Gera a identidade para os commits automaticamente com base no hostname. SERVER_HOSTNAME=$(hostname -f) GIT_COMMIT_NAME="$SERVER_HOSTNAME" GIT_COMMIT_EMAIL="${SERVER_HOSTNAME%%.*}@itguys.com.br" @@ -62,6 +75,7 @@ info "O autor dos commits será definido como: $GIT_COMMIT_NAME <$GIT_COMMIT_EMA # --- 3. Teste de Conexão SSL e Configuração do Git --- info "A testar a conexão com o Gitea..." SSL_VERIFY="true" +# REQUISITO 2: Testa a conexão com e sem verificação SSL e configura o Git de acordo. if ! git -c http.sslVerify=true ls-remote "$GIT_URL" &> /dev/null; then warn "A conexão com verificação SSL falhou. A tentar novamente sem verificação..." if ! git -c http.sslVerify=false ls-remote "$GIT_URL" &> /dev/null; then @@ -93,28 +107,37 @@ git config user.email "$GIT_COMMIT_EMAIL" git config http.sslVerify "$SSL_VERIFY" info "Repositório configurado com sucesso." -# --- 5. Gerar Ficheiro de Deploy (se for a primeira vez) --- +# --- 5. Gerar Ficheiro de Deploy (com identificação do colaborador) --- DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs" DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md" -if [ ! -f "$DEPLOY_LOG_FILE" ]; then - info "A criar o registo de deploy inicial..." - mkdir -p "$DEPLOY_LOG_DIR" - echo "# Registo de Deploy do Proxy-Sinc" > "$DEPLOY_LOG_FILE" - echo "" >> "$DEPLOY_LOG_FILE" - echo "**Servidor:** ${SERVER_HOSTNAME}" >> "$DEPLOY_LOG_FILE" - echo "**Instalado por:** ${GITEA_USERNAME}" >> "$DEPLOY_LOG_FILE" - echo "**Data de Instalação:** $(date)" >> "$DEPLOY_LOG_FILE" - - git add "$DEPLOY_LOG_FILE" - git commit -m "[Deploy] Instalação inicial do serviço de sincronização em ${SERVER_HOSTNAME}" - git push origin main - info "Registo de deploy enviado para o Gitea." +# REQUISITO 4: Identifica se é uma instalação ou uma atualização. +ACTION_TYPE="Instalação Manual" +if [ -f "$SYSTEMD_DIR/proxy-sinc.service" ]; then + ACTION_TYPE="Atualização Manual" fi -# --- 6. Gerar os Ficheiros do Serviço no Diretório Atual --- -info "A gerar os ficheiros do serviço..." +info "A criar/atualizar o registo de deploy..." +mkdir -p "$DEPLOY_LOG_DIR" +# Cria o ficheiro se ele não existir. +if [ ! -f "$DEPLOY_LOG_FILE" ]; then + echo "# Registo de Deploy do Proxy-Sinc para ${SERVER_HOSTNAME}" > "$DEPLOY_LOG_FILE" +fi +# Adiciona a nova entrada de log. +echo "" >> "$DEPLOY_LOG_FILE" +echo "---" >> "$DEPLOY_LOG_FILE" +echo "**Tipo de Ação:** ${ACTION_TYPE}" >> "$DEPLOY_LOG_FILE" +echo "**Executado por:** ${DEPLOYER_ID}" >> "$DEPLOY_LOG_FILE" +echo "**Data:** $(date)" >> "$DEPLOY_LOG_FILE" -# Cria o diretório de configuração e o ficheiro de caminhos +git add "$DEPLOY_LOG_FILE" +git commit -m "[Deploy] ${ACTION_TYPE} do serviço por ${DEPLOYER_ID} em ${SERVER_HOSTNAME}" +git push origin main +info "Registo de deploy enviado para o Gitea." + +# --- 6. Instalar os Ficheiros do Serviço --- +info "A instalar/atualizar os ficheiros do serviço..." + +# REQUISITO 1: Cria o diretório de configuração e o ficheiro de caminhos. mkdir -p "$CONFIG_DIR" if [ ! -f "$PATHS_FILE" ]; then info "A criar o ficheiro de caminhos padrão em $PATHS_FILE" @@ -124,56 +147,71 @@ if [ ! -f "$PATHS_FILE" ]; then echo "/etc/fail2ban" >> "$PATHS_FILE" fi -# Gera o script principal de commit -cat > ./commit_configs.sh << 'EOF' +# REQUISITO 2 e 5: Gera o script principal de commit, agora mais comentado. +cat > "$SCRIPT_INSTALL_DIR/commit_configs.sh" << 'EOF' #!/bin/bash +# Este script é executado pelo systemd.timer para sincronizar as configurações. set -e +# --- Variáveis --- +# Diretório local do repositório Git. REPO_PATH="/opt/config_repo" +# Diretório de configuração do próprio serviço de sincronização. CONFIG_DIR="/etc/proxy-sinc" +# Ficheiro que contém a lista de ficheiros/pastas a serem versionados. PATHS_FILE="${CONFIG_DIR}/paths.conf" -AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/usr/local/sbin/proxy-sinc-update" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/usr/share/man/man8/proxy-sinc.8.gz" "${PATHS_FILE}") +# Lista dos ficheiros da própria automação, para serem auto-versionados. +AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/usr/local/sbin/proxy-sinc-update" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/etc/systemd/system/proxy-sinc-update.service" "/etc/systemd/system/proxy-sinc-update.timer" "/usr/share/man/man8/proxy-sinc.8.gz" "${PATHS_FILE}") +# Destino dos ficheiros de automação dentro do repositório Git. AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/" log_info() { echo "[INFO] $1"; } +log_warn() { echo "[AVISO] $1"; } log_info "--- Iniciando a verificação de sincronização [$(date)] ---" +# Verifica se o script está a ser executado como root. if [ "$EUID" -ne 0 ]; then echo "[ERRO] O script deve ser executado como root." >&2; exit 1; fi -if [ ! -d "$REPO_PATH/.git" ]; then echo "[ERRO] O diretório do repositório $REPO_PATH não é um repositório Git válido." >&2; exit 1; fi +# Verifica se o repositório foi clonado corretamente. +if [ ! -d "$REPO_PATH/.git" ]; then echo "[ERRO] O diretório $REPO_PATH não é um repositório Git válido." >&2; exit 1; fi +# --- Sincronização dos Ficheiros de Configuração --- log_info "Sincronizando ficheiros de configuração definidos em $PATHS_FILE..." if [ ! -f "$PATHS_FILE" ]; then - echo "[AVISO] O ficheiro de caminhos $PATHS_FILE não foi encontrado. Nenhum ficheiro de configuração foi sincronizado." + log_warn "O ficheiro de caminhos $PATHS_FILE não foi encontrado. Nenhum ficheiro de configuração foi sincronizado." else + # Lê cada linha do ficheiro paths.conf. while IFS= read -r path_to_sync || [ -n "$path_to_sync" ]; do + # Ignora linhas vazias e comentários. if [ -z "$path_to_sync" ] || [[ "$path_to_sync" =~ ^# ]]; then continue fi if [ -e "$path_to_sync" ]; then - # Copia para a raiz do repositório + log_info "A sincronizar '$path_to_sync'..." + # O rsync é eficiente e só copia ficheiros alterados. rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled/' --exclude='modules-enabled/' --exclude='/var/log/' --exclude='/var/run/' --exclude='/var/cache/' "$path_to_sync" "$REPO_PATH/" else - echo "[AVISO] O caminho '$path_to_sync' definido em $PATHS_FILE não existe. A ignorar." + log_warn "O caminho '$path_to_sync' definido em $PATHS_FILE não existe. A ignorar." fi done < "$PATHS_FILE" fi +# --- Sincronização dos Ficheiros de Automação (Auto-Versionamento) --- log_info "Sincronizando ficheiros de automação..." mkdir -p "$AUTOMATION_FILES_DEST" for file in "${AUTOMATION_FILES_SOURCE[@]}"; do if [ -f "$file" ]; then + # O -R preserva a estrutura de pastas (ex: /etc/proxy-sinc/paths.conf). rsync -aR "$file" "$AUTOMATION_FILES_DEST" fi done cd "$REPO_PATH" log_info "A verificar o status do repositório Git..." +# Se existirem alterações, faz o commit e o push. if [ -n "$(git status --porcelain)" ]; then log_info "Alterações detetadas. A preparar o commit." - log_info "A puxar alterações do repositório remoto para evitar conflitos..." - git pull --ff-only - log_info "A adicionar alterações ao stage..." + git pull --ff-only # Sincroniza com o remoto para evitar conflitos. git add . COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações em $(hostname -f) - $(date +'%Y-%m-%d %H:%M:%S')" log_info "A fazer o commit com a mensagem: $COMMIT_MESSAGE" @@ -189,8 +227,9 @@ exit 0 EOF # Gera o script de atualização -cat > ./proxy-sinc-update << EOF +cat > "$SCRIPT_INSTALL_DIR/proxy-sinc-update" << EOF #!/bin/bash +# Este script permite a atualização manual do serviço. set -e echo "A procurar por atualizações para o serviço Proxy-Sinc..." UPDATE_SCRIPT_URL="${UPDATE_SCRIPT_URL}" @@ -198,14 +237,14 @@ TEMP_SCRIPT="/tmp/setup_latest.sh" echo "A baixar a versão mais recente do instalador de: \$UPDATE_SCRIPT_URL" +# Usa o modo inseguro para o download se o repositório estiver configurado assim. SSL_VERIFY_FLAG="" -if [ -d "/opt/config_repo/.git" ]; then - if [ "\$(cd /opt/config_repo && git config --get http.sslVerify)" == "false" ]; then - SSL_VERIFY_FLAG="--insecure" - echo "[AVISO] A usar o modo inseguro para baixar a atualização devido à configuração do repositório." - fi +if [ -d "/opt/config_repo/.git" ] && [ "\$(cd /opt/config_repo && git config --get http.sslVerify)" == "false" ]; then + SSL_VERIFY_FLAG="--insecure" + echo "[AVISO] A usar o modo inseguro para baixar a atualização." fi +# Baixa e executa a versão mais recente do instalador. if curl \$SSL_VERIFY_FLAG -L "\$UPDATE_SCRIPT_URL" -o "\$TEMP_SCRIPT"; then chmod +x "\$TEMP_SCRIPT" echo "Instalador baixado com sucesso. A executar a atualização..." @@ -219,17 +258,16 @@ fi exit 0 EOF -# Gera os ficheiros de serviço do systemd -cat > ./proxy-sinc.service << 'EOF' +# Gera os ficheiros de serviço do systemd para a SINCRONIZAÇÃO A CADA MINUTO +cat > "$SYSTEMD_DIR/proxy-sinc.service" << 'EOF' [Unit] Description=Serviço de Sincronização de Configurações do Nginx para o Git -After=network.target [Service] Type=oneshot ExecStart=/usr/local/sbin/commit_configs.sh EOF -cat > ./proxy-sinc.timer << 'EOF' +cat > "$SYSTEMD_DIR/proxy-sinc.timer" << 'EOF' [Unit] Description=Executa o serviço de sincronização de configurações a cada minuto [Timer] @@ -240,8 +278,30 @@ Unit=proxy-sinc.service WantedBy=timers.target EOF -# Gera a nova man page -cat > ./proxy-sinc.8 << 'EOF' +# REQUISITO 3: Gera os ficheiros de serviço para a VERIFICAÇÃO DE ATUALIZAÇÕES SEMANAL +cat > "$SYSTEMD_DIR/proxy-sinc-update.service" << 'EOF' +[Unit] +Description=Serviço de Verificação Semanal de Atualizações para o Proxy-Sinc +[Service] +Type=oneshot +ExecStart=/usr/local/sbin/proxy-sinc-update +EOF + +cat > "$SYSTEMD_DIR/proxy-sinc-update.timer" << 'EOF' +[Unit] +Description=Executa a verificação de atualizações do Proxy-Sinc toda Segunda-feira +[Timer] +# OnCalendar=dayofweek hour:minute:second +# Executa toda Segunda-feira às 03:00 da manhã. +OnCalendar=Mon *-*-* 03:00:00 +RandomizedDelaySec=1h +Unit=proxy-sinc-update.service +[Install] +WantedBy=timers.target +EOF + +# REQUISITO 5: Gera a nova man page, mais completa +cat > "/tmp/proxy-sinc.8" << 'EOF' .TH PROXY-SINC 8 "Setembro 2025" "iT Guys - Equipa de Infraestrutura" "Ferramentas de Sistema" .SH NAME proxy-sinc \- Serviço de versionamento automático de configurações de servidor @@ -272,24 +332,27 @@ Exemplo de conteúdo para \fI/etc/proxy-sinc/paths.conf\fR: /etc/zabbix/zabbix_agentd.d/meu_parametro.conf .fi .SH ATUALIZAÇÃO -Para atualizar o serviço e os seus scripts para a versão mais recente, execute o seguinte comando como root: +.SS ATUALIZAÇÃO MANUAL +Para forçar uma atualização do serviço e dos seus scripts para a versão mais recente, execute o seguinte comando como root: .sp \fBproxy-sinc-update\fR .sp -Este comando irá baixar e executar a versão mais recente do script de instalação a partir do repositório Git oficial, atualizando todos os componentes necessários. +Este comando irá baixar e executar a versão mais recente do script de instalação a partir do repositório Git oficial. Ele irá pedir as suas credenciais novamente para reconfigurar a autenticação e irá registar a atualização no log de deploy do repositório. +.SS ATUALIZAÇÃO AUTOMÁTICA +O sistema inclui um timer do systemd (\fIproxy-sinc-update.timer\fR) que executa o comando \fBproxy-sinc-update\fR automaticamente uma vez por semana (toda Segunda-feira às 3 da manhã) para garantir que a ferramenta de automação se mantém atualizada. .SH FICHEIROS .TP \fB/usr/local/sbin/commit_configs.sh\fR -O script principal que executa a lógica de sincronização e commit. +O script principal que executa a lógica de sincronização a cada minuto. .TP \fB/usr/local/sbin/proxy-sinc-update\fR O script que gere a auto-atualização do serviço. .TP -\fB/etc/systemd/system/proxy-sinc.service\fR -O ficheiro de unidade do systemd que define como executar o script. -.TP \fB/etc/systemd/system/proxy-sinc.timer\fR -O ficheiro de timer do systemd que define a frequência de execução. +O timer que define a frequência da SINCRONIZAÇÃO (a cada minuto). +.TP +\fB/etc/systemd/system/proxy-sinc-update.timer\fR +O timer que define a frequência da VERIFICAÇÃO DE ATUALIZAÇÕES (semanal). .TP \fB/opt/config_repo\fR O diretório local onde o repositório Git é clonado. @@ -302,27 +365,28 @@ EOF # --- 7. Mover ficheiros para os locais corretos e instalar --- info "A mover os ficheiros para os seus destinos..." -# Garante que os diretórios de destino existem mkdir -p "$SCRIPT_INSTALL_DIR" "$SYSTEMD_DIR" "$MAN_DIR" -# Move os ficheiros gerados mv ./commit_configs.sh "$SCRIPT_INSTALL_DIR/" mv ./proxy-sinc-update "$SCRIPT_INSTALL_DIR/" mv ./proxy-sinc.service "$SYSTEMD_DIR/" mv ./proxy-sinc.timer "$SYSTEMD_DIR/" -mv ./proxy-sinc.8 "$MAN_DIR/" +mv ./proxy-sinc-update.service "$SYSTEMD_DIR/" +mv ./proxy-sinc-update.timer "$SYSTEMD_DIR/" +mv "/tmp/proxy-sinc.8" "$MAN_DIR/" -# Define as permissões corretas chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" chmod +x "$SCRIPT_INSTALL_DIR/proxy-sinc-update" gzip -f "$MAN_DIR/proxy-sinc.8" info "Ficheiros instalados com sucesso." -# --- 8. Ativar o Serviço --- -info "A recarregar o systemd e a ativar o timer..." +# --- 8. Ativar os Serviços --- +info "A recarregar o systemd e a ativar os timers..." systemctl daemon-reload +# Ativa e inicia os dois timers systemctl enable --now proxy-sinc.timer -info "Serviço ativado e a correr!" +systemctl enable --now proxy-sinc-update.timer +info "Serviços ativados e a correr!" # --- Conclusão --- echo "" @@ -333,12 +397,13 @@ info "O serviço 'proxy-sinc' está agora ativo e irá sincronizar as suas" info "configurações para o Gitea a cada minuto." info "" info "Comandos úteis:" -info " Ver o status do timer: systemctl status proxy-sinc.timer" +info " Ver o status do timer de sincronização: systemctl status proxy-sinc.timer" +info " Ver o status do timer de atualização: systemctl status proxy-sinc-update.timer" info " Ver os logs da última execução: systemctl status proxy-sinc.service" -info " Ver o histórico de logs: journalctl -u proxy-sinc.service" info " Ler o manual de ajuda: man proxy-sinc" -info " Para atualizar o serviço no futuro: proxy-sinc-update" +info " Para forçar uma atualização agora: sudo proxy-sinc-update" info "" info "Para adicionar novos ficheiros/pastas à sincronização, edite:" info " /etc/proxy-sinc/paths.conf" info "" +