476 lines
15 KiB
PowerShell
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
|
|
} |