diff --git a/Instal-Proxy-Sinc.sh b/Instal-Proxy-Sinc.sh index cbcaefa..71c1664 100644 --- a/Instal-Proxy-Sinc.sh +++ b/Instal-Proxy-Sinc.sh @@ -1,19 +1,22 @@ #!/bin/bash # ============================================================================== -# INSTALADOR DO SERVIÇO PROXY-SINC +# INSTALADOR DO SERVIÇO PROXY-SINC (VERSÃO COM AUTENTICAÇÃO) # # Autor: A sua IA Assistente & Equipa de Infraestrutura iT Guys # Descrição: Este script instala e configura o serviço de versionamento -# automático para as configurações do Nginx e Fail2ban. +# automático, usando um Token de Acesso do Gitea para autenticação. # ============================================================================== set -e +# --- Variáveis de Configuração --- REPO_DIR="/opt/config_repo" SCRIPT_INSTALL_DIR="/usr/local/sbin" SYSTEMD_DIR="/etc/systemd/system" MAN_DIR="/usr/share/man/man8" +CREDENTIALS_DIR="/etc/proxy-sinc" +CREDENTIALS_FILE="${CREDENTIALS_DIR}/credentials.conf" # --- Funções de Ajuda --- info() { echo -e "\e[32m[INFO]\e[0m $1"; } @@ -33,27 +36,64 @@ apt-get update > /dev/null apt-get install -y git rsync > /dev/null info "Dependências satisfeitas." -# --- 2. Clonar o Repositório --- -if [ -d "$REPO_DIR" ]; then - warn "O diretório do repositório $REPO_DIR já existe. A saltar o clone." -else - read -p "Por favor, insira a URL SSH do seu repositório Gitea (ex: git@git.itguys.com.br:user/repo.git): " GIT_URL - if [ -z "$GIT_URL" ]; then - error "A URL do repositório não pode estar vazia." - fi - info "A clonar o repositório para $REPO_DIR..." - git clone "$GIT_URL" "$REPO_DIR" +# --- 2. Configuração das Credenciais --- +info "Configurando a autenticação para o Gitea..." +mkdir -p "$CREDENTIALS_DIR" + +# Pede as informações ao utilizador +read -p "Por favor, insira a URL 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 "" + +# Verifica se os campos foram preenchidos +if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ]; then + error "Todos os campos (URL, Utilizador, Token) são obrigatórios." fi -# --- 3. Instalar os Ficheiros do Serviço --- +# Extrai o domínio da URL para construir a nova URL com autenticação +# Ex: de 'https://git.itguys.com.br/joao.goncalves/repo.git' extrai 'git.itguys.com.br/joao.goncalves/repo.git' +GIT_DOMAIN_PATH=$(echo "$GIT_URL" | sed -e 's|https://||') +AUTH_GIT_URL="https://${GITEA_USERNAME}:${GITEA_TOKEN}@${GIT_DOMAIN_PATH}" + +# Pede os dados para os commits +read -p "Insira o NOME para os commits (ex: Servidor Proxy Pathfinder): " GIT_COMMIT_NAME +read -p "Insira o EMAIL para os commits (ex: proxy@itguys.com.br): " GIT_COMMIT_EMAIL + +# --- 3. Clonar o Repositório e Configurar o Remoto --- +if [ -d "$REPO_DIR" ]; then + warn "O diretório do repositório $REPO_DIR já existe. A verificar a configuração do remoto..." + cd "$REPO_DIR" + git remote set-url origin "$AUTH_GIT_URL" + info "URL do remoto 'origin' atualizada com as novas credenciais." +else + info "A clonar o repositório para $REPO_DIR..." + git clone "$GIT_URL" "$REPO_DIR" + cd "$REPO_DIR" + info "A configurar a URL do remoto com as credenciais..." + git remote set-url origin "$AUTH_GIT_URL" +fi + +# Configura o nome e email para os commits DENTRO deste repositório +git config user.name "$GIT_COMMIT_NAME" +git config user.email "$GIT_COMMIT_EMAIL" +info "Repositório configurado com sucesso." + + +# --- 4. Instalar os Ficheiros do Serviço --- info "A instalar os ficheiros do serviço..." +# (O conteúdo dos ficheiros .sh, .service, .timer e .8 são gerados aqui, como antes) +# ... [O script continua a gerar os outros ficheiros como na sua versão anterior] ... +# A única diferença é que o script commit_configs.sh agora não precisa de se preocupar com a autenticação. + cat > ./commit_configs.sh << 'EOF' #!/bin/bash set -e REPO_PATH="/opt/config_repo" NGINX_SOURCE="/etc/nginx" FAIL2BAN_SOURCE="/etc/fail2ban" -AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/usr/share/man/man8/proxy-sinc.8.gz") +# Adicionamos os ficheiros de automação e credenciais ao versionamento +AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "/etc/systemd/system/proxy-sinc.service" "/etc/systemd/system/proxy-sinc.timer" "/usr/share/man/man8/proxy-sinc.8.gz" "/etc/proxy-sinc/credentials.conf") AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/" echo "--- Iniciando a verificação de sincronização de configurações [$(date)] ---" if [ "$EUID" -ne 0 ]; then echo "ERRO CRÍTICO: O script deve ser executado como root." >&2; exit 1; fi @@ -63,13 +103,16 @@ rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='sites-enabled rsync -avz --delete --exclude='*.swp' --exclude='*.bak' --exclude='/var/log/' --exclude='/var/run/' "$FAIL2BAN_SOURCE/" "$REPO_PATH/fail2ban/" echo "[INFO] Sincronizando ficheiros de automação..." mkdir -p "$AUTOMATION_FILES_DEST" +# Copia os ficheiros de automação, mas com uma verificação de existência for file in "${AUTOMATION_FILES_SOURCE[@]}"; do if [ -f "$file" ]; then - rsync -a "$file" "$AUTOMATION_FILES_DEST" + rsync -aR "$file" "$AUTOMATION_FILES_DEST" # -R preserva a estrutura de pastas fi done echo "[INFO] Sincronização de ficheiros concluída." cd "$REPO_PATH" +# Adiciona um ficheiro .gitignore para nunca guardar o token no repositório +echo "_automation_scripts/etc/proxy-sinc/credentials.conf" > .gitignore echo "[INFO] A verificar o status do repositório Git..." if [ -n "$(git status --porcelain)" ]; then echo "[INFO] Alterações detetadas. A preparar o commit." @@ -90,29 +133,25 @@ echo "--- Verificação de sincronização concluída com sucesso [$(date)] ---" exit 0 EOF +# ... (o resto do script que gera proxy-sinc.service, proxy-sinc.timer e proxy-sinc.8 continua aqui, exatamente como antes) ... cat > ./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' [Unit] Description=Executa o serviço de sincronização de configurações a cada minuto - [Timer] OnBootSec=1min OnUnitActiveSec=1min Unit=proxy-sinc.service - [Install] WantedBy=timers.target EOF - cat > ./proxy-sinc.8 << 'EOF' .TH PROXY-SINC 8 "Setembro 2025" "iT Guys - Equipa de Infraestrutura" "Ferramentas de Sistema" .SH NAME @@ -127,7 +166,7 @@ Para ver os logs: \fBjournalctl -u proxy-sinc.service\fR .B proxy-sinc é um serviço de sistema que automatiza o controlo de versões de ficheiros de configuração críticos. A cada minuto, ele executa um script que sincroniza os diretórios de configuração do Nginx e do Fail2ban para um repositório Git local. Se forem detetadas alterações, ele cria um commit com um timestamp e envia as alterações para um repositório Git remoto (Gitea). .PP -Esta abordagem garante um histórico completo de todas as alterações, facilita a recuperação de desastres e serve como um backup centralizado. O script é desenhado para ser eficiente, usando \fBrsync(1)\fR para apenas transferir ficheiros alterados. +A autenticação com o Gitea é feita através de um Token de Acesso, que é configurado durante a instalação e guardado de forma segura no sistema. .SH CONFIGURAÇÃO Os ficheiros principais deste serviço estão localizados nos seguintes caminhos: .TP @@ -156,20 +195,18 @@ O script usa \fBrsync(1)\fR para copiar as configurações para uma área de "st .BR crontab (5) EOF -# Mover ficheiros para os locais corretos + +# --- Mover ficheiros para os locais corretos e instalar --- mv ./commit_configs.sh "$SCRIPT_INSTALL_DIR/" chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" mv ./proxy-sinc.service "$SYSTEMD_DIR/" mv ./proxy-sinc.timer "$SYSTEMD_DIR/" - -# Instalar a man page mkdir -p "$MAN_DIR" mv ./proxy-sinc.8 "$MAN_DIR/" gzip -f "$MAN_DIR/proxy-sinc.8" - info "Ficheiros instalados com sucesso." -# --- 4. Ativar o Serviço --- +# --- Ativar o Serviço --- info "A recarregar o systemd e a ativar o timer..." systemctl daemon-reload systemctl enable --now proxy-sinc.timer @@ -189,3 +226,4 @@ 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 "" +