freeradius-server-2.1.3

Ogólnie rzecz biorąc można napisać, że freeradius-server-2.1.3, który ponoć jest najpopularniejszym serwerem RADIUS na świecie, nie jest zbyt dobrze przystosowany do kompilacji na systemie Solaris 10. Wprawdzie skrypt ‚configure’ niby sprawdza co trzeba i przechodzi bez większych boleści, to jednak na etapie kompilacji/linkowania pojawiają się problemy. Pierwszy który napotkałem, to taki, że Solarisowy ‚dmake’ (o standardowym /usr/ccs/bin/make nawet nie wspominam) tutaj nie zadziała, należy więc użyć GNU make (gmake). Następny problem się pojawia przy kompilacji modułu rlm_ldap służącego do uwierzytelniania/autoryzacji w katalogu LDAP. Nie wiedzieć czemu, nie bierze on pod uwagę flag wyższego poziomu i nie potrafi odnaleźć ścieżek do plików nagłówkowych i bibliotek LDAPa, co skutkuje błędami w stylu:

undefined symbol: LDAP_OPT_X_TLS_HARD
undefined symbol: LDAP_OPT_X_TLS

itd. Widać więc, że brakuje mu bibliotek z LDAPa. Jako, że u mnie są one w /usr/local/openldap/lib to oczywiście dopisałem je do LDFLAGS, oraz do opcji kompilacji:

        --with-rlm-ldap-includes="/usr/local/openldap/include" \
        --with-rlm-ldap-libraries="/usr/local/openldap/lib" \

ale jak zajrzymy do src/modules/rlm_ldap/Makefile to nie widać aby je tam dołożył.
Poszukiwanie w google zwróciło pewien wątek, gdzie problem jest ‚jakoś’ rozwiązany:
http://osdir.com/ml/freeradius.user/2003-02/msg00670.html
ale takie rozwiązanie mnie nie usatysfakcjonowało, postanowiłem więc zajrzeć do źródeł, a konkretnie do pliku src/modules/rlm_ldap/Makefile.in i spowodować aby moje flagi zostały dopisane do src/modules/rlm_ldap/Makefile na etapie konfiguracji. Jako że żadne studia informatyczne nie nauczyły mnie konstrukcji tych plików – nad czym ubolewam w takich momentach – to musiałem oprzeć się na intuicji i doświadczeniu i zmodyfikować plik po swojemu. Dopisałem więc zmienne $(CPPFLAGS) i $(LDFLAGS) do odpowiednich linii.
Zatem te linie w pliku src/modules/rlm_ldap/Makefile.in przed modyfikacją wyglądały tak:

TARGET     = @targetname@
SRCS       = rlm_ldap.c @edir@
HEADERS    =
RLM_CFLAGS = @ldap_cflags@
RLM_LIBS   = @ldap_ldflags@

po modyfikacji:

TARGET     = @targetname@
SRCS       = rlm_ldap.c @edir@
HEADERS    =
RLM_CFLAGS = $(CPPFLAGS) @ldap_cflags@
RLM_LIBS   = $(LDFLAGS) @ldap_ldflags@

Pewnie można to zrobić lepiej i sprytniej, ale generalnie takie rozwiązanie działa i jest satysfakcjonujące, bo można łatwo wytworzyć patcha na przyszłość (patrz załącznik).

Ale to jeszcze nie koniec przygód z kompilacją serwera FreeRADIUS. Następny problem pojawił się przy libtoolu, gdyż ten ze źródeł freeradiusa wcale nie chce działać, a mój systemowy nie potrafił sobie znaleźć wszystkich potrzebnych plików nagłówkowych. Sprawę rozwiązało dodanie opcji „-I/usr/local/include” do CFLAGS (zwykle dodaję tylko do CPPFLAGS).

No i już ostatnia przeszkoda, którą napotkałem to niezdefiniowany symbol SUN_LEN, błąd wyglądał mniej więcej tak:

Undefined                       first referenced
 symbol                             in file
SUN_LEN                             .libs/listen.o

ale i na to znalazłem remedium wykorzystując m.in. google:
http://lists.cistron.nl/pipermail/freeradius-users/2008-December/msg00350.html
zgodnie z zaleceniem zdefiniowałem więc w pliku src/include/radiusd.h

#define SUN_LEN(su)  (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))

i przekompilowałem jeszcze raz, tym razem już bez błędów. Zachowałem więc moją poprawioną wersję źródeł, rozpakowałem ponownie oryginalne źródła i wytworzyłem diffa, który jest w załączniku. Aby go nałożyć trzeba być w katalogu nadrzędnym dla źródeł freeradiusa i użyć polecenia:
$ patch -u -p0 < freeradius-server-2.1.3-s10-patch-by-drfugazi.diff
Na przykład:

user@server:/src/freeradius $ ls -1
freeradius-server-2.1.3
freeradius-server-2.1.3-s10-patch-by-drfugazi.diff
user@server:/src/freeradius $ patch -u -p0 < freeradius-server-2.1.3-s10-patch-by-drfugazi.diff

Oczywiście polecam użycie GNU patch (gpatch) i najpierw sprawdzenie co zrobi na sucho, czyli dołożyć opcje: --dry-run --verbose.
Dołączam również skrypt, którego użyłem do kompilacji serwera freeradius (drf_freeradius-2.1.3_conf).
Powodzenia !

Może Ci się również spodoba

Dodaj komentarz