docs & tools: Actualización de informes y scripts de migración DASUTEN
This commit is contained in:
@@ -5,8 +5,8 @@
|
||||
# adn/tools/cli/drones/dasuten_download_drive-dasu-sql4.rb
|
||||
# ==========================================================
|
||||
# Dron: Download desde Google Drive a dasu-sql4
|
||||
# Flujo: Google Drive → F:\BACKUP\sysdasuten_compressed_ADN.bak
|
||||
# Usa: Invoke-WebRequest (sin rclone)
|
||||
# Flujo: Google Drive → F:\BACKUP\sysdasuten_FULL_YYYYMMDD_HHMMSS.bak
|
||||
# Usa: rclone copy (mantiene nombre original del backup)
|
||||
# ==========================================================
|
||||
|
||||
require 'time'
|
||||
@@ -27,9 +27,12 @@ end.parse!(ARGV)
|
||||
|
||||
BACKUP_DIR_WINDOWS = "F:\\BACKUP"
|
||||
BACKUP_NAME_DEFAULT = "sysdasuten_compressed_ADN.bak"
|
||||
JSON_PATH = "C:\temp\dron_download_output.json"
|
||||
JSON_PATH = "C:\\temp\\dron_download_output.json"
|
||||
|
||||
# Determinar archivo a descargar
|
||||
backup_name = nil
|
||||
file_id = nil
|
||||
|
||||
if opciones[:test_file]
|
||||
puts "[*] Dron: Download desde Google Drive"
|
||||
puts " Nodo: dasu-sql4"
|
||||
@@ -52,10 +55,20 @@ else
|
||||
if File.exist?(UPLOAD_OUTPUT)
|
||||
upload_data = JSON.parse(File.read(UPLOAD_OUTPUT))
|
||||
drive_ruta = upload_data['drive_ruta']
|
||||
file_id = File.basename(drive_ruta)
|
||||
# Extraer el nombre EXACTO del archivo desde drive_ruta (ej: "rmonla-GDrive:drive_bkps-dasu/sysdasuten_FULL_20260415_121943.bak")
|
||||
backup_name = File.basename(drive_ruta)
|
||||
|
||||
puts "[*] Dron: Buscando Google Drive ID real (rclone)..."
|
||||
raw_json = `rclone lsjson '#{drive_ruta}' 2>/dev/null`.strip
|
||||
begin
|
||||
parsed = JSON.parse(raw_json).first
|
||||
file_id = parsed['ID']
|
||||
rescue
|
||||
puts "[!] Error al parsear ID de Google Drive. rclone regresó vacio."
|
||||
exit 1
|
||||
end
|
||||
|
||||
download_url = "https://drive.google.com/uc?export=download&id=#{file_id}"
|
||||
puts "[*] Dron: Download desde Google Drive"
|
||||
puts " Nodo: dasu-sql4"
|
||||
puts " Drive ruta: #{drive_ruta}"
|
||||
puts " File ID: #{file_id}"
|
||||
@@ -66,55 +79,44 @@ else
|
||||
end
|
||||
end
|
||||
|
||||
# Validar que backup_name tenga el formato correcto (FULL o DIF con fecha)
|
||||
unless backup_name =~ /sysdasuten_(FULL|DIF)_\d{8}_\d{6}\.bak/
|
||||
puts "[!] Advertencia: El nombre del backup '#{backup_name}' no sigue el formato esperado (sysdasuten_FULL_YYYYMMDD_HHMMSS.bak)"
|
||||
end
|
||||
|
||||
# PowerShell script para download
|
||||
ps_script = <<~PSCMD.strip
|
||||
$ErrorActionPreference = "Stop"
|
||||
$BACKUP_DIR = "F:\\BACKUP"
|
||||
$DOWNLOAD_URL = "#{download_url}"
|
||||
$BACKUP_NAME = "#{backup_name}"
|
||||
$LOCAL_BACKUP = "$BACKUP_DIR\\$BACKUP_NAME"
|
||||
$JSON_PATH = "C:\\temp\\dron_download_output.json"
|
||||
$REMOTE_RCLONE_PATH = "#{drive_ruta}"
|
||||
|
||||
$null = New-Item -ItemType Directory -Force -Path "C:\\temp"
|
||||
$null = New-Item -ItemType Directory -Force -Path $BACKUP_DIR
|
||||
|
||||
Write-Host "[1/3] Iniciando descarga..."
|
||||
Write-Host " URL: $DOWNLOAD_URL"
|
||||
Write-Host "[1/3] Iniciando descarga con Rclone Nativo..."
|
||||
Write-Host " Origen: $REMOTE_RCLONE_PATH"
|
||||
Write-Host " Destino: $LOCAL_BACKUP"
|
||||
|
||||
Write-Host "[2/3] Descargando..."
|
||||
$start = Get-Date
|
||||
try {
|
||||
$response = Invoke-WebRequest -Uri $DOWNLOAD_URL -UseBasicParsing -Headers @{
|
||||
"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
||||
}
|
||||
|
||||
$html = $response.Content
|
||||
$fileId = ""
|
||||
$uuid = ""
|
||||
$confirm = "t"
|
||||
if ($html -match 'name="id" value="([^"]+)"') { $fileId = $matches[1] }
|
||||
if ($html -match 'name="uuid" value="([^"]+)"') { $uuid = $matches[1] }
|
||||
if ($html -match 'name="confirm" value="([^"]+)"') { $confirm = $matches[1] }
|
||||
# Limpiamos el ultimo archivo varado (por si el anterior dejo su esqueleto de 0 bytes)
|
||||
if (Test-Path $LOCAL_BACKUP) { Remove-Item $LOCAL_BACKUP -Force }
|
||||
|
||||
Write-Host " File ID: $fileId"
|
||||
Write-Host " UUID: $uuid"
|
||||
# Llamamos al rclone binario local apuntando al config
|
||||
& C:\\rclone\\rclone.exe copy "$REMOTE_RCLONE_PATH" "$BACKUP_DIR\\" --config "C:\\rclone\\rclone.conf" --stats-one-line --stats 1s
|
||||
|
||||
$downloadConfirmUrl = "https://drive.usercontent.google.com/download?id=$fileId&export=download&confirm=$confirm&uuid=$uuid"
|
||||
Write-Host " URL confirmada: $downloadConfirmUrl"
|
||||
|
||||
$finalResponse = Invoke-WebRequest -Uri $downloadConfirmUrl -UseBasicParsing -Headers @{
|
||||
"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
||||
}
|
||||
|
||||
[System.IO.File]::WriteAllBytes($LOCAL_BACKUP, $finalResponse.Content)
|
||||
|
||||
$dur = (New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds
|
||||
Write-Host "[+] Descarga en $([math]::Round($dur, 2))s"
|
||||
} catch {
|
||||
Write-Host "[!] Error: $_"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "[!] Error: Falló la descarga de rclone (Código exit: $LASTEXITCODE)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$dur = (New-TimeSpan -Start $start -End (Get-Date)).TotalSeconds
|
||||
Write-Host "[+] Descarga en $([math]::Round($dur, 2))s"
|
||||
|
||||
Write-Host "[3/3] Verificando..."
|
||||
if (Test-Path $LOCAL_BACKUP) {
|
||||
$tam = (Get-Item $LOCAL_BACKUP).Length
|
||||
@@ -131,6 +133,7 @@ ps_script = <<~PSCMD.strip
|
||||
$res = @{
|
||||
paso = "download_complete"
|
||||
backup_local = $LOCAL_BACKUP
|
||||
backup_name = $BACKUP_NAME
|
||||
drive_origen = "Google Drive"
|
||||
nodo = "dasu-sql4"
|
||||
duracion = [math]::Round($dur, 2)
|
||||
|
||||
Reference in New Issue
Block a user