244 lines
10 KiB
PowerShell
244 lines
10 KiB
PowerShell
#Requires -Version 5.0
|
|
Set-StrictMode -Version Latest
|
|
|
|
Function Restore-openHAB {
|
|
<#
|
|
.SYNOPSIS
|
|
Restores openHAB files from a backup file.
|
|
.DESCRIPTION
|
|
The Restore-openHAB function performs the necessary tasks to restore openHAB from a backup file.
|
|
.PARAMETER OHDirectory
|
|
The directory where openHAB is installed (default: current directory).
|
|
.PARAMETER OHBackups
|
|
The directory where backup the files are.
|
|
.PARAMETER FileName
|
|
The name of the backup file to use (do not specify to use the latest)
|
|
.PARAMETER AutoConfirm
|
|
Whether to auto confirm ($true) replacement of files (used for headless mode)
|
|
.EXAMPLE
|
|
Restore an openHAB instance from the latest backup file
|
|
Restore-openHAB
|
|
.EXAMPLE
|
|
Restore the openHAB distribution in the C:\openHAB2 directory from c:\openHAB2-backup\backup.zip without any user interaction
|
|
Restore-openHAB -OHDirectory C:\openHAB2 -OHBackups c:\openHAB2-backup -FileName backup.zip -AutoConfirm $true
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(ValueFromPipeline = $True)]
|
|
[string]$OHDirectory = ".",
|
|
[Parameter(ValueFromPipeline = $True)]
|
|
[string]$OHBackups = "",
|
|
[Parameter(ValueFromPipeline = $True)]
|
|
[string]$FileName = "",
|
|
[Parameter(ValueFromPipeline = $True)]
|
|
[boolean]$AutoConfirm = $False
|
|
)
|
|
|
|
begin {}
|
|
process {
|
|
|
|
Import-Module $PSScriptRoot\common.psm1 -Force
|
|
|
|
Write-Host ""
|
|
BoxMessage "openHAB 2.x.x restore script" Magenta
|
|
Write-Host ""
|
|
|
|
try {
|
|
$StartDir = Get-Location -ErrorAction Stop
|
|
}
|
|
catch {
|
|
exit PrintAndReturn "Can't retrieve the current location - exiting" $_
|
|
}
|
|
|
|
# Check for admin (commented out - don't think we need it)
|
|
# CheckForAdmin
|
|
|
|
# Check for openhab running
|
|
CheckOpenHABRunning
|
|
|
|
|
|
Write-Host -ForegroundColor Cyan "Checking the specified openHAB directory"
|
|
$OHDirectory = GetOpenHABRoot $OHDirectory
|
|
if ($OHDirectory -eq "") {
|
|
exit PrintAndReturn "Could not find the userdata directory! Make sure you are in the openHAB directory or specify the -OHDirectory parameter!"
|
|
}
|
|
|
|
$OHConf = GetOpenHABDirectory "OPENHAB_CONF" "$OHDirectory\conf"
|
|
$OHUserData = GetOpenHABDirectory "OPENHAB_USERDATA" "$OHDirectory\userdata"
|
|
|
|
if (([string]::IsNullOrEmpty($OHBackups))) {
|
|
$OHBackups = GetOpenHABDirectory "OPENHAB_BACKUPS" "$OHDirectory\backups"
|
|
}
|
|
|
|
if (-NOT (Test-Path -Path $OHConf -PathType Container)) {
|
|
exit PrintAndReturn "Configuration directory does not exist: $OHConf"
|
|
}
|
|
|
|
if (-NOT (Test-Path -Path $OHUserData -PathType Container)) {
|
|
exit PrintAndReturn "Userdata directory does not exist: $OHUserData"
|
|
}
|
|
|
|
if (-NOT (Test-Path -Path $OHBackups -PathType Container)) {
|
|
exit PrintAndReturn "Backups directory does not exist: $OHBackups"
|
|
}
|
|
|
|
|
|
if ([string]::IsNullOrEmpty($FileName)) {
|
|
Write-Host -ForegroundColor Yellow "No backup file specified. Finding latest backup: " -NoNewline
|
|
$FileName = Get-ChildItem -Path $OHBackups -Filter *.zip | Sort LastWriteTime -Descending | Select -Exp Name -First 1
|
|
Write-Host -ForegroundColor Green $FileName
|
|
}
|
|
|
|
if ([string]::IsNullOrEmpty($FileName)) {
|
|
throw "No backup filename was specified and no files were found in the $OHBackups - ending"
|
|
}
|
|
|
|
Write-Host -ForegroundColor Cyan "Changing location to $OHDirectory"
|
|
try {
|
|
Set-Location -Path $OHDirectory
|
|
}
|
|
catch {
|
|
exit PrintAndReturn "Could not change location to $OHDirectory - exiting" $_
|
|
}
|
|
|
|
$TempDir = "$(GetOpenHABTempDirectory)\restore"
|
|
Write-Host -ForegroundColor Cyan "Creating temporary restore directory $TempDir"
|
|
try {
|
|
CreateDirectory $TempDir
|
|
}
|
|
catch {
|
|
exit PrintAndReturn "Could not create directory $TempDir - exiting" $_
|
|
}
|
|
|
|
Write-Host -ForegroundColor Yellow "Using $OHConf as conf folder"
|
|
Write-Host -ForegroundColor Yellow "Using $OHUserData as userdata folder"
|
|
Write-Host -ForegroundColor Yellow "Using $OHBackups as backups folder"
|
|
Write-Host -ForegroundColor Yellow "Using $TempDir as temporary restore directory"
|
|
|
|
$ArchiveName = Join-Path $OHBackups $FileName
|
|
|
|
$Failed = $False
|
|
try {
|
|
try {
|
|
Expand-Archive -Path $ArchiveName -DestinationPath $TempDir -Force -ErrorAction Stop
|
|
}
|
|
catch {
|
|
return PrintAndThrow "Could not unzip $ArchiveName to $TempDir - exiting" $_
|
|
}
|
|
|
|
try {
|
|
Get-Content "$TempDir\backup.properties" -ErrorAction Stop | ForEach-Object {
|
|
$idx = $_.IndexOf("=")
|
|
if ($idx -ge 0) {
|
|
$propName = $_.Substring(0, $idx)
|
|
$propValue = $_.Substring($idx + 1);
|
|
if ($propName -eq "version") {
|
|
$BackupVersion = $propValue
|
|
}
|
|
ElseIf ($propName -eq "timestamp") {
|
|
$BackupTime = $propValue
|
|
}
|
|
ElseIf ($propName -eq "user") {
|
|
$OHUser = $propValue
|
|
}
|
|
ElseIf ($propName -eq "group") {
|
|
$OHGroup = $propValue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch {
|
|
return PrintAndThrow "Error occurred reading/processing $TempDir\backup.properties - exiting" $_
|
|
}
|
|
|
|
$CurrentVersion = GetOpenHABVersion $OHUserData
|
|
|
|
Write-Host ""
|
|
Write-Host -ForegroundColor Cyan " Backup Information:"
|
|
Write-Host -ForegroundColor Cyan " -------------------"
|
|
Write-Host -ForegroundColor Cyan " Backup File | " -NoNewline
|
|
Write-Host -ForegroundColor Yellow $FileName
|
|
Write-Host -ForegroundColor Cyan " Backup Version | " -NoNewline
|
|
Write-Host -ForegroundColor Yellow "$BackupVersion (You are on $CurrentVersion)"
|
|
Write-Host -ForegroundColor Cyan " Backup Timestamp | " -NoNewline
|
|
Write-Host -ForegroundColor Yellow $BackupTime
|
|
Write-Host -ForegroundColor Cyan " Config belongs to user | " -NoNewline
|
|
Write-Host -ForegroundColor Yellow $OHUser
|
|
Write-Host -ForegroundColor Cyan " from group | " -NoNewline
|
|
Write-Host -ForegroundColor Yellow $OHGroup
|
|
Write-Host ""
|
|
Write-Host -ForegroundColor Cyan "Any existing files with the same name will be replaced."
|
|
Write-Host -ForegroundColor Cyan "Any file without a replacement will be deleted."
|
|
Write-Host ""
|
|
|
|
if (-Not $AutoConfirm) {
|
|
$confirmation = Read-Host "Okay to Continue? [y/N]"
|
|
if ($confirmation -ne 'y') {
|
|
exit PrintAndReturn "Cancelling restore"
|
|
}
|
|
}
|
|
|
|
Write-Host -ForegroundColor Cyan "Copying the $TempDir\conf to $OHConf"
|
|
try {
|
|
# Replace the entire directory
|
|
DeleteIfExists "$OHConf\*" $True
|
|
Copy-Item -Path "$TempDir\conf\*" -Destination $OHConf -Force -Recurse -ErrorAction Stop
|
|
}
|
|
catch {
|
|
return PrintAndThrow "Error copy $TempDir\conf to $OHConf - exiting" $_
|
|
}
|
|
|
|
Write-Host -ForegroundColor Cyan "Copying the $TempDir\userdata to $OHUserData"
|
|
try {
|
|
# Remove everything not in the 'etc' directory (or backups if user put the backups there)
|
|
# Will overwrite existing files in 'etc' leaving any non-match (ie new) files intact
|
|
Get-ChildItem -Path "$OHUserData\" -Recurse -ErrorAction Stop | Where-Object { (($_.FullName -NotMatch ".*\\etc\\*.*") -and ($_.FullName -NotMatch ".*\\backups\\*.*")) } | ForEach-Object {
|
|
DeleteIfExists $_.fullname
|
|
}
|
|
Copy-Item -Path "$TempDir\userdata\*" -Destination $OHUserData -Recurse -Force -ErrorAction Stop
|
|
}
|
|
catch {
|
|
return PrintAndThrow "Error copy $TempDir\userdata to $OHUserData - exiting" $_
|
|
}
|
|
|
|
Write-Host -ForegroundColor Green "Restore has completed"
|
|
|
|
} catch {
|
|
# Exception occurred
|
|
$Failed = $True
|
|
exit -1
|
|
}
|
|
finally {
|
|
$confirmation = 'n'
|
|
if ($Failed -eq $True) {
|
|
Write-Host -ForegroundColor Yellow "Error restoring from $TempDir"
|
|
$confirmation = Read-Host "Do you wish remove the temporary directory (choose 'n' to restore the files yourself)? [y/N]"
|
|
}
|
|
|
|
if (($Failed -eq $False) -or ($AutoConfirm -eq $True) -or ($confirmation -eq 'y')) {
|
|
$parent = (Get-Item $TempDir).Parent.FullName
|
|
try {
|
|
Write-Host -ForegroundColor Cyan "Removing temporary directory $TempDir"
|
|
DeleteIfExists $TempDir $True
|
|
}
|
|
catch {
|
|
Write-Host -ForegroundColor Red "Could not delete $TempDir - delete it manually"
|
|
}
|
|
|
|
try {
|
|
if (-Not (Test-Path "$parent\*")) {
|
|
Write-Host -ForegroundColor Cyan "Removing temporary directory $parent"
|
|
DeleteIfExists $parent $True
|
|
}
|
|
}
|
|
catch {
|
|
Write-Host -ForegroundColor Red "Could not delete $parent - delete it manually"
|
|
}
|
|
}
|
|
|
|
Write-Host -ForegroundColor Cyan "Setting location back to $StartDir"
|
|
Set-Location -Path $StartDir -ErrorAction Continue
|
|
}
|
|
}
|
|
} |