Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to migrate / Errors: ["InvalidParams"] #6001

Open
herzkerl opened this issue Feb 20, 2025 · 1 comment
Open

Unable to migrate / Errors: ["InvalidParams"] #6001

herzkerl opened this issue Feb 20, 2025 · 1 comment

Comments

@herzkerl
Copy link

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?

@FamilieRo
Copy link

FamilieRo commented Feb 26, 2025

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: "hans.meier@acme.com") (<- 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.

  1. Die .env in den Keycloak Optionen erweitern um den Eintrag
    OPENID_CONNECT_UID_FIELD=LDAP_ID

  2. Den Client im Keycloak um einen Mapper erweitern:

Image
  1. 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: 'hans.meier@acme.de').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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants