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 !