Witam Męczę się by ożenić freeradiusa z lms, sesje i statystyki.
jak na razie mam coś takiego: #v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type { start { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'; \ INSERT INTO nodesessions (customerid,nodeid,ipaddr,mac,start,stop,tag,type) VALUES \ ((SELECT ownerid FROM nodes WHERE name='%{SQL-User-Name}'),\ (SELECT id FROM nodes WHERE name='%{SQL-User-Name}'),\ INET_ATON('%{Framed-IP-Address}'),\ '%{Calling-Station-Id}',\ '%{integer:Event-Timestamp}',\ '%{integer:Event-Timestamp}',\ '%{Acct-Session-Id}',\ '1')" }
interim-update { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}' \ WHERE tag = '%{Acct-Session-Id}'" }
stop { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}', \ terminatecause = '%{Acct-Terminate-Cause}' \ WHERE tag = '%{Acct-Session-Id}'" } # # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v-
niestety musiałem użyć 2x INSERT/UPDATE w query, bo freeradius wykonuje tylko pierwsze jeśli się uda. do tego momentu jest ok, problem pojawił mi się kiedy muszę dodać dane do tabeli stats a raczej je updateować. podpowie ktoś?
przy update mam takie dane: #v+ (3) Service-Type = Framed-User (3) Framed-Protocol = PPP (3) NAS-Port = 52 (3) NAS-Port-Type = Ethernet (3) User-Name = "Wioletta_W (3) Calling-Station-Id = "E4:88:88:CC:0A:1A" (3) Called-Station-Id = "pppoe_server" (3) NAS-Port-Id = "bridge1" (3) Acct-Session-Id = "8160002f" (3) Framed-IP-Address = 192.168.3.206 (3) Acct-Authentic = RADIUS (3) Event-Timestamp = "Dec 9 2015 14:20:32 CET" (3) Acct-Session-Time = 600 (3) Acct-Input-Octets = 15262 (3) Acct-Input-Gigawords = 0 (3) Acct-Input-Packets = 160 (3) Acct-Output-Octets = 106 (3) Acct-Output-Gigawords = 0 (3) Acct-Output-Packets = 11 (3) Acct-Status-Type = Interim-Update (3) NAS-Identifier = "MikroTik" (3) Acct-Delay-Time = 0 (3) NAS-IP-Address = 172.21.7.202 #v-
z góry dzięki
W dniu 09.12.2015 14:23, Marcin napisał(a):
Witam
Cześć,
Męczę się by ożenić freeradiusa z lms, sesje i statystyki.
Lepiej na żywo rekordów w bazie danych sql nie aktualizować przy żądaniach nadchodzących do serwera radius. nodes.lastonline i nodesession aktualizować wsadowo co jakiś czas odrębnym skryptem, który załatwi hurtowe przetworzenie logów accountingu trzymanych w sensownym pliku tekstowym. Tabelę stats rozważyć zastąpieniem przez rra.
jak na razie mam coś takiego: #v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type { start { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'; \ INSERT INTO nodesessions (customerid,nodeid,ipaddr,mac,start,stop,tag,type) VALUES \ ((SELECT ownerid FROM nodes WHERE name='%{SQL-User-Name}'),\ (SELECT id FROM nodes WHERE name='%{SQL-User-Name}'),\ INET_ATON('%{Framed-IP-Address}'),\ '%{Calling-Station-Id}',\ '%{integer:Event-Timestamp}',\ '%{integer:Event-Timestamp}',\ '%{Acct-Session-Id}',\ '1')" }
interim-update { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}' \ WHERE tag = '%{Acct-Session-Id}'" }
stop { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}', \ terminatecause = '%{Acct-Terminate-Cause}' \ WHERE tag = '%{Acct-Session-Id}'" } # # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v-
niestety musiałem użyć 2x INSERT/UPDATE w query, bo freeradius wykonuje tylko pierwsze jeśli się uda.
do tego momentu jest ok,
problem pojawił mi się kiedy muszę dodać dane do tabeli stats a raczej je updateować.
podpowie ktoś?
przy update mam takie dane:
#v+ (3) Service-Type = Framed-User (3) Framed-Protocol = PPP (3) NAS-Port = 52 (3) NAS-Port-Type = Ethernet (3) User-Name = "Wioletta_W (3) Calling-Station-Id = "E4:88:88:CC:0A:1A" (3) Called-Station-Id = "pppoe_server" (3) NAS-Port-Id = "bridge1" (3) Acct-Session-Id = "8160002f" (3) Framed-IP-Address = 192.168.3.206 (3) Acct-Authentic = RADIUS (3) Event-Timestamp = "Dec 9 2015 14:20:32 CET" (3) Acct-Session-Time = 600 (3) Acct-Input-Octets = 15262 (3) Acct-Input-Gigawords = 0 (3) Acct-Input-Packets = 160 (3) Acct-Output-Octets = 106 (3) Acct-Output-Gigawords = 0 (3) Acct-Output-Packets = 11 (3) Acct-Status-Type = Interim-Update (3) NAS-Identifier = "MikroTik" (3) Acct-Delay-Time = 0 (3) NAS-IP-Address = 172.21.7.202
#v-
z góry dzięki
--
Pozdrawiam Marcin / nicraM
lms mailing list lms@lists.lms.org.pl http://lists.lms.org.pl/mailman/listinfo/lms
W dniu 9 grudnia 2015 14:27 użytkownik Tomasz Chiliński < tomasz.chilinski@chilan.com> napisał:
W dniu 09.12.2015 14:23, Marcin napisał(a):
Witam
Cześć,
Męczę się by ożenić freeradiusa z lms, sesje i statystyki.
Lepiej na żywo rekordów w bazie danych sql nie aktualizować przy żądaniach nadchodzących do serwera radius.
Tych żądań nie ma tak dużo więc zdecydowałem na bezpośrednie zmiany do bazy
nodes.lastonline i nodesession aktualizować wsadowo co jakiś czas odrębnym skryptem, który załatwi hurtowe przetworzenie logów accountingu trzymanych w sensownym pliku tekstowym. Tabelę stats rozważyć zastąpieniem przez rra.
rra?
jak na razie mam coś takiego:
#v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type { start { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'; \ INSERT INTO nodesessions (customerid,nodeid,ipaddr,mac,start,stop,tag,type) VALUES \ ((SELECT ownerid FROM nodes WHERE name='%{SQL-User-Name}'),\ (SELECT id FROM nodes WHERE name='%{SQL-User-Name}'),\ INET_ATON('%{Framed-IP-Address}'),\ '%{Calling-Station-Id}',\ '%{integer:Event-Timestamp}',\ '%{integer:Event-Timestamp}',\ '%{Acct-Session-Id}',\ '1')" }
interim-update { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}' \ WHERE tag = '%{Acct-Session-Id}'" }
stop { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}', \ terminatecause = '%{Acct-Terminate-Cause}' \ WHERE tag = '%{Acct-Session-Id}'" } # # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v-
niestety musiałem użyć 2x INSERT/UPDATE w query, bo freeradius wykonuje tylko pierwsze jeśli się uda.
do tego momentu jest ok,
problem pojawił mi się kiedy muszę dodać dane do tabeli stats a raczej je updateować.
podpowie ktoś?
przy update mam takie dane:
#v+ (3) Service-Type = Framed-User (3) Framed-Protocol = PPP (3) NAS-Port = 52 (3) NAS-Port-Type = Ethernet (3) User-Name = "Wioletta_W (3) Calling-Station-Id = "E4:88:88:CC:0A:1A" (3) Called-Station-Id = "pppoe_server" (3) NAS-Port-Id = "bridge1" (3) Acct-Session-Id = "8160002f" (3) Framed-IP-Address = 192.168.3.206 (3) Acct-Authentic = RADIUS (3) Event-Timestamp = "Dec 9 2015 14:20:32 CET" (3) Acct-Session-Time = 600 (3) Acct-Input-Octets = 15262 (3) Acct-Input-Gigawords = 0 (3) Acct-Input-Packets = 160 (3) Acct-Output-Octets = 106 (3) Acct-Output-Gigawords = 0 (3) Acct-Output-Packets = 11 (3) Acct-Status-Type = Interim-Update (3) NAS-Identifier = "MikroTik" (3) Acct-Delay-Time = 0 (3) NAS-IP-Address = 172.21.7.202
#v-
z góry dzięki
--
Pozdrawiam Marcin / nicraM
lms mailing list lms@lists.lms.org.pl http://lists.lms.org.pl/mailman/listinfo/lms
-- Pozdrawiam Tomasz Chiliński, Chilan _______________________________________________ lms mailing list lms@lists.lms.org.pl http://lists.lms.org.pl/mailman/listinfo/lms
W dniu 2015-12-09 o 14:23, Marcin pisze:
Witam Męczę się by ożenić freeradiusa z lms, sesje i statystyki.
jak na razie mam coś takiego: #v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type { start { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'; \ INSERT INTO nodesessions (customerid,nodeid,ipaddr,mac,start,stop,tag,type) VALUES \ ((SELECT ownerid FROM nodes WHERE name='%{SQL-User-Name}'),\ (SELECT id FROM nodes WHERE name='%{SQL-User-Name}'),\ INET_ATON('%{Framed-IP-Address}'),\ '%{Calling-Station-Id}',\ '%{integer:Event-Timestamp}',\ '%{integer:Event-Timestamp}',\ '%{Acct-Session-Id}',\ '1')" }
interim-update { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}' \ WHERE tag = '%{Acct-Session-Id}'" }
stop { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}', \ terminatecause = '%{Acct-Terminate-Cause}' \ WHERE tag = '%{Acct-Session-Id}'" } # # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v-
Jeżeli chodzi o sam status online to wystarczy dodać
w accounting_start_query i accounting_update_query = " \ UPDATE nodes SET lastonline = unix_timestamp() WHERE name='%{User-Name}'" (to dla mysql)
trzeba też w UI ustawić odpowiedni czas lastonline_limit który musi być większy niż czas interim-update
2015-12-11 10:19 GMT+01:00 Daniel Kulesza d.kulesza@ig-zp.pl:
W dniu 2015-12-09 o 14:23, Marcin pisze:
Witam
Męczę się by ożenić freeradiusa z lms, sesje i statystyki.
jak na razie mam coś takiego: #v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type { start { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'; \ INSERT INTO nodesessions (customerid,nodeid,ipaddr,mac,start,stop,tag,type) VALUES \ ((SELECT ownerid FROM nodes WHERE name='%{SQL-User-Name}'),\ (SELECT id FROM nodes WHERE name='%{SQL-User-Name}'),\ INET_ATON('%{Framed-IP-Address}'),\ '%{Calling-Station-Id}',\ '%{integer:Event-Timestamp}',\ '%{integer:Event-Timestamp}',\ '%{Acct-Session-Id}',\ '1')" }
interim-update { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}' \ WHERE tag = '%{Acct-Session-Id}'" }
stop { query = "UPDATE nodes SET lastonline =
EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';\ UPDATE nodesessions \ SET \ download = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint), \ upload = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint), \ stop = '%{integer:Event-Timestamp}', \ terminatecause = '%{Acct-Terminate-Cause}' \ WHERE tag = '%{Acct-Session-Id}'" } # # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v-
Jeżeli chodzi o sam status online to wystarczy dodać
w accounting_start_query i accounting_update_query = " \ UPDATE nodes SET lastonline = unix_timestamp() WHERE name='%{User-Name}'" (to dla mysql)
tak jest w radiusie < 3, od 3 zmieniła się nie co struktura konfiguracji. I tak, wystarczy ten upate dla samego statusu jak widać z mojego przykładu. Problem jedynie miałem z jednoczesnym updateowaniem kilku tabel jednocześnie bo chciałem dopisać do tabeli stat. w nowej konfiguracji można zapisać kilka query="", freeradius czyta je po kolei jeślli będą następowały błędy, więc wykona się tylko pierwsze, które zwróci poprawność wykonania. sami developerzy freeradiusa powiedzili mi, że trzeba zrobić tak jak ja zrobiłem, czyli dwa zapytania w jednym query, ale tu może być problem bazodanowy, bo baza może tego nie wspierać lub zrobić dwa osobne moduły i je odpalać. kolejnym problemem okazało się wstawienie do tabeli stats id z nodeseesions, gdzyż radius nie tego nie podaje, trzeba czytać z bazy. dlatego zdecydowałem się na logwanie tego linein'em do pliku i zaczytywanie do bazy. obecnie robię tylko proste inserty i update:
#v+ accounting { reference = "%{tolower:type.%{%{Acct-Status-Type}:-none}.query}"
type {
accounting-on { query = "UPDATE nodesessions SET terminatecause = 'NAS-Reboot' WHERE terminatecause = ''" }
accounting-off { query = "${..accounting-on.query}" }
start { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{SQL-User-Name}'" }
interim-update { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';" }
stop { query = "UPDATE nodes SET lastonline = EXTRACT(EPOCH FROM now()) WHERE name='%{User-Name}';" }
# # No Acct-Status-Type == ignore the packet # none { query = "SELECT true" } } }
#v- Jak widać jest do dla postgresa, ale nie wiele trzeba przerobić by zadziałało na mysql. Resztę jak wspomniałem robię linelogiem
trzeba też w UI ustawić odpowiedni czas lastonline_limit który musi być większy niż czas interim-update
lms mailing list lms@lists.lms.org.pl http://lists.lms.org.pl/mailman/listinfo/lms
uczestnicy (3)
-
Daniel Kulesza
-
Marcin
-
Tomasz Chiliński