diff --git a/install-AdHoc-Backup.ps1 b/install-AdHoc-Backup.ps1 index 19a325d..4448cee 100644 --- a/install-AdHoc-Backup.ps1 +++ b/install-AdHoc-Backup.ps1 @@ -6,19 +6,20 @@ # ========================== # CONFIGURAZIONE INIZIALE # ========================== -# Cartella dove installeremo script e config $InstallRoot = "C:\polo\script" -# Nome dello script di backup vero e proprio $BackupScriptName = "AdHoc-Backup.ps1" -# Nome del file di configurazione $ConfigFileName = "backup.conf" -# Qui mettiamo direttamente i tuoi link +# link dal tuo Gitea $DownloadMap = @{ "AdHoc-Backup.ps1" = "https://gitea.poloinformatico.it/Mattia/Backup-AdHoc/raw/branch/main/AdHoc-Backup.ps1" "backup.conf" = "https://gitea.poloinformatico.it/Mattia/Backup-AdHoc/raw/branch/main/backup.conf" } +# URL degli strumenti come nello script di backup +$SevenZipPortableUrl = 'https://www.7-zip.org/a/7zr.exe' +$RcloneZipUrl = 'https://downloads.rclone.org/rclone-current-windows-amd64.zip' + # ========================== # FUNZIONI DI SUPPORTO # ========================== @@ -108,9 +109,6 @@ function Ensure-DefaultConfig { Write-Host "File di configurazione non trovato, ne creo uno di base..." -ForegroundColor Yellow @" -# backup.conf generato automaticamente -# Modificalo con l'opzione 3 del menù. - BackupRoot=C:\Backups_AdHoc LocalRetentionDaysFiles=2 LocalRetentionDaysDb=2 @@ -149,34 +147,93 @@ MailSubjectPref=[BACKUP ADHOC] "@ | Set-Content -Path $ConfigPath -Encoding UTF8 } +function Get-BackupRootFromConfig { + param([string]$ConfigPath) + $br = Get-ConfigValue -Path $ConfigPath -Key "BackupRoot" + if ([string]::IsNullOrWhiteSpace($br)) { + $br = "C:\Backups_AdHoc" + } + return $br +} + # ========================== -# FUNZIONE 1: INSTALLA +# INSTALL 7ZIP / RCLONE STILE AdHoc-Backup.ps1 # ========================== -function Install-AdHocBackup { - Write-Host "== INSTALLAZIONE SCRIPT BACKUP ==" -ForegroundColor Cyan - Ensure-Folder -Path $InstallRoot +function Install-7Zip-LikeBackup { + param( + [string]$BackupRoot + ) + $binDir = Join-Path $BackupRoot "Bin" + $bin7zDir = Join-Path $binDir "7zip" + Ensure-Folder $binDir + Ensure-Folder $bin7zDir - foreach ($entry in $DownloadMap.GetEnumerator()) { - $fileName = $entry.Key - $url = $entry.Value - $dest = Join-Path $InstallRoot $fileName - Download-File -Url $url -Destination $dest + $sevenZipExe = Join-Path $bin7zDir "7z.exe" + $sevenZip7zr = Join-Path $bin7zDir "7zr.exe" + + if (Test-Path $sevenZipExe -or Test-Path $sevenZip7zr) { + Write-Host "7-Zip già presente in $bin7zDir" -ForegroundColor Green + return } - $configPath = Join-Path $InstallRoot $ConfigFileName - Ensure-DefaultConfig -ConfigPath $configPath + $dest = $sevenZip7zr + Write-Host "Scarico 7zip portable..." -ForegroundColor Cyan + Download-File -Url $SevenZipPortableUrl -Destination $dest + if (Test-Path $dest) { + Write-Host "7zip installato in $bin7zDir" -ForegroundColor Green + } else { + Write-Warning "7zip non scaricato." + } +} - # Chiede subito se vuole pianificare - if (Read-YesNo "Vuoi creare una pianificazione (operazione consigliata)?" $true) { - Show-ScheduleMenu +function Install-Rclone-LikeBackup { + param( + [string]$BackupRoot + ) + $binDir = Join-Path $BackupRoot "Bin" + $rcloneDir = Join-Path $binDir "RClone" + $rcloneExe = Join-Path $rcloneDir "rclone.exe" + $rcloneZip = Join-Path $rcloneDir "rclone-current-windows-amd64.zip" + $rcloneConf = Join-Path $rcloneDir "rclone.conf" + + Ensure-Folder $binDir + Ensure-Folder $rcloneDir + + if (-not (Test-Path $rcloneExe)) { + Write-Host "Scarico rclone..." -ForegroundColor Cyan + Download-File -Url $RcloneZipUrl -Destination $rcloneZip + + try { Add-Type -AssemblyName System.IO.Compression.FileSystem | Out-Null } catch {} + [System.IO.Compression.ZipFile]::ExtractToDirectory($rcloneZip, $rcloneDir) + + # dentro lo zip c'è una sottocartella, lo cerchiamo + $found = Get-ChildItem -LiteralPath $rcloneDir -Recurse -Filter 'rclone.exe' | Select-Object -First 1 + if ($found) { + Copy-Item -LiteralPath $found.FullName -Destination $rcloneExe -Force + # pulisco le sottocartelle estratte + Get-ChildItem -LiteralPath $rcloneDir -Directory | ForEach-Object { Remove-Item $_.FullName -Recurse -Force } + } else { + Write-Warning "rclone.exe non trovato nello zip." + } + + # rimuovo lo zip come richiesto + if (Test-Path $rcloneZip) { + Remove-Item $rcloneZip -Force + } + + Write-Host "rclone installato in $rcloneDir" -ForegroundColor Green + } else { + Write-Host "rclone già presente in $rcloneDir" -ForegroundColor Green } - # Chiede subito se vuole modificare configurazione - if (Read-YesNo "Vuoi modificare adesso la configurazione del file backup.conf?" $false) { - Edit-BackupConfig -ConfigPath $configPath + # lancio configurazione come nello script originale + if (-not (Test-Path $rcloneConf)) { + Write-Host "Apro la configurazione di rclone in una nuova finestra..." -ForegroundColor Yellow + $cmd = " & `"$rcloneExe`" --config `"$rcloneConf`" config " + Start-Process -FilePath "powershell.exe" -ArgumentList "-NoExit","-Command",$cmd -WindowStyle Normal | Out-Null + } else { + Write-Host "rclone.conf già presente: $rcloneConf" -ForegroundColor Green } - - Write-Host "Installazione completata." -ForegroundColor Green } # ========================== @@ -257,7 +314,7 @@ function Edit-BackupConfig { "KeepLocalArchives" = "true = tiene una copia locale dopo l'upload." "EnableFileBackup" = "true = esegue il backup delle cartelle in ArchiveSources." "EnableRcloneUpload" = "true = dopo il backup carica su cloud tramite rclone." - "ArchiveSources" = "Elenco cartelle/sorgenti da salvare, separate da | (pipe)." + "ArchiveSources" = "Elenco cartelle/sorgenti da salvare, separate da |." "EnableSqlBackup" = "true = fa anche i backup dei database SQL Server." "SqlInstance" = "Nome/istanza SQL Server (es. localhost\SQLEXPRESS)." "SqlUseWindowsAuth" = "true = usa utente Windows; false = usa SqlUser/SqlPassword." @@ -302,6 +359,57 @@ function Edit-BackupConfig { Write-Host "Configurazione aggiornata in $ConfigPath" -ForegroundColor Green } +# ========================== +# FUNZIONE 4: ESEGUI PRIMO BACKUP +# ========================== +function Run-FirstBackup { + $backupScriptPath = Join-Path $InstallRoot $BackupScriptName + if (-not (Test-Path $backupScriptPath)) { + Write-Warning "Lo script $backupScriptPath non esiste. Esegui prima l'installazione (1)." + return + } + Write-Host "Eseguo il primo backup..." -ForegroundColor Cyan + # lo eseguiamo nello stesso PowerShell così l’utente vede l’output + & powershell.exe -NoProfile -ExecutionPolicy Bypass -File $backupScriptPath +} + +# ========================== +# FUNZIONE 1: INSTALLA +# ========================== +function Install-AdHocBackup { + Write-Host "== INSTALLAZIONE SCRIPT BACKUP ==" -ForegroundColor Cyan + Ensure-Folder -Path $InstallRoot + + foreach ($entry in $DownloadMap.GetEnumerator()) { + $fileName = $entry.Key + $url = $entry.Value + $dest = Join-Path $InstallRoot $fileName + Download-File -Url $url -Destination $dest + } + + $configPath = Join-Path $InstallRoot $ConfigFileName + Ensure-DefaultConfig -ConfigPath $configPath + + # ora che abbiamo il config, vediamo il BackupRoot per installare 7zip/rclone negli stessi percorsi + $backupRoot = Get-BackupRootFromConfig -ConfigPath $configPath + Ensure-Folder $backupRoot + + Install-7Zip-LikeBackup -BackupRoot $backupRoot + Install-Rclone-LikeBackup -BackupRoot $backupRoot + + # Chiede subito se vuole pianificare + if (Read-YesNo "Vuoi creare una pianificazione (operazione consigliata)?" $true) { + Show-ScheduleMenu + } + + # Chiede subito se vuole modificare configurazione + if (Read-YesNo "Vuoi modificare adesso la configurazione del file backup.conf?" $false) { + Edit-BackupConfig -ConfigPath $configPath + } + + Write-Host "Installazione completata." -ForegroundColor Green +} + # ========================== # MENÙ PRINCIPALE # ========================== @@ -310,10 +418,11 @@ do { Write-Host "==============================" -ForegroundColor DarkCyan Write-Host " INSTALL ADHOC BACKUP - MENU" Write-Host "==============================" -ForegroundColor DarkCyan - Write-Host "1) Installa / aggiorna script (scarica da gitea)" + Write-Host "1) Installa / aggiorna script (scarica da gitea, installa 7zip e rclone)" Write-Host "2) Crea pianificazione (giornaliera/settimanale, con orario)" Write-Host "3) Modifica configurazione backup.conf (guidata)" - Write-Host "0) Esci" + Write-Host "4) Esegui il primo backup" + Write-Host "0) Chiudi la finestra" $sel = Read-Host "Seleziona" $configPath = Join-Path $InstallRoot $ConfigFileName @@ -322,10 +431,9 @@ do { "1" { Install-AdHocBackup } "2" { Show-ScheduleMenu } "3" { Edit-BackupConfig -ConfigPath $configPath } - "0" { break } + "4" { Run-FirstBackup } + "0" { Stop-Process -Id $PID } default { Write-Host "Scelta non valida." -ForegroundColor Red } } } while ($true) - -Write-Host "Uscita dallo script." -ForegroundColor Cyan