From 64aed8c53dea76fbc5231ac825d1d53501b388cd Mon Sep 17 00:00:00 2001 From: Mattia Tadini Date: Wed, 12 Nov 2025 10:04:51 +0000 Subject: [PATCH] Update AdHoc-Backup.ps1 --- AdHoc-Backup.ps1 | 112 +++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 72 deletions(-) diff --git a/AdHoc-Backup.ps1 b/AdHoc-Backup.ps1 index 0c6a223..5efc0bb 100644 --- a/AdHoc-Backup.ps1 +++ b/AdHoc-Backup.ps1 @@ -1,5 +1,5 @@ <# - Backup-AdHoc.ps1 + Backup_AdHoc_rclone_mail_fixed_v3_fix26.ps1 Fix: - PowerShell è case-insensitive: le variabili locali "$files" sovrascrivevano "$Files" (hashtable globale). Rinominati i locali in "$outFiles" e, in Write-Log, uso esplicito di $script:Files.Log per evitare collisioni. @@ -7,38 +7,44 @@ #> #Requires -Version 5.1 -Set-StrictMode -Version Latest -$ErrorActionPreference = 'Stop' - param( [string]$Config, [switch]$Quiet ) +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13 } catch { try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {} } - #region ============================= Percorsi script & conf ========================= $ScriptPath = $MyInvocation.MyCommand.Path $ScriptDir = Split-Path -Parent $ScriptPath -# Se passato da riga di comando (es. dalla GUI), usa quello. -# Altrimenti prova prima bin\conf\backup.conf vicino allo script, poi fallback a .\backup.conf +# Layout dell'installer GUI (se presente): .\bin\{RClone,7Zip,conf} +$InstallerBinRoot = Join-Path $ScriptDir 'bin' +$InstallerConfDir = Join-Path $InstallerBinRoot 'conf' +$InstallerRcloneExe = Join-Path $InstallerBinRoot 'RClone\rclone.exe' +$Installer7zExe = Join-Path $InstallerBinRoot '7Zip\7z.exe' +$Installer7zrExe = Join-Path $InstallerBinRoot '7Zip\7zr.exe' +$InstallerRcloneConf= Join-Path $InstallerConfDir 'rclone.conf' + +# Se passato -Config usa quello, altrimenti priorità a .\bin\conf\backup.conf, poi .\backup.conf if ($PSBoundParameters.ContainsKey('Config') -and -not [string]::IsNullOrWhiteSpace($Config)) { - $ConfPath = $Config + try { + $ConfPath = (Resolve-Path -LiteralPath $Config).Path + } catch { + throw "Il file di configurazione specificato con -Config non esiste: $Config" + } +} elseif (Test-Path -LiteralPath (Join-Path $InstallerConfDir 'backup.conf')) { + $ConfPath = Join-Path $InstallerConfDir 'backup.conf' } else { - $cand = @( - (Join-Path $ScriptDir 'bin\conf\backup.conf'), - (Join-Path $ScriptDir 'backup.conf') - ) - $found = $null - foreach ($c in $cand) { if (Test-Path -LiteralPath $c) { $found = $c; break } } - if ($found) { $ConfPath = $found } else { $ConfPath = Join-Path $ScriptDir 'backup.conf' } + $ConfPath = Join-Path $ScriptDir 'backup.conf' } #endregion ========================================================================== @@ -211,37 +217,18 @@ Load-Config -Path $ConfPath #endregion ========================================================================== - -function Find-FirstExisting { - param([Parameter(Mandatory)][string[]]$Candidates) - foreach ($p in $Candidates) { - if (-not [string]::IsNullOrWhiteSpace($p) -and (Test-Path -LiteralPath $p)) { return $p } - } - return $null -} - #region ============================= Paths, Globals ================================ function Now-IT { (Get-Date).ToString('dd-MM-yyyy HH:mm:ss') } -$DateStamp = (Get-Date).ToString('yyyyMMdd_HHmmss') +$DateStamp = (Get-Date).ToString('dd-MM-yyyy_HHmmss') $HostName = $env:COMPUTERNAME - -$InstallBin = Join-Path $ScriptDir 'bin' - -# Scegli il layout preferendo quello dell'Installer (.\bin\*) se presente -$prefBin = if (Test-Path -LiteralPath $InstallBin) { $InstallBin } else { Join-Path $BackupRoot 'Bin' } -$prefBin7z = if (Test-Path -LiteralPath (Join-Path $InstallBin '7Zip')) { Join-Path $InstallBin '7Zip' } else { Join-Path $BackupRoot 'Bin\7Zip' } -$prefRclone = if (Test-Path -LiteralPath (Join-Path $InstallBin 'RClone')) { Join-Path $InstallBin 'RClone' } else { - if (Test-Path -LiteralPath (Join-Path $BackupRoot 'Bin\RClone')) { Join-Path $BackupRoot 'Bin\RClone' } else { Join-Path $BackupRoot 'RClone' } - } - $Paths = [ordered]@{ Root = $BackupRoot - Bin = $prefBin - Bin7z = $prefBin7z - BinRclone = $prefRclone + Bin = Join-Path $BackupRoot 'Bin' + Bin7z = Join-Path $BackupRoot 'Bin\7zip' + BinRclone = Join-Path $BackupRoot 'Bin\RClone' Logs = Join-Path $BackupRoot 'logs' Out = Join-Path $BackupRoot 'out' SqlStage = Join-Path $BackupRoot '_sql_stage' @@ -249,45 +236,25 @@ $Paths = [ordered]@{ StoreDb = Join-Path $BackupRoot 'Databases' } -# Candidati per rclone.exe e rclone.conf -$rcExeCand = @( - (Join-Path $Paths.BinRclone 'rclone.exe'), - (Join-Path (Join-Path $BackupRoot 'RClone') 'rclone.exe') -) -$rcConfCand = @( - $null, # 1) accanto a rclone.exe (se già presente) - (Join-Path $InstallBin 'conf\rclone.conf'), # 2) conf vicino allo script (Installer GUI) - (Join-Path $Paths.Bin 'conf\rclone.conf'), # 3) conf sotto BackupRoot\Bin - (Join-Path (Join-Path $env:APPDATA 'rclone') 'rclone.conf') # 4) profilo utente standard -) - -$sevenExeCand = @( - (Join-Path $Paths.Bin7z '7z.exe'), - (Join-Path $Paths.Bin7z '7zr.exe') -) - $Files = [ordered]@{ Log = Join-Path $Paths.Logs ("backup_$DateStamp.log") - SevenZipExe = Find-FirstExisting $sevenExeCand + SevenZipExe = Join-Path $Paths.Bin7z '7z.exe' SevenZip7zr = Join-Path $Paths.Bin7z '7zr.exe' - RcloneExe = Find-FirstExisting $rcExeCand + RcloneExe = Join-Path $Paths.BinRclone 'rclone.exe' RcloneZip = Join-Path $Paths.BinRclone 'rclone-current-windows-amd64.zip' - RcloneConf = $null + RcloneConf = Join-Path $Paths.BinRclone 'rclone.conf' } -# Se rclone.exe esiste già, prova prima rclone.conf nella stessa cartella -if ($Files.RcloneExe) { - $rcFolder = Split-Path -Parent $Files.RcloneExe - $rcConfSide = Join-Path $rcFolder 'rclone.conf' - $rcConfCand[0] = $rcConfSide -} -$Files.RcloneConf = Find-FirstExisting $rcConfCand -if (-not $Files.RcloneConf) { - # Fallback: tienilo fianco a rclone.exe - if (-not $Files.RcloneExe) { $Files.RcloneExe = Join-Path $Paths.BinRclone 'rclone.exe' } - $Files.RcloneConf = Join-Path (Split-Path -Parent $Files.RcloneExe) 'rclone.conf' -} -#endregion ========================================================================== +#endregion ==========================================================================# Preferisci gli strumenti nel layout dell'installer GUI, se presenti +if (Test-Path -LiteralPath $Installer7zExe) { $Files.SevenZipExe = $Installer7zExe } +elseif (Test-Path -LiteralPath $Installer7zrExe) { $Files.SevenZip7zr = $Installer7zrExe } + +if (Test-Path -LiteralPath $InstallerRcloneExe) { $Files.RcloneExe = $InstallerRcloneExe } + +# rclone.conf: prima quello in .\bin\conf, altrimenti quello sotto BackupRoot\Bin +if (Test-Path -LiteralPath $InstallerRcloneConf) { $Files.RcloneConf = $InstallerRcloneConf } + + #region ============================= Utils & Logging =============================== @@ -305,7 +272,8 @@ function Write-Log { [string]$Message ) $line = "[{0}] [{1}] {2}" -f (Now-IT), $Level, $Message - Write-Host $line + if (-not $Quiet) { Write-Host $line } + # Usa SEMPRE lo scope di script per il file log Add-Content -LiteralPath $script:Files.Log -Value $line }