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



--
Pozdrawiam
Marcin / nicraM