Unable to migrate / Errors: ["InvalidParams"]
We're trying to migrate from v2 to v3 and get Errors: ["InvalidParams"] for both users and rooms.
Not sure what's wrong here, looking for guidance.
Just to make sure this is a supported scenario: In v2 there are local users and ldap, in v3 we're using Keycloak for external authentication. Is there a way to retain the rooms and their settings in that case?
Hi @herzkerl
Ich schreib jetzt einfach mal in Deutsch, geht schneller.
Wir hatten ähnliche "Probleme".
Also, wichtig für die Migration von v2 zu v3 ist es, dass den Zertifikaten vertraut werden. Außerdem musst Du im .env vom v2 noch die beiden Einträge V3_ENDPOINT und V3_SECRET_KEY_BASE ergänzen. Dein Eintrag vom V3_SECRET_KEY_BASE findest Du in der .env vom V3 als SECRET_KEY_BASE. Dann ist es sinnvoll das v2 Greenlight zu aktualisieren, dabei sollte der rake-Task für die Migration auch aktualisiert werden.
Hier ist die Seite dazu, hast Du aber sicher schon gelesen: https://docs.bigbluebutton.org/2.6/greenlight/v3/migration/
Damit sollte das Errors: ["InvalidParams"] hoffentlich behoben sein.
Dann kommt der "Spaß". Vermutlich hat das Greenlight v2 in der eigenen DB als external_id den userPrincipalName aus dem AD eingetragen. Den bekommt man aber aus der Keycloak nicht so einfach ins Ticket übertragen. Außerdem ist der Eintrag case sensitive. Checken kannst Du das wie folgt:
docker exec -it greenlight-v3 bundle exec rails c (<- so bekommst Du eine Kommandozeile im rails) User.where(email: "[email protected]") (<- in der Kommandozeile eingeben).
Heraus kommt eine Auflistung des Users. Spannend ist wie gesagt die external_id. Gegen die prüft das Greenlight den User.
Wir haben uns dazu entschieden die external_id gegen die LDAP-ID auszutauschen. Das ist die eindeutige ID des Users im AD. So hast Du auch keine Probleme, wenn der User eine Namensänderung erfährt.
Um das zu tun benötigt es 3 Anpassungen.
-
Die .env in den Keycloak Optionen erweitern um den Eintrag OPENID_CONNECT_UID_FIELD=LDAP_ID
-
Den Client im Keycloak um einen Mapper erweitern:
- Alle User müssen nun in der Greenlight "DB" angepasst werden. Ich hab mir dazu ein kleines PowerShell Script geschrieben:
# Verbindung zum Active Directory herstellen (falls nicht bereits geladen)
Import-Module ActiveDirectory
# Alle Benutzer mit einer E-Mail-Adresse abrufen
$users = Get-ADUser -SearchBase "OU=User,DC=acme,DC=de" -Filter * -Properties EmailAddress, objectGUID | Where-Object { $_.EmailAddress -ne $null }
# Array zur Speicherung der Ergebnisse
$results = @()
# Funktion zur korrekten Umwandlung der objectGUID
function Convert-Guid {
param ([byte[]]$guidBytes)
# Bytes korrekt umsortieren (Little-Endian zu Big-Endian)
$newGuid = New-Object Guid (
[BitConverter]::ToInt32($guidBytes, 0),
[BitConverter]::ToInt16($guidBytes, 4),
[BitConverter]::ToInt16($guidBytes, 6),
$guidBytes[8..15]
)
return $newGuid.ToString()
}
# Für jeden Benutzer die benötigten Daten verarbeiten
foreach ($user in $users) {
# Email-Adresse in Kleinbuchstaben konvertieren
$email = $user.EmailAddress.ToLower()
# objectGUID als Byte-Array extrahieren und korrekt umwandeln
$objectGUID = Convert-Guid $user.objectGUID.ToByteArray()
# Befehl für CSV erzeugen
#$command = 'docker exec -it greenlight-v3 bundle exec rails runner '
#$command = $command + "User.where(email: '$email').each{|user| user.update(external_id: '$objectGUID')}"
#$command = $command + '"'
$command = "docker exec -it greenlight-v3 bundle exec rails runner `"User.where(email: '$email').each{|user| user.update(external_id: '$objectGUID')}`""
# Ergebnis speichern
$results += [PSCustomObject]@{
#EmailAddress = $email
#ObjectGUID = $objectGUID
Command = $command
}
}
#write-host $results
# Exportieren der Daten in eine CSV-Datei ohne Anführungszeichen
$results | Export-Csv -Path "c:\temp\bbb-test.csv" -NoTypeInformation -Encoding UTF8 -Delimiter ";" -UseQuotes Never -force
Write-Host "Das Skript wurde erfolgreich ausgeführt. Die Ergebnisse wurden in 'c:\temp\bbb-test.csv' gespeichert."
Das Script is quick&dirty und gibt ne CSV aus, in der für alle AD-User unter dem angegebenen Scope direkt der passende Befehl erzeugt wurde, also z.B. docker exec -it greenlight-v3 bundle exec rails runner "User.where(email: '[email protected]').each{|user| user.update(external_id: '47110815abcd')}"
Die ganzen Befehle habe ich dann in eine Bash auf dem Linux und hab es laufen lassen.
Ja, es wird jedemal für jeden User ein docker exec aufgerufen, das geht sicher irgendwie charmanter. Das hier dauert lange, führt aber auch zum Ziel.
User, die im Greenlight nicht existieren werden einfach übersprungen, man muss also nicht prüfen ob der User im Greenlight existiert.
Neue User bekommen nun eh die LDAP_ID eingetragen und müssen natürlich nicht mehr nachträglich angefasst werden.
So, hoffe ich konnte Dir weiterhelfen.
Unfortunately this is still not solved—looking forward to more suggestions.
- Both v2 and v3 work just fine with no SSL errors
- I could migrate roles from v2 to v3 without any issues
- I still see
Errors: ["InvalidParams"]when trying to migrate users