Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Adjust window size
- $host.UI.RawUI.WindowSize = New-Object Management.Automation.Host.Size(80, 40)
- $host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size(80, 3000)
- # Configuration
- $sevenZip = "C:\Program Files\7-Zip\7z.exe"
- $sourceDir = "$env:USERPROFILE\.n8n"
- $destination = "X:\Storage\.n8n\backup.zip"
- $timestampFile = "$env:USERPROFILE\.n8n\backup_timestamps.txt"
- $password = $env:SEVENZIP_PASSWORD
- # Check if n8n is running
- $n8nProcesses = Get-WmiObject Win32_Process | Where-Object {
- $_.CommandLine -like "*npx*" -and $_.CommandLine -like "*n8n*" -and $_.CommandLine -notlike "*powershell*"
- }
- if ($n8nProcesses) {
- Write-Host "n8n is currently running. Backup will not proceed."
- exit 0
- }
- # Check if 7-Zip exists
- if (!(Test-Path -Path $sevenZip)) {
- Write-Error "7-Zip is not installed or the path is incorrect."
- exit 1
- }
- # Check if the password is set
- if ([string]::IsNullOrEmpty($password)) {
- Write-Error "Backup password is not set. Please set the SEVENZIP_PASSWORD environment variable."
- exit 1
- }
- # Retrieve last backup timestamps
- $lastTimestamps = @{}
- if (Test-Path -Path $timestampFile) {
- Get-Content -Path $timestampFile | ForEach-Object {
- $parts = $_.Split(" ", 2)
- if ($parts.Count -eq 2) {
- $lastTimestamps[$parts[0]] = [long]$parts[1]
- } else {
- Write-Error "Timestamp file format is incorrect."
- exit 1
- }
- }
- }
- # Initialize current timestamps hashtable
- $currentTimestamps = @{}
- # Get current timestamps
- foreach ($file in "config", "database.sqlite") {
- $filePath = Join-Path -Path $sourceDir -ChildPath $file
- if (Test-Path -Path $filePath) {
- try {
- $currentTimestamps[$file] = (Get-Item -Path $filePath).LastWriteTimeUtc.ToFileTimeUtc()
- } catch {
- Write-Error "Failed to get LastWriteTimeUtc for file: $file"
- exit 1
- }
- } else {
- Write-Error "Source file '$file' does not exist in the directory '$sourceDir'."
- exit 1
- }
- }
- # Compare timestamps and decide if backup is needed
- $needBackup = $false
- foreach ($file in $currentTimestamps.Keys) {
- if (!($lastTimestamps.ContainsKey($file)) -or $currentTimestamps[$file] -gt $lastTimestamps[$file]) {
- $needBackup = $true
- break
- }
- }
- # Perform backup if needed
- if ($needBackup) {
- Write-Host "Backing up files..."
- try {
- & $sevenZip a -tzip -p$password $destination (Join-Path -Path $sourceDir -ChildPath "database.sqlite") (Join-Path -Path $sourceDir -ChildPath "config")
- # Check if the backup was created successfully
- if (!(Test-Path -Path $destination)) {
- throw "Backup creation failed."
- }
- # Update timestamp file
- $output = @()
- foreach ($file in $currentTimestamps.Keys) {
- $output += "$file $($currentTimestamps[$file])"
- }
- Set-Content -Path $timestampFile -Value $output
- Write-Host "Backup completed."
- } catch {
- Write-Error "An error occurred during the backup process: $_"
- exit 1
- }
- } else {
- Write-Host "No backup needed. Files are up-to-date."
- }
- Start-Sleep -Seconds 4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement