ldap-sync wirft PHP-Fehler
-
Hallo zusammen!
Beim Versuch, das ldap zu syncen bekomme ich diesen Fehler:
PHP Fatal error: Uncaught TypeError: array_key_exists(): Argument #2 ($array) must be of type array, bool given in /var/www/html/i-doit/src/idoit/Console/Subscriber/CommandEvents.php:53
Ich führe gemäß der Knowledge Base diesen Befehl aus:
sudo -u www-data php console.php ldap-sync -c /var/www/html/i-doit/src/handler/ldap-sync.ini --dumpConfig
Die lday-sync.ini ist die aus der KB, angepasst um einen i-doit-User.
Hat jemand einen Tipp...?
Vielen Dank!
Klaus -
Ergänzung:
i-doit läuft auf Ubuntu 22.04 LTS, PHP 8.1.2
-
Hallo @kholzenhauer
um den Fehler zu beseitigen musst du in deiner
ldap-sync.ini
den "[commandArguments]
" Bereich ergänzen - siehe hier https://kb.i-doit.com/de/automatisierung-und-integration/cli/console/verwendung-von-konfigurationsdateien-fuer-console-commands.htmlIch habe den Fehler aufgenommen, sodass wir diesen mit dem nächsten Release lösen
Viele Grüße
Leoedit
Es ist übrigens auch möglich das deine
ldap-sync.ini
nicht korrekt gelesen werden konnte -
Guten Morgen!
Das verstehe ich nicht wirklich...
In dem KB-Artikel steht:Der Aufbau der .ini# [commandArguments] Zur Zeit keine vorhanden.
Hier meine ldap-sync.ini (natürlich ohne den korrekten User :
[commandArguments] [commandOptions] user=xxxxxxxx password=xxxxxxx tenantId=1 [additional] import_rooms=true defaultCompany='' deletedUsersBehaviour=disable_login disabledUsersBehaviour=disable_login ; LDAP Attributes are individual. This default configuration is prepared for Active Directory: attributes[department]=department attributes[phone_company]=telephoneNumber attributes[phone_home]=homephone attributes[phone_mobile]=mobile attributes[fax]=facsimileTelephoneNumber attributes[description]=info attributes[personnel_number]=initials attributes[organization]=company attributes[location]=physicalDeliveryOfficeName attributes[salutation]=title attributes[street]=streetAddress attributes[city]=l attributes[zip_code]=postalCode attributes[function]=title attributes[service_designation]=title attributes[pager]=pager ;Attributerweiterung Personen attributes[custom_1]=objectSid attributes[custom_2]=sn attributes[custom_3]=homePhone attributes[custom_4]=mobile attributes[custom_5]=info attributes[custom_6]=manager attributes[custom_7]=company attributes[custom_8]=department autoReactivateUsers=false ignoreUsersWithAttributes[]="sn" ignoreUsersWithAttributes[]="givenName" ignoreFunction=empty syncEmptyAttributes=true
Die ldap-sync startet ja (führe ich im Web-Verzeichnis als www-data aus), aber es gibt eben einen php-Fehler.
Hab ich da was falsch verstanden?
-
Noch eine Ergänzung, der "normale Aufruf"
sudo -u www-data php console.php -uxxxxxxx -pxxxxxxxx --tenantId 1 --ldapServerId 1
funktioniert, allerdings werden meine Mappings aus der ini-Datei natürlich nicht mitgezogen.
Der PHP-Fehler tritt immer dann auf, sobald ich die ini-Datei einbinde. Ich habe auch schon versucht, nur den [additional]-Teil in der ini zu lassen und den Rest (User, Tenant usw.) im Command mitzugeben.
Es endet aber alles immer wieder in dem Fehler, dass hier der Datentyp nicht stimmen soll:
if (!empty($config)) { if (!file_exists($config)) { $event->getOutput() ->writeln("<fg=yellow>Config file not found</>"); $configData = []; } else { $event->getOutput() ->writeln('<info>Processing config file</info>'); $configData = parse_ini_file($config, true, INI_SCANNER_RAW); } $definition = $command->getDefinition(); if (array_key_exists('commandArguments', $configData)) { $this->advancedIniParsing($configData['commandArguments']); foreach ($configData['commandArguments'] as $key => $value) { $input->setArgument($key, $value); $definition->getArgument($key)->setDefault($value); } } if (array_key_exists('commandOptions', $configData)) { $this->advancedIniParsing($configData['commandOptions']); foreach ($configData['commandOptions'] as $key => $value) { $input->setOption($key, $value); $definition->getOption($key)->setDefault($value); } } if (array_key_exists('additional', $configData)) { $this->advancedIniParsing($configData['additional']); $command->setConfig($configData['additional']); }
Immer in der Zeile "if (array_key_exists(....))" ist angeblich $configData ein Bool, kein Array.
-
Ok, scheint sich erledigt zu haben.....
Wenn man die Beispiel-ldap.ini kopiert, wird vor den Blöcken mit den []-Klammern eingerückt.
Das führt offenbar dazu, dass das Skript den Block nicht erkennt.
Schiebt man den Block [commandArguments] usw. an den Zeilenanfang schiebt, funktioniert das Ganze
Kopiert man die Beispiele von der KB-Seite, sind da offenbar Leerzeichen vor, die das Ganze abschießen:
....[commandArguments] ....[commandOptions] ....user=admin ....password=pass ....tenantId=1 ....update ....quiet ....[additional]
Egal, gefunden, Topic kann geschlossen werden!
Danke und Gruß,
Klaus -
das Problem kann auf der KB gelöst werden indem dort die Einrückung korrigiert wird.
Habe dort dazu einen Isssue erstellt https://github.com/i-doit/knowledge-base/issues/431
Danke. -
Hey @kholzenhauer
Immer in der Zeile "if (array_key_exists(....))" ist angeblich $configData ein Bool, kein Array.
Das ist richtig und passiert immer dann, wenn
parse_ini_file(...)
die übergebene INI Datei nicht verarbeiten konnte. Ich habe den Code dahingehend angepasst, das er dem Nutzer eine entsprechende Meldung ausgibt wenn eine INI Datei nicht gelesen / geparsed werden konnte.Dieser angepasste Code wird voraussichtlich mit i-doit 30 veröffentlicht werden
Viele Grüße
Leo