Announcement

Collapse
No announcement yet.

Freeradius MySQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Freeradius MySQL

    Moin Moin,

    Ich brauche für meinen Radius-Server (freeradius) eine Abfrage.

    Im moment ist es :
    sqlcounter noresetcounter {
    counter-name = Max-All-Session-Time
    check-name = Max-All-Session
    sqlmod-inst = sql
    key = User-Name
    reset = never
    query = "SELECT IFNULL(SUM(AcctSessionTime),0) FROM radacct WHERE UserName='%{%k}'"
    }


    http://www.pic-upload.de/view-8370166/1.jpg.html



    http://www.pic-upload.de/view-8370183/2.jpg.html


    Das ganze wird für einen WLAN-Hotspot benötigt, der z.B. auch Monatszugänge verwalten soll. Die Abfrage macht Probleme... wenn ich mich einlogge nimmt er immer nur die Zeit von der aktuellen Session, also hätte man einen ganzen Monat in Sekunden zum Surfen (Hier in dem Beispiel sind es 3600 Sekunden). Ich bin leider nicht der MySQL Guru. Ich hoffe es kann mir jemand helfen.

    Accstarttime(Bild2) + Value 3600(Bild1) = Zugang Ende ! Wäre sowas mögliche?

    Ich danke im Voraus.

    Gruß


    --------------------------------------------

    Ich weiss nicht ob das hier erlaubt ist, aber ich würde für die richtige Abfrage zahlen. Wer sich fit genug fühlt bitte per PN.

  • #2
    Hallo,
    Originally posted by disem View Post
    ...Ich bin leider nicht der MySQL Guru. Ich hoffe es kann mir jemand helfen.
    Was genau ist die Frage, bzw. wo/was ist das Problem? Wie sehen die benötigten Tabellenstrukturen aus? Beispieldaten!? Gewünschtes vs. erhaltenes Ergebnis!? Welcher Fehler tritt auf? Und was hat das konkret mit MySQL zu tun?

    Originally posted by disem View Post
    ...Accstarttime(Bild2) + Value 3600(Bild1) = Zugang Ende ! Wäre sowas mögliche?
    Was soll dieser Ausdruck bezwecken?
    MySQL kennt keine Funktion Accstarttime, wenn du diese jedoch selbst anlegst, dann wäre zumindest der erste Teil möglich. Ein Funktionsname nur aus Ziffern (3600) ist jedoch nicht möglich.

    Originally posted by disem View Post
    ...Ich weiss nicht ob das hier erlaubt ist, aber ich würde für die richtige Abfrage zahlen. Wer sich fit genug fühlt bitte per PN.
    Dafür gibt es Vermischtes > Jobs (keine Vermittlung!)

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      In den Screenshots sieht man die Werte Accstarttime, value etc.

      Etwas genauer(vlt. etwas wirr erklärt (: ) :

      Bleiben wir bei User : ix7dh68v5cyu

      In Bild1 :

      Ein Account besteht immer aus 2 Einträgen
      1. Nutzer und Passwort
      2. Nutzer und Länge der Nutzung (3600)

      Bild2 :

      Ist das Logging...

      Das Problem ist das er bei dem beispiel query "acctseesiontime" zusammenzählt und wenn da die 3600 erreicht sind ist der Acc ix7dh68v5cyu(3600sekunden) abgelaufen.

      Ich möchte aber das er nicht die sessions zählt, sondern acctstarttime+3600 und dann soll er abgelaufen sein. Ich hoffe das ist verständlich.

      Comment


      • #4
        Sorry, aber ich kann dir nicht folgen...

        Originally posted by disem View Post
        ...
        In Bild1 :

        Ein Account besteht immer aus 2 Einträgen
        1. Nutzer und Passwort
        2. Nutzer und Länge der Nutzung (3600)
        OK, das ist noch verständlich, in bild_1 sind sozusagen die "Stammdaten". Die 3600 für Nutzer ix7dh68v5cyu würde man also mit:
        [highlight=sql]
        select value from bild_1
        where username='ix7dh68v5cyu'
        and attribute='Max-All-Session'
        [/highlight]
        bekommen.

        Originally posted by disem View Post
        ...
        Bild2 :

        Ist das Logging...
        OK, Logging? Wo kommen die Werte her?

        Originally posted by disem View Post
        ...Das Problem ist das er bei dem beispiel query "acctseesiontime" zusammenzählt und wenn da die 3600 erreicht sind ist der Acc ix7dh68v5cyu(3600sekunden) abgelaufen.
        In deinem Beispiel wird AcctSessionTime summiert nicht gezählt (das wäre COUNT()) und wo ist da ein vergleich mit 3600 ?

        Originally posted by disem View Post
        ...Ich möchte aber das er nicht die sessions zählt, sondern acctstarttime+3600 und dann soll er abgelaufen sein. Ich hoffe das ist verständlich.
        Wie schon gesagt, nicht gezählt, sondern summiert... Was ist "acctstarttime+3600" für eine Bedingung? Da fehlt irgendwie der Vergleichswert...

        Originally posted by disem View Post
        ...also hätte man einen ganzen Monat in Sekunden zum Surfen (Hier in dem Beispiel sind es 3600 Sekunden).
        3600 Sekunden sind bei mir gerademal eine Stunde!? Wo kommt der Monat ins Spiel?

        Vlt. solltest du einfach mal das irrelevante drumherum weglassen und aufzeigen was du mit den in den Bildern ersichtlichen Daten für ein Ergebnis erwarten würdest.

        Anmerkung: Die Verwendung von Platzhaltern (%) macht im Zusammenhang mit = keinen Sinn. Oder wird hier %{%k} automatisch durch irgendwas ersetzt?
        Wenn ich mal davon ausgehe, dass %{%k} durch den Nutzernamen ersetzt wird, dann liefert die Abfrage:
        [highlight=sql]
        SELECT IFNULL(SUM(AcctSessionTime),0)
        FROM radacct
        WHERE UserName='ix7dh68v5cyu'
        [/highlight]
        für die Daten aus den Bildern: 37 (4+28+5).
        Welches Ergebnis würdest du denn erwarten bzw. hättest du gerne?

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Stimmt das Beispiel in den Bildern zeigt eine Stunde!

          "für die Daten aus den Bildern: 37 (4+28+5).
          Welches Ergebnis würdest du denn erwarten bzw. hättest du gerne?"

          für die Daten aus den Bildern?


          Generell kann ich in der Radius-Software nur eine Abfrage angeben

          Code:
                  sqlcounter noresetcounter {
          
                      counter-name = Max-All-Session-Time 
                      check-name = Max-All-Session 
                      sqlmod-inst = sql 
                      key = User-Name 
                      reset = never 
                      query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'" 
          
                  } 
          
                  sqlcounter dailycounter {
          
                      driver = "rlm_sqlcounter" 
                      counter-name = Daily-Session-Time 
                      check-name = Max-Daily-Session 
                      sqlmod-inst = sqlcca3 
                      key = User-Name 
                      reset = daily 
                      query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'" 
          
                  } 
          
                  sqlcounter monthlycounter {
          
                      counter-name = Monthly-Session-Time 
                      check-name = Max-Monthly-Session 
                      sqlmod-inst = sqlcca3 
                      key = User-Name 
                      reset = monthly 
                      query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'" 
          
                  }

          Das sind Die Beispiele die mitgeliefert werden.



          Die Werte aus dem Logging kommen von dem Radiusserver, wenn sich ein Hotspot-Gast anmeldet. Diese kann man also nicht beeinflussen.

          accstarttime = Anmeldung
          acctstoptime = Abmeldung (bzw. Timeout)
          acctsessiontime = Die Zeit in Sekunden, die der Hotspot-User Online war.

          Wenn bei Sessiontime 3600 erreicht sind, dann kann sich der Hotspot-User nicht mehr anmelden.

          Sorry klar ist es summiert
          acctstarttime+3600 <--- So stelle ich mir das vor
          Sobald der Gast sich anmeldet, dann sollen nicht die acctsessiontime Summiert werden.

          Ich möchte das der Hotspot Gast abgemeldet wird, sobald von dem ersten mal anmelden (kleinster accstarttime Wert) bis 3600 sekunden weiter. Die acctsessiontime soll bei der Abfrage nicht berücksichtigt werden.

          Es müssten irgendwie 2 Tabellen abgefragt und verglichen werden.



          %{%k} Ist ein Platzhalter von dem Server, wird wie du schon sagtest durch den Benutzernamen ersetzt.


          Ich danke vielmals für deine Hilfe!

          Comment


          • #6
            Originally posted by disem View Post
            ...Sobald der Gast sich anmeldet, dann sollen nicht die acctsessiontime Summiert werden.

            Ich möchte das der Hotspot Gast abgemeldet wird, sobald von dem ersten mal anmelden (kleinster accstarttime Wert) bis 3600 sekunden weiter. Die acctsessiontime soll bei der Abfrage nicht berücksichtigt werden.
            Also wenn ich das jetzt richtig verstanden habe, dann möchtest du prüfen, ob "kleinster accstarttime Wert" + 3600 < "aktuelle Zeit" ist!? Oder andersherum ist "aktuelle zeit" - "kleinster accstarttime Wert" > 3600?

            Die aktuelle Zeit mit Datum bekommt man mit NOW() und zur Addition von Zeiten kann man ADDDATE() verwenden.

            Das ganze in eine Abfrage verpackt könnte auch so aussehen:
            [highlight=sql]
            SELECT TIME_TO_SEC(TIMEDIFF(NOW(), min(acctstarttime)))
            FROM radacct
            WHERE UserName='%{%k}'
            [/highlight]
            Den zurückgelieferte Wert kannst du dann mit deinen Stammdaten vergleichen. Ist er größer als 3600, ist die Zeit abgelaufen.

            Ob der User jedoch exakt nach Ablauf der zeit ausgeloggt wird, hängt davon ab, wieoft dies von deinem Server überprüft wird.

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Das hört sich sehr gut an! Gibt es eine Möglichkeit diesen Vergleich in eine Abfrage zu verpacken? Aus einer zweiten Tabelle? Die Software unterstützt es nur so wie im Beispiel, also es müsste eine Abfrage sein. Ist join die Lösung?

              Originally posted by Falk Prüfer View Post
              Den zurückgelieferte Wert kannst du dann mit deinen Stammdaten vergleichen. Ist er größer als 3600, ist die Zeit abgelaufen.

              Comment


              • #8
                Originally posted by disem View Post
                ... Gibt es eine Möglichkeit diesen Vergleich in eine Abfrage zu verpacken? Aus einer zweiten Tabelle? Die Software unterstützt es nur so wie im Beispiel, also es müsste eine Abfrage sein. Ist join die Lösung?
                Sicher kann mann das in eine Abfrage packen. Die Frage ist nur was diese als Ergebnis haben muss!?
                Ich kenne deine Software nicht, kann dir da also auch nicht helfen.

                Gruss Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Der Eintrag wird geschrieben, wenn die Zeit um ist.

                  Das Ergebnis müsste ein Datenbankeintrag sein, der Session-Timeout (AcctTerminateCase) enthält.

                  AcctTerminateCause = Session-Timeout

                  Code:
                  [sql_log]       expand: INSERT INTO radacct (AcctSessionId, 
                  UserName,
                  NASIPAddress, 
                  FramedIPAddress,
                   AcctStartTime, 
                  AcctStopTime,    
                   AcctSessionTime, 
                  AcctTerminateCause) VALUES                         
                   ('%{Acct-Session-Id}',
                   '%{User-Name}',
                   '%{NAS-IP-Address}',
                  '%{Framed-IP-Address}', 
                  '0', '%S',
                   '%{Acct-Session-Time}',
                  '%{Acct-Terminate-Cause}'); ->
                  
                   INSERT INTO radacct 
                  (AcctSessionId, 
                  UserName,    
                  NASIPAddress, 
                  FramedIPAddress, 
                  AcctStartTime, 
                  AcctStopTime,         
                   AcctSessionTime, 
                  AcctTerminateCause) VALUES                    
                   ('4d245cf100000000',
                   'i4mnpj', '0.0.0.0',       
                  '192.168.6.2', 
                  '0',
                   '2011-01-05 12:08:29', 
                  '62',    
                   'Session-Timeout');
                  Das passiert, wenn man de Logout Button drückt!

                  AcctTerminateCause = User-Request
                  Code:
                  [sql_log]       expand: INSERT INTO radacct
                   (AcctSessionId, 
                  UserName,    
                  NASIPAddress, 
                  FramedIPAddress, 
                  AcctStartTime,
                   AcctStopTime,   
                    AcctSessionTime,
                   AcctTerminateCause) VALUES                        
                    ('%{Acct-Session-Id}', 
                  '%{User-Name}',
                   '%{NAS-IP-Address}', 
                   '%{Framed-IP-Address}',
                  '0', '%S', 
                  '%{Acct-Session-Time}',          
                   '%{Acct-Terminate-Cause}'); ->
                   INSERT INTO radacct (AcctSessionId, 
                  UserName,    
                  NASIPAddress, 
                  FramedIPAddress,
                   AcctStartTime,
                   AcctStopTime,         
                   AcctSessionTime, 
                  AcctTerminateCause) VALUES                  
                     ('4d245f3d00000000', 
                  'n7t5u3', 
                  '0.0.0.0',      
                   '192.168.6.2',
                   '0', 
                  '2011-01-05 12:14:25',
                   '8',     
                   'User-Request');

                  Das müsste es sein, oder?

                  Comment

                  Working...
                  X