IAR Backup für Anfänger - Manfred Aabye - 08.02.2025
HowTo: Nutzung des saveinventar Bash-Skripts
## 1. Einleitung
Das `saveinventar`-Skript ermöglicht es, das Standard Inventar eines OpenSimulator-Nutzers als `.iar`-Archiv zu sichern.
Es speichert verschiedene Standard Inventarverzeichnisse automatisch in einem angegebenen Backup-Pfad.
## 2. Installation
### 2.1 Skript speichern
Speichere das folgende Skript als `saveinventar.sh` in einem gewünschten Verzeichnis:
```bash
Code: #!/bin/bash
function saveinventar() {
# Letzte Bearbeitung 08.02.2025
#
# Speichert den OpenSim Inventar mit "save iar" in ein Archiv.
#
# $1: Vorname
# $2: Nachname
# $3: Passwort
# $4: Archivpfad
#
# Beispiel: bash saveinventar.sh "Zain" "Hassan" "geheimesPasswort" "/opt/backup/inventar"
# Return: 0 wenn erfolgreich, 1 wenn der Screen nicht existiert
local SAVEINVSCREEN="sim1"
local vorname="$1"
local nachname="$2"
local passwort="$3"
local archivpfad="$4"
# Sicherstellen, dass das Archivverzeichnis existiert
mkdir -p "$archivpfad"
# Liste der zu sichernden Verzeichnisse
local -a inventarpfad=(
"Animations"
"Body Parts"
"Calling Cards"
"Clothing"
"Current Outfit"
"Favorites"
"Gestures"
"Landmarks"
"Lost and Found"
"Materials"
"Meshes"
"My Inventory"
"My Suitcase"
"Notecards"
"Objects"
"Outfits"
"Photo Album"
"Scripts"
"Settings"
"Sounds"
"Textures"
"Trash"
)
# Prüfen, ob der Screen existiert
if ! screen -list | grep -q "$SAVEINVSCREEN"; then
#log info "OSCOMMAND: Der Screen $SAVEINVSCREEN existiert nicht"
echo "OSCOMMAND: Der Screen $SAVEINVSCREEN existiert nicht"
return 1
fi
# Schleife über alle Verzeichnisse und Backup durchführen
for verzeichnis in "${inventarpfad[@]}"; do
local datei="${archivpfad}/${vorname}${nachname}_${verzeichnis}.iar"
echo "[DEBUG] Speichere Verzeichnis: /$verzeichnis -> Datei: $datei"
#log info "OSCOMMAND: save iar $vorname $nachname /$verzeichnis ***** $datei"
screen -S "$SAVEINVSCREEN" -p 0 -X eval "stuff 'save iar $vorname $nachname $verzeichnis $passwort $datei'^M"
done
return 0
}
vorname="$1"
nachname="$2"
passwort="$3"
archivpfad="$4"
# Beispiel: bash saveinventar.sh "Zain" "Hassan" "geheimesPasswort" "/opt/backup/inventar"
saveinventar "$vorname" "$nachname" "$passwort" "$archivpfad"
```
### 2.2 Skript ausführbar machen
Führe folgenden Befehl aus, um das Skript ausführbar zu machen:
```bash
Code: chmod +x saveinventar.sh
```
## 3. Nutzung
Das Skript kann mit folgendem Befehl ausgeführt werden:
```bash
Code: ./saveinventar.sh "Vorname" "Nachname" "Passwort" "/pfad/zum/backup"
```
**Beispiel:**
```bash
Code: ./saveinventar.sh "John" "Doe" "meinPasswort" "/opt/backup"
```
## 4. Fehlerbehebung
### 4.1 Der Screen existiert nicht
**Fehlermeldung:**
```bash
Code: [ERROR] Der Screen sim1 existiert nicht
```
**Lösung:**
- Stelle sicher, dass OpenSimulator läuft und `sim1` als Screen-Session aktiv ist.
- Überprüfe laufende Screens mit:
```bash
```
### 4.2 Falscher Speicherpfad
Falls `.iar`-Dateien im falschen Verzeichnis landen, prüfe den `archivpfad`-Wert und passe ihn entsprechend an.
## 5. Fazit
Mit diesem Skript kannst du dein OpenSimulator-Inventar einfach sichern.
Falls Probleme auftreten, überprüfe die Debugging-Ausgaben und passe ggf. die Konfiguration an.
---
**Letzte Bearbeitung:** 08.02.2025
RE: IAR Backup für Anfänger - Manfred Aabye - 08.02.2025
Version zwei des Skriptes
Es schaut in eure Datenbank wie eure UUID ist,
liest dann alle Verzeichnisnamen aus und macht
ein IAR Backup jedes einzelnen Ordners
so hat man ein Backup und man kann teile einzeln weitergeben.
Diese Version ist für Linux mit Screen und MariaDB.
Beispiel: bash saveinventar.sh "Zain" "Hassan" "geheimesPasswort" "/opt/backup/inventar" "dbuser" "dbpass" "dbname"
Zwischen den Backups macht dieses Skript 60 Sekunden Pause, damit nicht alle auf einmal heruntergeladen werden.
'''bash aveinventar.sh
Code: #!/bin/bash
function mariarest() {
# Letzte Bearbeitung 12.11.2023
# todo: Diese Funktion wird von vielen Funktionen aufgerufen und darf nicht verändert werden.
# Überprüfen, ob MariaDB-Client installiert ist # TODO Testen OK
if ! command -v mariadb &> /dev/null; then
echo "Der MariaDB-Client ist nicht installiert. Bitte installieren Sie ihn zuerst."
return 1
fi
# Überprüfen, ob alle erforderlichen Parameter vorhanden sind # TODO Testen OK
if [ "$#" -ne 4 ]; then
echo "Usage: mariarest <username> <password> <databasename> <mysqlcommand>"
return 1
fi
# Übergeben der Argumente an Variablen
local username="$1"
local password="$2"
local databasename="$3"
local mariacommand="$4"
# Überprüfen, ob die erforderlichen Variablen nicht leer sind
if [ -z "$username" ]; then echo "Verwendung: mariarest <Benutzername> <Passwort> <Datenbankname> [Kommando]"; exit 1; fi
if [ -z "$password" ]; then echo "Verwendung: mariarest <Benutzername> <Passwort> <Datenbankname> [Kommando]"; exit 1; fi
if [ -z "$databasename" ]; then echo "Verwendung: mariarest <Benutzername> <Passwort> <Datenbankname> [Kommando]"; exit 1; fi
if [ -z "$mariacommand" ]; then echo "Verwendung: mariarest <Benutzername> <Passwort> <Datenbankname> [Kommando]"; exit 1; fi
# Überprüfen, ob die erforderlichen Variablen nicht leer sind # TODO Testen OK
if [ -z "$username" ] || [ -z "$password" ] || [ -z "$databasename" ] || [ -z "$mariacommand" ]; then
echo "All parameters must be provided and not empty."
return 1
fi
# Ausführen des MariaDB-Befehls und Erfassen des Ergebnisses
result_mariarest=$(echo "$mariacommand;" | MYSQL_PWD=$password mariadb -u"$username" "$databasename" -N) 2>/dev/null
# Testausgabe des MySQL-Befehls
echo "$result_mariarest"
}
function saveinventar() {
# Letzte Bearbeitung 08.02.2025
#
# Speichert den OpenSim Inventar mit "save iar" in ein Archiv.
#
# $1: Vorname
# $2: Nachname
# $3: Passwort
# $4: Archivpfad
# $5: DB Benutzername
# $6: DB Passwort
# $7: DB Name
#
# Beispiel: bash saveinventar.sh "Zain" "Hassan" "geheimesPasswort" "/opt/backup/inventar" "dbuser" "dbpass" "dbname"
# Return: 0 wenn erfolgreich, 1 wenn der Screen nicht existiert
local SAVEINVSCREEN="sim1"
local vorname="$1"
local nachname="$2"
local passwort="$3"
local archivpfad="$4"
local db_username="$5"
local db_password="$6"
local db_name="$7"
# Sicherstellen, dass das Archivverzeichnis existiert
mkdir -p "$archivpfad"
# UUID des Benutzers aus der Datenbank auslesen
local query="SELECT PrincipalID FROM UserAccounts WHERE FirstName='$vorname' AND LastName='$nachname'"
local user_uuid=$(mariarest "$db_username" "$db_password" "$db_name" "$query")
user_uuid=$(echo "$user_uuid" | awk '{print $1}')
if [ -z "$user_uuid" ]; then
echo "Benutzer nicht gefunden."
return 1
fi
# Liste der Inventarordner des Benutzers aus der Datenbank auslesen
query="SELECT folderName FROM inventoryfolders WHERE agentID='$user_uuid'"
local inventarpfad=$(mariarest "$db_username" "$db_password" "$db_name" "$query")
IFS=$'\n' read -rd '' -a inventarpfad <<<"$inventarpfad"
if [ ${#inventarpfad[@]} -eq 0 ]; then
echo "Keine Inventarordner gefunden."
return 1
fi
# Prüfen, ob der Screen existiert
if ! screen -list | grep -q "$SAVEINVSCREEN"; then
# log info "OSCOMMAND: Der Screen $SAVEINVSCREEN existiert nicht"
echo "OSCOMMAND: Der Screen $SAVEINVSCREEN existiert nicht"
return 1
fi
# Schleife über alle Verzeichnisse und Backup durchführen
for verzeichnis in "${inventarpfad[@]}"; do
# Verzeichnisname in Anführungszeichen setzen
local verzeichnis_escaped="\"$verzeichnis\""
# Leerzeichen im Verzeichnisnamen durch Unterstriche im Dateinamen ersetzen
local datei_name=$(echo "$verzeichnis" | tr ' ' '_')
local datei="${archivpfad}/${vorname}_${nachname}_${datei_name}.iar"
echo "[DEBUG] Speichere Verzeichnis: $verzeichnis_escaped -> Datei: $datei"
# log info "OSCOMMAND: save iar $vorname $nachname $verzeichnis_escaped ***** $datei"
screen -S "$SAVEINVSCREEN" -p 0 -X eval "stuff 'save iar $vorname $nachname $verzeichnis_escaped $passwort $datei'^M"
# Pause von 60 Sekunden zwischen den Sicherungen
sleep 60
done
return 0
}
vorname="$1"
nachname="$2"
passwort="$3"
archivpfad="$4"
db_username="$5"
db_password="$6"
db_name="$7"
# Beispiel: bash saveinventar.sh "Zain" "Hassan" "geheimesPasswort" "/opt/backup/inventar" "dbuser" "dbpass" "dbname"
saveinventar "$vorname" "$nachname" "$passwort" "$archivpfad" "$db_username" "$db_password" "$db_name"
'''
|