A blogban leírtak a szerzők saját véleménye, és nem a munkáltatójuké.

Tesztadatok generálása openLDAP-hoz

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.

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>