Last active
May 30, 2024 21:43
-
-
Save realslacker/1a191086d85d9818818d8797ba86c598 to your computer and use it in GitHub Desktop.
Powershell Script to download backup from a Ubiquiti UniFi Controller or Cloud Key
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.NOTES | |
Author: Shannon Brooks | |
Date: Dec 1st, 2016 | |
Licence: Creative Commons Attribution-ShareAlike 4.0 International License | |
License URL: http://creativecommons.org/licenses/by-sa/4.0/ | |
.SYNOPSIS | |
Downloads a backup file from a UniFi controller | |
.DESCRIPTION | |
Downloads a backup file from a UniFi controller using the (undocumented) UniFi controller API | |
.EXAMPLE | |
C:\PS> .\Get-UniFiBackup.ps1 -Server 'localhost' -Port 8443 -Username 'admin' -Password 'XXXXXXXX' -BackupDays -1 | |
Will download a full backup from the server 'localhost' | |
.PARAMETER Server | |
Server name or IP address | |
.PARAMETER Port | |
Server HTTPS port | |
.PARAMETER Username | |
Admin user to login with | |
.PARAMETER Password | |
Password for the admin user | |
.PARAMETER BackupLocation | |
Location to save the backups, will be created if it doesn't exist | |
.PARAMETER BackupDays | |
Number of days of data to retain in the backup | |
Values in UniFi interface are 7, 30, 60, 90, 180, 365, and -1 (unlimited) | |
.PARAMETER BackupTimeStampFormat | |
Format for backup time stamp | |
See Get-Date for formatting options | |
.PARAMETER AcceptOnlyValidCertificates | |
Reject invalid or self signed SSL certificates | |
#> | |
[CmdletBinding()] | |
Param( | |
[Parameter(Mandatory=$False)] | |
[string] | |
$Server="localhost", | |
[Parameter(Mandatory=$False)] | |
[int] | |
$Port=8443, | |
[Parameter(Mandatory=$False)] | |
[string] | |
$Username="admin", | |
[Parameter(Mandatory=$True)] | |
$Password, | |
[Parameter(Mandatory=$False)] | |
[string] | |
$BackupLocation='.\', | |
[Parameter(Mandatory=$False)] | |
[int] | |
$BackupDays=7, | |
[Parameter(Mandatory=$False)] | |
[string] | |
$BackupTimeStampFormat="yyyy-MM-dd-Hmmss", | |
[switch] | |
$AcceptOnlyValidCertificates | |
) | |
# make sure backup location exists | |
$BackupLocation = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($BackupLocation) | |
If ( -not ( Test-Path -Path $BackupLocation -PathType Container -ErrorAction SilentlyContinue ) ) | |
{ | |
New-Item -Path $BackupLocation -ItemType Directory -ErrorAction Stop | |
} | |
# accept all SSL certs | |
If ( -not ( $AcceptOnlyValidCertificates.IsPresent ) ) | |
{ | |
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $True } | |
} | |
# construct server base URI | |
$BaseURI = 'https://' + $Server + ':' + $Port | |
# login | |
$Response = Invoke-RestMethod ` | |
-Method Post ` | |
-Uri "$BaseURI/api/login" ` | |
-Body $( @{ username=$Username; password=$Password } | ConvertTo-Json ) ` | |
-SessionVariable 'UniFiSession' | |
If ( $Response.meta.rc -ne 'ok' ) { Write-Error "LOGIN ERROR" -ErrorAction Stop } | |
# generate the backup file | |
$Response = Invoke-RestMethod ` | |
-Method Post ` | |
-WebSession $UniFiSession ` | |
-Uri "$BaseURI/api/s/default/cmd/system" ` | |
-Body $( @{ cmd='backup'; days=$BackupDays } | ConvertTo-Json ) | |
# download the backup file | |
Invoke-WebRequest ` | |
-Uri "$BaseURI$($Response.data.url)" ` | |
-WebSession $UniFiSession ` | |
-OutFile "$BackupLocation\$Server`_$(Get-Date -f $BackupTimeStampFormat).unf" | |
# logout | |
$Response = Invoke-WebRequest ` | |
-Uri "$BaseURI/logout" ` | |
-WebSession $UniFiSession | |
#EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment