Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Improved backup script for Ubiquiti UniFi controller
#!/bin/bash -e
#
# Improved backup script for Ubiquiti UniFi controller
# original source: http://wiki.ubnt.com/UniFi#Automated_Backup
#
# must contain:
# username=<username>
# password=<password>
source ~/.unifi-backup
baseurl=https://localhost:8443
output=/root/backups/unifi
filename=`date +%Y%m%d%H%M`.unf
keep_days=1
# create output directory
mkdir -p $output
curl_cmd="curl --cookie /tmp/cookie --cookie-jar /tmp/cookie --insecure --silent --fail"
# authenticate against unifi controller
if ! $curl_cmd --data '{"username":"'$username'","password":"'$password'"}' $baseurl/api/login > /dev/null; then
echo Login failed
exit 1
fi
# ask controller to do a backup, response contains the path to the backup file
path=`$curl_cmd --data 'json={"cmd":"backup","days":"-1"}' $baseurl/api/s/default/cmd/system | sed -n 's/.*\(\/dl.*unf\).*/\1/p'`
# download the backup to the destinated output file
$curl_cmd $baseurl$path -o $output/$filename
# logout
$curl_cmd $baseurl/logout
# delete outdated backups
find $output -ctime +$keep_days -type f -delete
echo Backup successful
@xq1xq1xq1

This comment has been minimized.

Copy link

@xq1xq1xq1 xq1xq1xq1 commented Dec 20, 2016

Very Cool Script.

Is there a script to restore this configuration download?

@chriswolske

This comment has been minimized.

Copy link

@chriswolske chriswolske commented Apr 12, 2017

Nice - thanks for sharing, definitely fills a need.

@Dan-Stafford

This comment has been minimized.

Copy link

@Dan-Stafford Dan-Stafford commented Jun 26, 2018

So the UniFi controllers are Unix or Linux based devices? (I'm trying to help my organization figure out an automated backup system for theirs)

@Tntdruid

This comment has been minimized.

Copy link

@Tntdruid Tntdruid commented Dec 1, 2018

@MadddinTribleD

This comment has been minimized.

Copy link

@MadddinTribleD MadddinTribleD commented Dec 25, 2019

Great script. Workes awesome.

But since at least a month the curl command that triggers the backup doesnt return a path anymore.
So it later just downloads an empty file instead of the backup.
Has anyone the same problem?

@MadddinTribleD

This comment has been minimized.

Copy link

@MadddinTribleD MadddinTribleD commented Dec 26, 2019

This is for Controller Version 5.12.35.0

So apparently the endpoints changed.

The endpoint to trigger a backup is now cmd/backup

This (LN29):

path=`$curl_cmd --data 'json={"cmd":"backup","days":"-1"}' $baseurl/api/s/default/cmd/system | sed -n 's/.*\(\/dl.*unf\).*/\1/p'`

should be changed to this:

path=`$curl_cmd --data '{"cmd":"backup","days":"-1"}' $baseurl/api/s/default/cmd/backup | sed -n 's/.*\(\/dl.*unf\).*/\1/p'`

I also had to remove the json= from the POST data

@Pestage

This comment has been minimized.

Copy link

@Pestage Pestage commented Jan 10, 2020

This is for Controller Version 5.12.35.0

So apparently the endpoints changed.

The endpoint to trigger a backup is now cmd/backup

This (LN29):

path=`$curl_cmd --data 'json={"cmd":"backup","days":"-1"}' $baseurl/api/s/default/cmd/system | sed -n 's/.*\(\/dl.*unf\).*/\1/p'`

should be changed to this:

path=`$curl_cmd --data '{"cmd":"backup","days":"-1"}' $baseurl/api/s/default/cmd/backup | sed -n 's/.*\(\/dl.*unf\).*/\1/p'`

I also had to remove the json= from the POST data

Thanks for your comment.
I have errors with a powershell scripts and with Chrome I noticed that the endpoint trigger changed.
But the script I'm using is still not working.. If you can take a look on this snippet please :

# 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" `
  -Uri "$BaseURI/api/s/default/cmd/backup" `
   -Body $( @{ cmd='backup'; days=$BackupDays } | ConvertTo-Json )
  # -Body $( @{ cmd='async-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

Thanks

@MadddinTribleD

This comment has been minimized.

Copy link

@MadddinTribleD MadddinTribleD commented Jan 13, 2020

@Pestage

I tried your script on my controller and with that code i got a response with a file to download

$Response = Invoke-RestMethod `
   -Method Post `
   -WebSession $UniFiSession `
   -Uri "$BaseURI/api/s/default/cmd/backup" `
   -Body $( @{ cmd='backup'; days=$BackupDays } | ConvertTo-Json )

in your snippet you got the Body twice. So maybe that was the problem?

@Pestage

This comment has been minimized.

Copy link

@Pestage Pestage commented Jan 14, 2020

Oh the double body line was a mistake with the copy/paste.. I modified the quote above.
But it's not working for me.
Is this a backup file you can download or an html file around 100 kB ?

@MadddinTribleD

This comment has been minimized.

Copy link

@MadddinTribleD MadddinTribleD commented Jan 14, 2020

I got a link to a backup file and used your later command to download it.
Was a file with about 300KB.
Looked like a backup file (had just random noice in it. Did not try to restore it)

@Pestage

This comment has been minimized.

Copy link

@Pestage Pestage commented Jan 15, 2020

I don't understand, for me it's an html file or no download. Can you tell me how you test please ? I miss something I think. Thanks.

@MadddinTribleD

This comment has been minimized.

Copy link

@MadddinTribleD MadddinTribleD commented Jan 16, 2020

  • installed powershell V6 (V6 adds -SkipCertificateCheck that i had to use because i dont have setup certs for my controller)
  • open powershell
  • set stuff like $BaseURI and $Username to my values
  • execute command by command
@staze

This comment has been minimized.

Copy link

@staze staze commented Jan 18, 2020

will keep working on it, but right now, this just produces a 0KB backup from my UDMP when run from a linux machine. Clearly something isn't working. =/ I did modify endpoint as mentioned in this discussion.

@ChrisPF123

This comment has been minimized.

Copy link

@ChrisPF123 ChrisPF123 commented Aug 17, 2020

will keep working on it, but right now, this just produces a 0KB backup from my UDMP when run from a linux machine. Clearly something isn't working. =/ I did modify endpoint as mentioned in this discussion.

I had the same problem on one of my controllers. Problem is that the user you are using to connect must be a Super Administrator.
I had the user set to just Administrator and i got 0Kb files.

@peschmae

This comment has been minimized.

Copy link

@peschmae peschmae commented Sep 20, 2021

Careful!

This script can result in deleting a lot of unwanted files!

# delete outdated backups
find $output -ctime +$keep_days -type f -delete

should be ammended with

# delete outdated backups
find $output -ctime +$keep_days -type f -delete -iname "*.unf"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment