$OpnSenseCredentials = @{ 'os1.irgendwo.local' = @{ UrlPort = '443' ApiKey = 'Viele Zeichen und Buchstaben' ApiSecret = 'Viele Zeichen und Buchstaben' } 'os2.irgendwo.local' = @{ UrlPort = '443' ApiKey = 'Viele Zeichen und Buchstaben' ApiSecret = 'Viele Zeichen und Buchstaben' } 'os3.irgendwo.local' = @{ UrlPort = '443' ApiKey = 'Viele Zeichen und Buchstaben' ApiSecret = 'Viele Zeichen und Buchstaben' } 'os4.irgendwo.local' = @{ UrlPort = '443344' ApiKey = 'Viele Zeichen und Buchstaben' ApiSecret = 'Viele Zeichen und Buchstaben' } 'os5.irgendwo.local' = @{ UrlPort = '443' ApiKey = 'Viele Zeichen und Buchstaben' ApiSecret = 'Viele Zeichen und Buchstaben' }}# Das Ziel der Backups$BackupDestination = "\\Backup_Server\Backup_Dir"# E-Mail Sachen$EmailSmtpServer = "mailer.irgendwo.local"$EmailEmpfaenger = "admin@irgendwo.com"$EmailSender = "dersender@irgendwo.com"$EmailBetreff = "Backup-Script fuer OPNsense: "$EmailText = "Folgendes ist aufgetreten:"# Wie viele Backups pro Host behalten wir?$AnzahlBackupsBehalten = 10# Eine E-MAil-Versendefunktionfunction SendMyMail { Send-MailMessage -From $EmailSender -to $EmailEmpfaenger -Subject $EmailBetreff -Body $EmailText -SmtpServer $EmailSmtpServer}# Wir wollen in das $BackupDestination wechseln. Wenn nicht E-Mail und raus...try { Set-Location -Path $BackupDestination -ErrorAction Stop}catch { $EmailBetreff = $EmailBetreff + "Fehler, kein Backup erstellt" $EmailText = @"Das Backup-Script konnte nicht in das Arbeitsverzeichnis wechseln. "@ SendMyMail exit 1}foreach ( $OpnSenseHost in $OpnSenseCredentials.Keys) { $BackupDestinationHostDir = "$BackupDestination" + "\" + "$OpnSenseHost" if ( -not (test-path -Path "$BackupDestinationHostDir" )) { try { New-Item -Path "$BackupDestinationHostDir" -ItemType Directory -ErrorAction Stop } catch { $EmailBetreff = $EmailBetreff + "Fehler, kein Backup erstellt" $EmailText = @"Das Backup-Script konnte kein Unterverzeichnis erstellen. Das Backup File wurde NICHT von \"$OpnSenseHost\" heruntergeladen!"@ SendMyMail continue } } try { Set-Location -Path $BackupDestinationHostDir -ErrorAction Stop } catch { $EmailBetreff = $EmailBetreff + "Fehler, kein Backup erstellt" $EmailText = @"Das Backup-Script konnte nicht in das Arbeitsverzeichnis wechseln. Das Backup File wurde NICHT von \"$OpnSenseHost\" heruntergeladen!"@ SendMyMail continue } $ApiCredentialPair = $OpnSenseCredentials[$OpnSenseHost]['ApiKey'] + ":" + $OpnSenseCredentials[$OpnSenseHost]['ApiSecret'] $Bytes = [System.Text.Encoding]::ASCII.GetBytes($ApiCredentialPair) $Base64Coded = [System.Convert]::ToBase64String($Bytes) $BasicAuthValue = "Basic $Base64Coded" $Headers = @{ Authorization = $BasicAuthValue } $Uri = "https://" + $OpnSenseHost + ":" + $($OpnSenseCredentials[$OpnSenseHost]['UrlPort']) + "/api/backup/backup/download" try { invoke-webrequest -uri $Uri -Headers $Headers -OutFile config.xml } catch { $EmailBetreff = $EmailBetreff + "Fehler, kein Backup erstellt" $EmailText = @"Fehler beim web-request. Das Backup File wurde NICHT von \"$OpnSenseHost\" heruntergeladen!"@ SendMyMail continue } Rename-Item config.xml backup_$(get-date -Format yyyyMMddhhmmss).xml $AnzahlBackupDateien = $(Get-ChildItem -Path backup_??????????????.xml | measure-object).count while ($AnzahlBackupDateien -gt $AnzahlBackupsBehalten) { Get-ChildItem -Path backup_??????????????.xml | Sort-Object | Select-Object -First 1 | Remove-Item $AnzahlBackupDateien = $(Get-ChildItem -Path backup_??????????????.xml | measure-object).count }}
add-type @"using System.Net;using System.Security.Cryptography.X509Certificates;public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; }}"@[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
beim Konsolidieren unserer Backups haben wir für unsere OPNsense Hosts vom Nextcloud Plugin auf os-api-backup umgestellt.
Da ich in Zukunft aber ~20 Installationen betreuen werde, fand ich die Idee interessant, die Backups von einer zentralen Stelle abzurufen.
#!/bin/bashKEY="MEINKEY"SECRET="MEINSECRET"HOST="192.168.200.1"PATHCONFIG="/mnt/user/backup/opnsensebackup"DATE="$(date +%Y%m%d_%H%M%S)"BACKUP_TO_KEEP="5"# download the config file from OPNsensecurl -s -u ${KEY}:${SECRET} http://${HOST}/api/backup/backup/download -o ${PATHCONFIG}/opnsense-config-${DATE}.xmlif [ $? -eq 0 ]; then /usr/local/emhttp/webGui/scripts/notify -i normal -s "Backup OPNsense done." -d "Downloading the xml config file from OPNsense successfully finished."else /usr/local/emhttp/webGui/scripts/notify -i alert -s "Backup OPNsense failed!" -d "Downloading the xml config file from OPNsense failed!" exit 1fi# delete old backupscd ${PATHCONFIG}ls -1tr ${PATHCONFIG} | sort | head -n -${BACKUP_TO_KEEP} | xargs -d '\n' rm -f --