DEV Community

Jake Goritski
Jake Goritski

Posted on • Originally published at jakeg.dev on

Backing Up LaunchBox Collection

Or how I learned to stop worrying and love robocopy

Backing Up LaunchBox Collection

After spending a good deal of time importing games, adjusting metadata, and getting everything configured just right, one starts to crave the piece of mind of having a mirrored copy of that collection on another machine just in case.

Backing Up LaunchBox Collection

Since my CLI-fu leans more Way of the Bash rather than Powershell, I naturally wanted something as trivial as rsync $MUH_LIBRARY/ coolguy@192.168.1.XXX:/backups/muh_library and throw that into my crontab running @daily or similar. But, even though WSL provides a great dev experience, it doesn't necessarily (nor should it) provide some of the system-level utilities of GNU/Linux (like not having systemd, for example). But obviously, this kind of simple pattern can't be reserved to the majesty of Tux. It's just a bit different and requires some discovery.

Enter: Task Scheduler

Backing Up LaunchBox Collection

Backing Up LaunchBox Collection

Backing Up LaunchBox Collection

Cool. Adjust timing to taste.

Now, what's this launchbox.ps1? That's going to be the backup script.

# Given,

$LOCAL_LAUNCHBOX_PATH = "C:\Users\coolguy\LaunchBox\"
$REMOTE_LAUNCHBOX_PATH = "\\OPENMEDIAVAULT\coolguy\backups\LaunchBox"

# we can mirror local to remote (this will delete files in remote if they've been removed in the source.
# /copy will just copy new files in source to the sink, but since LaunchBox includes it's own DB, I'm using /mir
# Of course, if you only cared about backuping the games and their file organization, /copyall may also suffice

robocopy $LOCAL_LAUNCHBOX_PATH $REMOTE_LAUNCHBOX_PATH /mir

# Since this will output each file as it scans for changes, I'm using Select-Object to "tail" the output. (/np is added to remove progress reporting in the log output as well)

robocopy $LOCAL_LAUNCHBOX_PATH $REMOTE_LAUNCHBOX_PATH /mir /np | Select-Object -last 8

# which will output
#
# Total Copied Skipped Mismatch FAILED Extras
# Dirs : 2098 0 2098 0 0 0
# Files : 2401 0 2401 0 0 0
# Bytes : 62.925 g 0 62.925 g 0 0 0
# Times : 0:00:08 0:00:00 0:00:00 0:00:08
# Ended : Friday, January 22, 2021 10:56:34 AM



Enter fullscreen mode Exit fullscreen mode

The full script includes some start/end headers and outputs to a script (appending). Check it out:

$logpath = "$HOME\.launchbox-backup.log"
$start = $(Get-Date -Format 'o')
Write-Output "[$start] MIRRORING LAUNCHBOX TO MEDIAVAULT" | Out-File -FilePath $logpath -Append
robocopy C:\Users\jgori\LaunchBox\ '\\OPENMEDIAVAULT\VaultBackups\launchbox' /mir /np | Select-Object -last 8 | Out-File -FilePath $logpath -Append
$end = $(Get-Date -Format 'o')
Write-Output "[$end] DONE" | Out-File -FilePath $logpath -Append

Enter fullscreen mode Exit fullscreen mode

Example,

PS C:\Users\jgori> Get-Content .\.launchbox-backup.log

[2021-01-22T10:56:26.0070112-05:00] MIRRORING LAUNCHBOX TO MEDIAVAULT

               Total Copied Skipped Mismatch FAILED Extras
    Dirs : 2098 0 2098 0 0 0
   Files : 2401 0 2401 0 0 0
   Bytes : 62.925 g 0 62.925 g 0 0 0
   Times : 0:00:08 0:00:00 0:00:00 0:00:08
   Ended : Friday, January 22, 2021 10:56:34 AM

[2021-01-22T10:56:34.4067462-05:00] DONE
[2021-01-22T10:56:56.1825927-05:00] MIRRORING LAUNCHBOX TO MEDIAVAULT

               Total Copied Skipped Mismatch FAILED Extras
    Dirs : 2098 0 2098 0 0 0
   Files : 2402 1 2401 0 0 0
   Bytes : 62.925 g 0 62.925 g 0 0 0
   Times : 0:00:08 0:00:00 0:00:00 0:00:08
   Ended : Friday, January 22, 2021 10:57:04 AM

[2021-01-22T10:57:04.5780894-05:00] DONE

Enter fullscreen mode Exit fullscreen mode

next steps

  • send request to a healthchecks endpoint to register success (or failure)
  • maybe integrate ntfy + pushover for push notifications
  • or us smtp to send confirmations

Top comments (0)