unlang 'if' expansion
Pshem Kowalczyk
pshem.k at gmail.com
Wed Jul 2 00:39:32 CEST 2008
Hi,
We use freeradius 2.0.5, currently for testing. I've encountered a
weird problem with if expansion:
config:
server local_logger {
listen {
type = detail
filename = ${radacctdir}/detail_local
load_factor = 20
}
listen {
type = acct
ipaddr = *
port = 1822
secret = xxxxxx
}
accounting {
if ("%{Acct-Session-Time}" == 0 &&
"%{Acct-Delay-Time}" == 0 && "%{Acct-Status-Type}" == "Stop"){
ok
}
else{
sql_localhost
}
}
}
debug:
detail_recv: Read packet from /var/log/freeradius/radacct/detail_local
User-Name = "roatt"
NAS-Port = 117440512
NAS-IP-Address = 10.119.255.91
Framed-IP-Address = xx.yy..135.238
Filter-Id = "normal"
NAS-Identifier = "akl-grafton-bras2"
Acct-Status-Type = Interim-Update
Acct-Delay-Time = 23
Acct-Input-Octets = 2253089
Acct-Output-Octets = 26743952
Acct-Session-Id = "akl-gra07000000000000e3b284039482"
Acct-Authentic = RADIUS
Acct-Session-Time = 27000
Acct-Input-Packets = 20268
Acct-Output-Packets = 27407
Acct-Input-Gigawords = 0
Acct-Output-Gigawords = 0
Event-Timestamp = "Jul 2 2008 10:26:27 NZST"
NAS-Port-Type = Virtual
Calling-Station-Id = "GigabitEthernet
10/0.90810:9-810#587203901#INFA290611:RIC-RAN-21 to RIC-ETH51 port
2/1/1##pppoe 00:90:d0:6a:aa:eb#"
NAS-Port-Id = "slot=7;subslot=0;port=0;vlanid=0;"
Tunnel-Type:0 = L2TP
Tunnel-Medium-Type:0 = IPv4
Tunnel-Server-Endpoint:0 = "10.176.0.230"
Tunnel-Client-Endpoint:0 = "222.152.43.30"
Service-Type = Framed-User
Framed-Protocol = PPP
Huawei-IPHost-Addr = "xx.yy.135.238 ff:ff:ff:ff:ff:ff"
Huawei-Input-Peak-Rate = 0
Huawei-Input-Average-Rate = 0
Huawei-Output-Peak-Rate = 0
Huawei-Output-Average-Rate = 0
Huawei-Priority = 0
Huawei-Connect-ID = 39482
Huawei-Domain-Name = "ihug-ubs"
Huawei-Qos-Profile-Name = "default"
Proxy-State = 0x313134
Huntgroup-Name = "ADSL"
Acct-Unique-Session-Id = "c5f44e1423b4012a"
server local_logger {
+- entering group accounting
++? if ("%{Acct-Session-Time}" == 0 && "%{Acct-Delay-Time}" == 0 &&
"%{Acct-Status-Type}" == "Stop")
expand: %{Acct-Session-Time} -> 27000
? Evaluating ("%{Acct-Session-Time}" == 0 ) -> FALSE
Skipping ("%{Acct-Delay-Time}" == 0 )
++? if ("%{Acct-Session-Time}" == 0 && "%{Acct-Delay-Time}" == 0 &&
"%{Acct-Status-Type}" == "Stop") -> TRUE
++- entering if ("%{Acct-Session-Time}" == 0 && "%{Acct-Delay-Time}"
== 0 && "%{Acct-Status-Type}" == "Stop")
+++[ok] returns ok
++- if ("%{Acct-Session-Time}" == 0 && "%{Acct-Delay-Time}" == 0 &&
"%{Acct-Status-Type}" == "Stop") returns ok
++ ... skipping else for request 1: Preceding "if" was taken
} # server local_logger
As you can see the first condition evaluates to FALSE (which is
expected, but then the whole expression turns TRUE, which is somewhat
unexpected.
The reason for having that condition is to filter out packets that
have 0 session time that cause issues with rlm_sql.
If I re-write to condition like this:
accounting {
if ("%{Acct-Session-Time}" == 0){
if ("%{Acct-Delay-Time}" == 0){
if ("%{Acct-Status-Type}" == "Stop"){
ok
}
else{
sql_localhost
}
}
else{
sql_localhost
}
}
else{
sql_localhost
}
}
it works as expected, just looks ugly :-(
kind regards
Pshem
More information about the Freeradius-Users
mailing list