Az előzőekben leírtak alapján sikerült egy Active Directoryt feltölteni tesztadatokkal. A házi feladatok egy része viszont Linux alatt, bash szkriptekkel openLDAP szerver használatáról szól, így szükségünk volt ehhez is tesztadatokra.
Az elképzelt munkafolyamat úgy nézett ki, hogy elkészítjük a felhasználókat CSV-ben, azt importáljuk csvde-vel az Active Directoryba, majd ldifde-vel az adatokat exportáljuk, végül ezt betöltjük ldapadd-dal. A máskülönben csodás tervbe ott csúszott hiba, hogy az AD-ból kiexportált adatok kissé zajosak, rengeteg olyan adat került bele, amit az ldapadd nem hajlandó kezelni.
Sebaj, nem véletlen tanulnak a hallgatók IRF keretében szkriptelést: egy kis bash-mágia és máris kész lesz a megtisztított, ldapadd által emészthető bemenet. Néhány óra próbálkozás után kiderült, hogy annyira talán mégsem egyszerű.
Azért a szkriptekbe vetett hitünket nem veszítettük el, végül ez vezetett megoldásra, csak nem bash szkriptet írtunk, hanem PowerShellt és nem az ldifde kimenetét alakítottuk át, hanem közvetlen a generált adatokat, CSV-ben.
Ehhez először azt kellett megoldani, hogy az LDIF kimenetben a sorok hossza maximálva van. Amennyiben egy sor túl hosszú (márpedig a DN-ek gyakran hosszúak), akkor a sorba sortörés kerül, majd az új sor eleje egy szóközzel kezdődik és folytatódik a megtört sor. Például:
dn: cn=Beijingstaff,ou=Beijing,ou=China,ou=Asia,ou=Hotels,dc =irf,dc=local
Erre írtam egy külön függvényt PowerShellben, ami egy változóban megadott hosszúságúra tördelve írja ki a paraméterül kapott sztringet:
function WriteLdifFormat { param ([string]$str)
$ROWMAXLEN = 60; $first = $true; while ($str.Length -gt 0) { $out = $str.Substring(0,[Math]::Min($ROWMAXLEN,$str.Length)) if ($str.Length -gt $ROWMAXLEN) { $str = $str.Substring($ROWMAXLEN, $str.Length-$ROWMAXLEN) } else { $str = [string]::Empty } #write to output if ($first) { write "$out"; $first=$false; $ROWMAXLEN--;} else { write " $out" } } }
A konvertálás többi része már egyszerűen megoldható volt. Az Import-Csv cmdlettel könnyű CSV-fájlokon dolgozni. A fájl sorain iterálva minden sorban megvizsgáltam a leírt objektum típusát (objectClass), majd ennek megfelelő kimenetet gyártottam, például:
WriteLdifFormat "dn: $($_.dn)" WriteLdifFormat "objectClass: top" if ($_.objectClass -eq "organizationalUnit") { WriteLdifFormat "objectClass: organizationalUnit" WriteLdifFormat "ou: $($_.ou)" WriteLdifFormat "description: $($_.name) Organizational Unit" }
Utána ezt testre lehet szabni, volt néhány plusz igényünk (például a domainneveket le kellett cserélni, uidNumbert kellett generálni a felhasználóknak, meg kellett oldani, hogy olyan csoportok is létezhessenek, amelyeknek nincs valódi tagja, az OU-khoz létrehozott csoportokra sem használhattuk Linuxon az eddigi PowerShell szkriptet stb.).
Az elkészült szkriptek és az LDIF kimenet itt letölthetőek.