Files
RDO/scripts/start-auto-sync.ps1
2026-02-20 07:25:32 -03:00

476 lines
15 KiB
PowerShell

# Script Principal - Sistema de Auto-Sync RDO-C
# Integra todos os componentes: sync, logs, notificações e monitoramento
# Uso: .\scripts\start-auto-sync.ps1 [opções]
param(
[ValidateSet("start", "stop", "restart", "status", "setup", "test")]
[string]$Action = "start",
[switch]$EnableNotifications,
[switch]$EnableFileWatch,
[switch]$Verbose,
[switch]$DryRun,
[switch]$Force,
[int]$SyncInterval = 300, # 5 minutos
[string]$ConfigFile = "auto-sync-config.json",
[string]$LogLevel = "INFO"
)
# Importar módulos necessários
$scriptDir = Split-Path $MyInvocation.MyCommand.Path -Parent
$rootDir = Split-Path $scriptDir -Parent
try {
Import-Module "$scriptDir\logging-notifications.ps1" -Force
Write-LogEntry "INFO" "Módulo de logging carregado com sucesso" "System"
} catch {
Write-Host "❌ Erro ao carregar módulo de logging: $($_.Exception.Message)" -ForegroundColor Red
exit 1
}
# Configurações globais
$script:AutoSyncConfig = @{
IsRunning = $false
StartTime = $null
ProcessId = $null
SyncCount = 0
ErrorCount = 0
LastSync = $null
StatusFile = "auto-sync-status.json"
PidFile = "auto-sync.pid"
}
# Verificar dependências
function Test-Dependencies {
Write-LogEntry "INFO" "Verificando dependências do sistema..." "System"
$dependencies = @(
@{ Name = "Git"; Command = "git --version" },
@{ Name = "Node.js"; Command = "node --version" },
@{ Name = "NPM"; Command = "npm --version" }
)
$missing = @()
foreach ($dep in $dependencies) {
try {
$result = Invoke-Expression $dep.Command 2>$null
if ($result) {
Write-LogEntry "SUCCESS" "$($dep.Name) encontrado: $($result.Split([Environment]::NewLine)[0])" "System"
} else {
$missing += $dep.Name
}
} catch {
$missing += $dep.Name
}
}
if ($missing.Count -gt 0) {
Write-LogEntry "ERROR" "Dependências não encontradas: $($missing -join ', ')" "System"
return $false
}
Write-LogEntry "SUCCESS" "Todas as dependências foram verificadas" "System"
return $true
}
# Configurar ambiente
function Initialize-Environment {
Write-LogEntry "INFO" "Inicializando ambiente de auto-sync..." "System"
# Verificar se é um repositório Git
if (-not (Test-Path ".git")) {
Write-LogEntry "ERROR" "Diretório atual não é um repositório Git" "Git"
return $false
}
# Verificar configuração do Git
try {
$gitUser = git config user.name
$gitEmail = git config user.email
if (-not $gitUser -or -not $gitEmail) {
Write-LogEntry "ERROR" "Configuração do Git incompleta (user.name ou user.email)" "Git"
return $false
}
Write-LogEntry "SUCCESS" "Git configurado para: $gitUser <$gitEmail>" "Git"
} catch {
Write-LogEntry "ERROR" "Erro ao verificar configuração do Git: $($_.Exception.Message)" "Git"
return $false
}
# Verificar conectividade com repositório remoto
try {
$remoteUrl = git config --get remote.origin.url
if ($remoteUrl) {
Write-LogEntry "SUCCESS" "Repositório remoto: $remoteUrl" "Git"
# Testar conectividade
git ls-remote origin HEAD 2>$null | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-LogEntry "SUCCESS" "Conectividade com repositório remoto verificada" "Git"
} else {
Write-LogEntry "WARN" "Falha na conectividade com repositório remoto" "Git"
}
} else {
Write-LogEntry "WARN" "Nenhum repositório remoto configurado" "Git"
}
} catch {
Write-LogEntry "WARN" "Erro ao verificar repositório remoto: $($_.Exception.Message)" "Git"
}
# Criar diretórios necessários
$directories = @("logs", "temp", "scripts")
foreach ($dir in $directories) {
if (-not (Test-Path $dir)) {
New-Item -ItemType Directory -Path $dir -Force | Out-Null
Write-LogEntry "SUCCESS" "Diretório criado: $dir" "System"
}
}
# Configurar Git hooks se necessário
if (Test-Path "$scriptDir\setup-git-hooks.ps1") {
Write-LogEntry "INFO" "Configurando Git hooks..." "Git"
& "$scriptDir\setup-git-hooks.ps1"
}
return $true
}
# Salvar status do sistema
function Save-SystemStatus {
$status = @{
is_running = $script:AutoSyncConfig.IsRunning
start_time = $script:AutoSyncConfig.StartTime
process_id = $script:AutoSyncConfig.ProcessId
sync_count = $script:AutoSyncConfig.SyncCount
error_count = $script:AutoSyncConfig.ErrorCount
last_sync = $script:AutoSyncConfig.LastSync
last_update = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
config_file = $ConfigFile
log_level = $LogLevel
features = @{
notifications_enabled = $EnableNotifications
file_watch_enabled = $EnableFileWatch
}
}
try {
$status | ConvertTo-Json -Depth 3 | Set-Content $script:AutoSyncConfig.StatusFile
# Salvar PID se em execução
if ($script:AutoSyncConfig.IsRunning) {
$PID | Set-Content $script:AutoSyncConfig.PidFile
}
} catch {
Write-LogEntry "ERROR" "Erro ao salvar status: $($_.Exception.Message)" "System"
}
}
# Carregar status do sistema
function Get-SystemStatus {
if (Test-Path $script:AutoSyncConfig.StatusFile) {
try {
return Get-Content $script:AutoSyncConfig.StatusFile | ConvertFrom-Json
} catch {
Write-LogEntry "WARN" "Erro ao carregar status: $($_.Exception.Message)" "System"
}
}
return $null
}
# Executar sincronização
function Invoke-AutoSync {
Write-LogEntry "INFO" "Iniciando sincronização automática..." "Sync"
try {
# Verificar mudanças
$changes = git status --porcelain
if (-not $changes) {
Write-LogEntry "INFO" "Nenhuma mudança detectada" "Sync"
return $true
}
Write-LogEntry "INFO" "Mudanças detectadas: $($changes.Count) arquivos" "Sync" @{ files = $changes.Count }
if ($DryRun) {
Write-LogEntry "INFO" "[DRY RUN] Sincronização simulada" "Sync"
return $true
}
# Executar script de sync
if (Test-Path "$scriptDir\auto-sync-github.ps1") {
$syncResult = & "$scriptDir\auto-sync-github.ps1" -AutoCommit -Push
if ($syncResult) {
$script:AutoSyncConfig.SyncCount++
$script:AutoSyncConfig.LastSync = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-LogEntry "SUCCESS" "Sincronização concluída com sucesso" "Sync" @{ count = $script:AutoSyncConfig.SyncCount }
return $true
} else {
$script:AutoSyncConfig.ErrorCount++
Write-LogEntry "ERROR" "Falha na sincronização" "Sync"
return $false
}
} else {
Write-LogEntry "ERROR" "Script de sincronização não encontrado" "Sync"
return $false
}
} catch {
$script:AutoSyncConfig.ErrorCount++
Write-LogEntry "ERROR" "Erro durante sincronização: $($_.Exception.Message)" "Sync"
return $false
}
}
# Loop principal de monitoramento
function Start-AutoSyncLoop {
Write-LogEntry "SUCCESS" "Sistema de auto-sync iniciado" "System"
$script:AutoSyncConfig.IsRunning = $true
$script:AutoSyncConfig.StartTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$script:AutoSyncConfig.ProcessId = $PID
$lastSyncTime = Get-Date
# Iniciar file watcher se habilitado
$fileWatcherJob = $null
if ($EnableFileWatch -and (Test-Path "$scriptDir\file-watcher.ps1")) {
Write-LogEntry "INFO" "Iniciando monitoramento de arquivos..." "FileWatch"
$fileWatcherJob = Start-Job -ScriptBlock {
param($ScriptPath, $RootDir)
Set-Location $RootDir
& $ScriptPath -Continuous
} -ArgumentList "$scriptDir\file-watcher.ps1", $rootDir
}
try {
while ($script:AutoSyncConfig.IsRunning) {
$currentTime = Get-Date
# Salvar status periodicamente
Save-SystemStatus
# Verificar se é hora de sincronizar
if (($currentTime - $lastSyncTime).TotalSeconds -ge $SyncInterval) {
Invoke-AutoSync
$lastSyncTime = $currentTime
}
# Aguardar antes da próxima verificação
Start-Sleep -Seconds 30
# Verificar se deve parar (arquivo de controle)
if (Test-Path "auto-sync.stop") {
Write-LogEntry "INFO" "Arquivo de parada detectado" "System"
Remove-Item "auto-sync.stop" -Force
break
}
}
} catch {
Write-LogEntry "ERROR" "Erro no loop principal: $($_.Exception.Message)" "System"
} finally {
# Limpar recursos
if ($fileWatcherJob) {
Stop-Job $fileWatcherJob -Force
Remove-Job $fileWatcherJob -Force
}
$script:AutoSyncConfig.IsRunning = $false
Save-SystemStatus
# Remover arquivo PID
if (Test-Path $script:AutoSyncConfig.PidFile) {
Remove-Item $script:AutoSyncConfig.PidFile -Force
}
Write-LogEntry "INFO" "Sistema de auto-sync finalizado" "System"
}
}
# Parar sistema
function Stop-AutoSync {
Write-LogEntry "INFO" "Parando sistema de auto-sync..." "System"
# Criar arquivo de parada
"stop" | Set-Content "auto-sync.stop"
# Verificar se há processo em execução
if (Test-Path $script:AutoSyncConfig.PidFile) {
try {
$pid = Get-Content $script:AutoSyncConfig.PidFile
$process = Get-Process -Id $pid -ErrorAction SilentlyContinue
if ($process) {
Write-LogEntry "INFO" "Finalizando processo: $pid" "System"
Stop-Process -Id $pid -Force
Write-LogEntry "SUCCESS" "Processo finalizado" "System"
}
} catch {
Write-LogEntry "WARN" "Erro ao finalizar processo: $($_.Exception.Message)" "System"
}
}
$script:AutoSyncConfig.IsRunning = $false
Save-SystemStatus
}
# Mostrar status
function Show-SystemStatus {
$status = Get-SystemStatus
Write-Host ""
Write-Host "🔄 Status do Sistema Auto-Sync RDO-C" -ForegroundColor Cyan
Write-Host "===================================" -ForegroundColor Cyan
if ($status) {
$statusColor = if ($status.is_running) { "Green" } else { "Red" }
$statusText = if ($status.is_running) { "🟢 Executando" } else { "🔴 Parado" }
Write-Host "Status: $statusText" -ForegroundColor $statusColor
if ($status.start_time) {
Write-Host "Iniciado em: $($status.start_time)" -ForegroundColor Gray
}
if ($status.process_id) {
Write-Host "Process ID: $($status.process_id)" -ForegroundColor Gray
}
Write-Host ""
Write-Host "📊 Estatísticas:" -ForegroundColor Yellow
Write-Host " Sincronizações: $($status.sync_count)" -ForegroundColor White
Write-Host " Erros: $($status.error_count)" -ForegroundColor White
if ($status.last_sync) {
Write-Host " Última sincronização: $($status.last_sync)" -ForegroundColor White
}
Write-Host ""
Write-Host "⚙️ Configurações:" -ForegroundColor Yellow
Write-Host " Notificações habilitadas: $($status.features.notifications_enabled)" -ForegroundColor White
Write-Host " Monitoramento de arquivos: $($status.features.file_watch_enabled)" -ForegroundColor White
} else {
Write-Host "Status: 🔴 Não inicializado" -ForegroundColor Red
}
Write-Host ""
}
# Testar sistema
function Test-AutoSyncSystem {
Write-Host "🧪 Testando Sistema Auto-Sync" -ForegroundColor Cyan
Write-Host "=============================" -ForegroundColor Cyan
$tests = @(
@{ Name = "Dependências"; Test = { Test-Dependencies } },
@{ Name = "Ambiente Git"; Test = { Test-Path ".git" } },
@{ Name = "Scripts"; Test = {
(Test-Path "$scriptDir\auto-sync-github.ps1") -and
(Test-Path "$scriptDir\file-watcher.ps1")
}},
@{ Name = "Configuração"; Test = { Test-Path $ConfigFile } },
@{ Name = "Diretórios"; Test = {
(Test-Path "logs") -and (Test-Path "temp")
}}
)
$passed = 0
$total = $tests.Count
foreach ($test in $tests) {
try {
$result = & $test.Test
if ($result) {
Write-Host "$($test.Name)" -ForegroundColor Green
$passed++
} else {
Write-Host "$($test.Name)" -ForegroundColor Red
}
} catch {
Write-Host "$($test.Name): $($_.Exception.Message)" -ForegroundColor Red
}
}
Write-Host ""
Write-Host "Resultado: $passed/$total testes passaram" -ForegroundColor $(if ($passed -eq $total) { "Green" } else { "Yellow" })
return ($passed -eq $total)
}
# Função principal
function Main {
Write-Host "🚀 RDO-C Auto-Sync System" -ForegroundColor Cyan
Write-Host "=========================" -ForegroundColor Cyan
switch ($Action) {
"setup" {
Write-Host "⚙️ Configurando sistema..." -ForegroundColor Yellow
if (-not (Test-Dependencies)) {
Write-Host "❌ Falha na verificação de dependências" -ForegroundColor Red
exit 1
}
if (-not (Initialize-Environment)) {
Write-Host "❌ Falha na inicialização do ambiente" -ForegroundColor Red
exit 1
}
Write-Host "✅ Sistema configurado com sucesso" -ForegroundColor Green
}
"test" {
$success = Test-AutoSyncSystem
exit $(if ($success) { 0 } else { 1 })
}
"start" {
if (-not (Initialize-Environment)) {
Write-Host "❌ Falha na inicialização" -ForegroundColor Red
exit 1
}
Start-AutoSyncLoop
}
"stop" {
Stop-AutoSync
}
"restart" {
Stop-AutoSync
Start-Sleep -Seconds 3
if (Initialize-Environment) {
Start-AutoSyncLoop
}
}
"status" {
Show-SystemStatus
}
}
}
# Executar se chamado diretamente
if ($MyInvocation.InvocationName -ne '.') {
Main
}