PyLDAP search

+1 vote
asked Mar 22, 2014 in IRF tantárgy by jurzs (28 points)  

A PyLDAP használata közben egy számomra furcsa hibába ütköztem. Amennyiben a python scriptet kézzel viszem be (vagyis beírom a konzolba, hogy python3 és soronként a kódot), akkor rendben lefut a keresésem. 79 ember felel meg a feltételeknek (nincs e-mail címe vagy telefonszáma).

De ha ugyanezeket a parancsokat lementem test.py néven, s onnan indítom el, akkor "pyldap.errors.LDAPError: Size limit exceeded" errort kapok. Ez azt jelenti, hogy a lekérdezés közben túllépem a szerveren beállított limitet.

Ugyanezt történik, ha a projekteket akarom lekérdezni.

Van valakinek bármi ötlete, hogy ezt miként lehet megoldani?

3 Answers

+3 votes
answered Mar 22, 2014 by manoman (102 points)  
selected Mar 23, 2014 by jurzs
 
Best answer

A search paraméterei közé vegyé fel egy "sizelimit=(int)" paramétert.
Például 100-al szerintem menni fog.

commented Mar 22, 2014 by nadudvarit (1,121 points)  
Szia, a fenti megoldásnak működnie kell.
Egy másik lehetőség a /etc/openldap/ldap.conf fájlba beállítani a SIZELIMIT-et egy kellően nagy számra. Az ldap.conf-ban rendszerszinten lehet az LDAP kliensek számára beállítást megadni.
Maga a probléma elég érdekes, én is futottam már bele egy korábbi - még a hallgatók számára nem publikus - VM változatban, de például a mostani v2-es VM-en az előbb futtattam le egy 200-nál több entryt visszaadó szkriptet minden sizelimit módosítás nélkül.
Nagy segítség lenne, ha konfig fájl módosítás előtt megnéznéd, hogy ldapsearch-et használva ugyanarra a lekérdezésre előjön-e ez a probléma.  
A javítóknak mindenképp jelezve lesz, hogy kellően nagy sizelimittel futtassák a szkripteket javításkor.
commented Mar 23, 2014 by jurzs (28 points)  
Szia,
ldapsearch-et kipróbáltam ugyanerre a lekérdezésre és minden probléma nélkül lefutott. Visszaadta a lekérdezésnek megfelelő összes személyt. Ezután újra megnéztem a PyLDAP még át nem írt változatával, s újból hibát kaptam.

Sizelimit paraméter felvétele tényleg megoldotta a problémámat. Köszönöm!

Megnéztem a /etc/openldap/ldap.conf fájlt, ott 12 a SIZELIMIT. Mivel módosítása nélkül is sikerült mindkét search, így inkább nem módosítottam.
commented Mar 23, 2014 by nadudvarit (1,121 points)  
Köszönöm, hogy megnézted az ldapsearch-csel is.

Megjegyzés: a konfig fájlban a #-tal kezdődő sor megjegyzést jelöl, azaz nem éles beállítás. Szerintem a SIZELIMIT előtt is van egy kettős kereszt (legalábbis nálam volt), vagyis valójában nincs beállítva. Erre máskor érdemes figyelni.
commented Mar 29, 2014 by Pietro (72 points)  
Sziasztok! Hátha segít valakinek, kifejtettem egy picit bővebben a sizelimites megközelítést, ami valóban működőképes, csak nem biztos, hogy egyből egyértelmű, hogyan (újabb válaszba raktam a saját megoldásomat kommentár helyett, mert itt kommentben nehezen áttekinthető a kód): http://q2a.inf.mit.bme.hu/971/pyldap-search?show=1032#a1032
0 votes
answered Mar 28, 2014 by majgab91 (77 points)  

Sziasztok!

Nekem is hasonló problémám lenne. Elvégzek egy lekérdezést, ami Directory Studioban tökéletesen lefut, egész pontosan 304 találatot kapok rá. Azonban python-ból folyamatosan Size limit exceeded errort kapok. Próbáltam mindkétfajta beállítást, a konfig fájl szerkesztését és a search végére "sizelimit=500" beszúrást is, mégis folyamatosan ezt az errort kapom. Mit lehet a probléma?

commented Mar 28, 2014 by nadudvarit (1,121 points)  
Nem sok ötletet tudok adni. :( Esetleg, hogy valami nevetségesen nagy de a sima intbe még beférő számot adjál meg (pl.: 10000) a konfig fájlban (és persze figyelj, hogy ne legyen kikommentezve.)

Mivel a hiba nem éppen reprodukálható, így debugolni sem tudom. Ráadásul olyan még nem volt, hogy a sizelimit paraméter ne oldotta volna meg.
(Egy másik ötlet, hogy töröld le majd szed le újra VM-et, de ennek tényleg semmi tudományos alapja nincsen)
commented Mar 28, 2014 by majgab91 (77 points)  
Oké, rájöttem. Nem részletezem, működik az ismertetett megoldás (sizelimit). Ekkor marhaságot már régen csináltam...

u.i. Ha valaki hasonlóan kétségbe lenne esve: manoman válaszában az "-ek és a (int) ne zavarjon meg...
commented Mar 28, 2014 by nadudvarit (1,121 points)  
Engem érdekelnének a részletek. :)
Mármint ha a paraméterezést rontottad el akkor, azzal kapcsolatban kellett volna hibát kapni, és nem sizelimit-tel kapcsolatban.
commented Mar 29, 2014 by majgab91 (77 points)  
Hát igazándiból elég ciki, de én így írtam be a kódba:

search("base", 2, "query", "sizelimit=100")

És itt a sizelimit=100-at nem kellett volna "-ekbe tennem.
0 votes
answered Mar 29, 2014 by Pietro (72 points)  
edited Mar 29, 2014 by Pietro

Az itt említett sizelimites válasz a célravezető; de elsőre a megoldás számomra kicsit félreérthető volt, amíg meg nem néztem az API-t (ezt az egészet komment helyett inkább külön válaszba raktam a beillesztett kód áttekinthetősége érdekében):
http://pyldap.readthedocs.org/en/latest/api.html#pyldap.LDAPConnection.search

A lényeg egy rövid példán keresztül, hogy mindegyik argumentumnak lehet akár valami alapértelmezett értéke, és ezekkel meghívva a .search() metódust már jól működik a dolog, és nem kaptam "Size limit exceeded" hibaüzenetet:

attrlist,timeout,sizelimit,attrsonly= [], 0, 0, False # természetesen a változóknak történő értékadást lehetne külön-külön sorokba is rakni, hogy áttekinthetőbb legyen

searchResult = conn.search(args.organizationalunit, 2, "(objectClass=person)", 
                           attrlist, timeout, sizelimit, attrsonly)

SZERK.:

hmm, így is működik (mégis?):

searchResult = conn.search(args.organizationalunit, 2, "(objectClass=person)",
                           sizelimit=0)
...