From 352ddc1705388d14ab651ac21436fc4554f3825c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Toledo=20Goncalves?= Date: Wed, 17 Sep 2025 00:05:47 +0000 Subject: [PATCH] Adicionar ProxySync_install.sh --- ProxySync_install.sh | 227 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 ProxySync_install.sh diff --git a/ProxySync_install.sh b/ProxySync_install.sh new file mode 100644 index 0000000..a674087 --- /dev/null +++ b/ProxySync_install.sh @@ -0,0 +1,227 @@ +#!/bin/sh +# ============================================================================== +## INSTALADOR INTELIGENTE DO SERVIÇO PROXY-SINC PARA PFSENSE/FREEBSD ## +## ## +## Descrição: Instala ou atualiza o serviço de versionamento para o pfSense, ## +## guardando as configurações de forma persistente no Gitea. ## +## ============================================================================== + +set -e + +# --- Variáveis de Configuração --- +REPO_DIR="/root/config_repo" +SCRIPT_INSTALL_DIR="/usr/local/sbin" +CONFIG_DIR="/usr/local/etc/proxy-sinc" +CREDENTIALS_FILE="${CONFIG_DIR}/git.conf" +PATHS_FILE="${CONFIG_DIR}/paths.conf" + +# --- Funções de Ajuda --- +info() { echo "\033[32m[INFO]\033[0m $1"; } +error() { echo "\033[31m[ERRO]\033[0m $1" >&2; exit 1; } +warn() { echo "\033[33m[AVISO]\033[0m $1"; } + +# --- Início da Execução --- +info "Iniciando a instalação/atualização do serviço Proxy-Sinc..." + +if [ "$(id -u)" -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)..." +# O pfSense usa 'pkg' como gerenciador de pacotes. +# O 'rsync' já vem pré-instalado em versões recentes do pfSense. +if ! command -v git &> /dev/null; then + warn "Git não encontrado. A instalar 'git' via pkg..." + pkg install -y git +fi +if ! command -v rsync &> /dev/null; then + warn "Rsync não encontrado. Tentando instalar 'rsync'..." + pkg install -y rsync +fi +info "Dependências satisfeitas." + +# --- 2. Lógica de Instalação vs. Atualização --- +mkdir -p "$CONFIG_DIR" +if [ -f "$CREDENTIALS_FILE" ]; then + # MODO DE ATUALIZAÇÃO: Carrega as credenciais existentes. + info "Ficheiro de configuração encontrado. A executar em modo de atualização." + # A sintaxe 'source' não é suportada por todos os shells no FreeBSD, + # por isso usamos 'sh' para carregar a configuração de forma compatível. + . "$CREDENTIALS_FILE" + read -p "Identificação do Colaborador para o registo de ATUALIZAÇÃO: " DEPLOYER_ID + ACTION_TYPE="Atualização Manual" +else + # MODO DE INSTALAÇÃO: Pede as credenciais pela primeira vez. + info "Nenhum ficheiro de configuração encontrado. A executar em modo de instalação inicial." + 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 "" + read -p "Identificação do Colaborador para o registo de INSTALAÇÃO: " DEPLOYER_ID + ACTION_TYPE="Instalação Manual Inicial" + if [ -z "$GIT_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_TOKEN" ] || [ -z "$DEPLOYER_ID" ]; then + error "Todos os campos são obrigatórios." + fi + # Guarda as credenciais para uso futuro. + info "A guardar as credenciais em ${CREDENTIALS_FILE}..." + ( + echo "GIT_URL=\"$GIT_URL\"" + echo "GITEA_USERNAME=\"$GITEA_USERNAME\"" + echo "GITEA_TOKEN=\"$GITEA_TOKEN\"" + ) > "$CREDENTIALS_FILE" + chmod 600 "$CREDENTIALS_FILE" # Torna o ficheiro legível apenas pelo root. +fi + +# --- 3. Configuração do Repositório 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}" +SERVER_HOSTNAME=$(hostname -s) # Use -s para hostname simplificado +GIT_COMMIT_NAME="pfSense: $SERVER_HOSTNAME" +GIT_COMMIT_EMAIL="pfsense-sync@local.host" +info "O autor dos commits será definido como: $GIT_COMMIT_NAME <$GIT_COMMIT_EMAIL>" + +# Testa a conexão SSL de forma inteligente. +SSL_VERIFY="true" +if ! git -c http.sslVerify=true ls-remote "$GIT_URL" > /dev/null 2>&1; 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 2>&1; then + warn "Conexão bem-sucedida sem verificação SSL. O repositório será configurado para ignorar os erros de certificado." + SSL_VERIFY="false" + else + error "Não foi possível conectar ao repositório Git. Verifique a URL, token e conectividade de rede." + fi +else + info "Conexão com verificação SSL bem-sucedida." +fi + +# Clonar ou reconfigurar o repositório. +if [ -d "$REPO_DIR" ]; then + warn "O diretório do repositório $REPO_DIR já existe. A reconfigurar..." + cd "$REPO_DIR" + git remote set-url origin "$AUTH_GIT_URL" + info "URL do remoto 'origin' atualizada." +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 +git config user.name "$GIT_COMMIT_NAME" +git config user.email "$GIT_COMMIT_EMAIL" +git config http.sslVerify "$SSL_VERIFY" +info "Repositório configurado com sucesso." + +# --- 4. Gerar Ficheiro de Deploy --- +DEPLOY_LOG_DIR="$REPO_DIR/_deployment_logs" +DEPLOY_LOG_FILE="${DEPLOY_LOG_DIR}/${SERVER_HOSTNAME}.md" +info "A criar/atualizar o registo de deploy..." +mkdir -p "$DEPLOY_LOG_DIR" +if [ ! -f "$DEPLOY_LOG_FILE" ]; then + echo "# Registo de Deploy do Proxy-Sinc para ${SERVER_HOSTNAME}" > "$DEPLOY_LOG_FILE" +fi +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" + +git add "$DEPLOY_LOG_FILE" +git commit -m "[Deploy] ${ACTION_TYPE} por ${DEPLOYER_ID} em ${SERVER_HOSTNAME}" +git push origin main +info "Registo de deploy enviado para o Gitea." + +# --- 5. Gerar os Ficheiros do Serviço --- +info "A gerar e a instalar os ficheiros do serviço..." +if [ ! -f "$PATHS_FILE" ]; then + info "A criar o ficheiro de caminhos padrão em $PATHS_FILE" + echo "# Adicione aqui os caminhos completos para os ficheiros e diretórios que deseja versionar." > "$PATHS_FILE" + echo "/cf/conf/config.xml" >> "$PATHS_FILE" +fi + +# Gera o script principal de commit +cat > "$SCRIPT_INSTALL_DIR/commit_configs.sh" << 'EOF' +#!/bin/sh +set -e +REPO_PATH="/root/config_repo" +CONFIG_DIR="/usr/local/etc/proxy-sinc" +PATHS_FILE="${CONFIG_DIR}/paths.conf" +AUTOMATION_FILES_SOURCE=("/usr/local/sbin/commit_configs.sh" "${PATHS_FILE}" "${CONFIG_DIR}/git.conf") +AUTOMATION_FILES_DEST="$REPO_PATH/_automation_scripts/" +log_info() { echo "[INFO] $1"; } +log_info "--- Iniciando a verificação de sincronização [$(date)] ---" +if [ "$(id -u)" -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 $REPO_PATH não é um repositório Git válido." >&2; exit 1; fi +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." +else + while IFS= read -r path_to_sync || [ -n "$path_to_sync" ]; do + if [ -z "$path_to_sync" ] || $(echo "$path_to_sync" | grep -q '^#'); then continue; fi + if [ -e "$path_to_sync" ]; then + # Para o pfSense, a única config que realmente importa é o config.xml. + # RSync é mais complexo, para um único arquivo, 'cp' é mais simples. + if [ "$path_to_sync" = "/cf/conf/config.xml" ]; then + log_info "Sincronizando /cf/conf/config.xml para a raiz do repositório." + cp "$path_to_sync" "$REPO_PATH/config.xml" + else + log_info "Sincronizando $path_to_sync para o repositório..." + rsync -avz --delete "$path_to_sync" "$REPO_PATH/" + fi + else + echo "[AVISO] O caminho '$path_to_sync' não existe. A ignorar." + fi + done < "$PATHS_FILE" +fi +log_info "Sincronizando ficheiros de automação..." +mkdir -p "$AUTOMATION_FILES_DEST" +for file in $AUTOMATION_FILES_SOURCE; do + if [ -f "$file" ]; then rsync -aR "$file" "$AUTOMATION_FILES_DEST"; fi +done +cd "$REPO_PATH" +# GARANTE A SEGURANÇA: Cria/atualiza o .gitignore para NUNCA versionar o ficheiro de credenciais. +echo "_automation_scripts/usr/local/etc/proxy-sinc/git.conf" > .gitignore +log_info "A verificar o status do repositório Git..." +if [ -n "$(git status --porcelain)" ]; then + log_info "Alterações detetadas." + git pull --ff-only + git add . + COMMIT_MESSAGE="[Auto-Sync] Atualização das configurações em $(hostname -s) - $(date +'%Y-%m-%d %H:%M:%S')" + log_info "A fazer o commit com a mensagem: $COMMIT_MESSAGE" + git commit -m "$COMMIT_MESSAGE" + log_info "A enviar as alterações para o Gitea (git push)..." + git push origin main + echo "[SUCESSO] As alterações foram enviadas para o repositório remoto!" +else + log_info "Nenhuma alteração de configuração detetada." +fi +log_info "--- Verificação de sincronização concluída [$(date)] ---" +exit 0 +EOF + +chmod +x "$SCRIPT_INSTALL_DIR/commit_configs.sh" + +# --- 6. Agendamento com Cron do pfSense --- +info "A configuração será agendada para execução via CRON no pfSense." +info "Por favor, adicione manualmente o seguinte comando no agendador de tarefas do GUI do pfSense:" +info "" +info " Comando: /usr/local/sbin/commit_configs.sh" +info " Usuário: root" +info " Frequência: (escolha a sua, e.g., '0' em minutos, '*/6' em horas para a cada 6h)" +info "" +warn "NOTA: A auto-atualização do script não foi migrada, pois o pfSense não usa systemd. Você precisará atualizar manualmente o script." + +# --- Conclusão --- +echo "" +info "======================================================================" +info " Instalação/Atualização Concluída!" +info "======================================================================" +info "O script de sincronização está pronto." +info "" +info "Próximos passos:" +info " 1. Vá para o GUI do pfSense em 'System' -> 'Cron'." +info " 2. Crie uma nova entrada para executar o script." +info " 3. Edite o arquivo '/usr/local/etc/proxy-sinc/paths.conf' para adicionar ou remover caminhos de sincronização." +info "" \ No newline at end of file