Unable to match an mysql string response in freeradius - mysql

I using freeradius 2.2.8 and mysql for sending our coa/disconnect messages via freeradius when a bandwidth quota is hit. That part of the code is working great. Unfortunately for me the coa/disconnect message is sent out even though an Accounting Stop is sent out by the NAS. In order to prevent that from happening I am putting a condition where in I pull the acct termination cause from mysql radacct table and compare it against some strings.
Under accounting,
update control {
....
Tmp-String-0 := "%{sql:SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}'}}"
***if ("%{control:Tmp-String-0}" != "User-Request")***{
if (("%{control:Tmp-Integer-0}" > "%{control:Tmp-Integer-2}") || ("%{control:Tmp-Integer-1}" > "%{control:Tmp-Integer-3}")){
if ("%{control:coa_dm}" == "coa"){
update coa {
User-Name = "%{User-Name}"
Acct-Session-Id = "%{Acct-Session-Id}"
NAS-IP-Address = "%{NAS-IP-Address}"
#Filter-Id = "UN-AUTHORIZED-PROFILE"
Framed-IP-Address = "%{Framed-IP-Address}"
Session-Timeout = 10
}
}
if ("%{control:coa_dm}" == "dm"){
update disconnect {
User-Name = "%{User-Name}"
NAS-IP-Address = "%{NAS-IP-Address}"
}
}
}
}
As per the freeradius debug logs we can see that the string should be a match and the program should avoid the inside if conditions. Unfortunately that is not the case and the 1st IF condition always returns true.
***Thu May 17 17:43:41 2018 : Info: expand: SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}' -> SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='kiranc' AND radacct.acctsessionid='5AFD71CB-3FE1C000'
Thu May 17 17:43:41 2018 : Debug: rlm_sql (sql): Reserving sql socket id: 16
Thu May 17 17:43:41 2018 : Info: sql_xlat finished
Thu May 17 17:43:41 2018 : Debug: rlm_sql (sql): Released sql socket id: 16
Thu May 17 17:43:41 2018 : Info: expand: %{sql:SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}'}} -> User-Request}
Thu May 17 17:43:41 2018 : Info: ++} # update control = noop
Thu May 17 17:43:41 2018 : Info: ++? if ("%{control:Tmp-String-0}" != "User-Request")
Thu May 17 17:43:41 2018 : Info: expand: %{control:Tmp-String-0} -> User-Request}
Thu May 17 17:43:41 2018 : Info: ? Evaluating ("%{control:Tmp-String-0}" != "User-Request") -> TRUE***
Thu May 17 17:43:41 2018 : Info: ++? if ("%{control:Tmp-String-0}" != "User-Request") -> TRUE
Thu May 17 17:43:41 2018 : Info: ++if ("%{control:Tmp-String-0}" != "User-Request") {
Thu May 17 17:43:41 2018 : Info: +++? if (("%{control:Tmp-Integer-0}" > "%{control:Tmp-Integer-2}") || ("%{control:Tmp-Integer-1}" > "%{control:Tmp-Integer-3}"))
Thu May 17 17:43:41 2018 : Info: expand: %{control:Tmp-Integer-0} -> 3169
Thu May 17 17:43:41 2018 : Info: expand: %{control:Tmp-Integer-2} -> 25000000
Thu May 17 17:43:41 2018 : Info: ?? Evaluating ("%{control:Tmp-Integer-0}" > "%{control:Tmp-Integer-2}") -> FALSE
Thu May 17 17:43:41 2018 : Info: expand: %{control:Tmp-Integer-1} -> 13402
Thu May 17 17:43:41 2018 : Info: expand: %{control:Tmp-Integer-3} -> 50000000
I tried the single quotes, double quotes using the & instead of %, but to no avail. The other conditions are met correctly when hit as they are returned as integers.
Thank you for the help.

I forgot to mention that I had got it working. Instead of comparing using Tmp-String-0 variable I just used the actual radius attribute name and got it working.
if (("%{Acct-Terminate-Cause}" != "User-Request")
Thank you for the help.

Related

Apps Script JDBC reads DATETIME with wrong timezone

I'm trying to read from a DATETIME field in MySQL using the Apps Script JDBC service. The database has its timezone set to UTC (##global.time_zone == ##session.time_zone == '+00:00'), and I've double-checked this by doing SELECT UNIX_TIMESTAMP(COL) FROM TABLE. My script is also set to use UTC.
However, when I read the value from the JDBC result set using getTimestamp, it is skewed forwards by 8 hours. This occurs regardless of whether I pass a timezone to getTimestamp (indeed, there is no change whatsoever, regardless of what timezone I pass), and regardless of whether useJDBCCompliantTimeZoneShift is enabled or not.
If I read the result using getString, it gives the correct time (in UTC). Barring using getString and parsing it into a JavaScript Date, how can I fix this issue?
Edit
Here's a testing script I used, and its output:
export function tzTest(): void {
const dbIp = DB_IP
const dbPw = DB_PW
let conn = Jdbc.getConnection(`jdbc:mysql://${dbIp}/mydb`, { user: "myuser", password: dbPw })
let stmt = conn.prepareStatement("SELECT COL FROM MYTABLE WHERE OWNER_ID=1")
stmt.execute()
let res = stmt.getResultSet()
res.next()
console.log("==== DEFAULT ====")
console.log("=== getTimestamp ===")
console.log(`plain: ${new Date(res.getTimestamp(1).getTime())} (${res.getTimestamp(1).getTime()})`)
console.log(`utc: ${new Date(res.getTimestamp(1, "UTC").getTime())} (${res.getTimestamp(1, "UTC").getTime()})`)
console.log("=== getTime ===")
console.log(`plain: ${new Date(res.getTime(1).getTime())} (${res.getTime(1).getTime()})`)
console.log(`utc: ${new Date(res.getTime(1, "UTC").getTime())} (${res.getTime(1, "UTC").getTime()})`)
console.log("=== getDate ===")
console.log(`plain: ${new Date(res.getDate(1).getTime())} (${res.getDate(1).getTime()})`)
console.log(`utc: ${new Date(res.getDate(1, "UTC").getTime())} (${res.getDate(1, "UTC").getTime()})`)
conn.close()
conn = Jdbc.getConnection(`jdbc:mysql://${dbIp}/mydb`, { user: "myuser", password: dbPw, useJDBCCompliantTimeZoneShift: true })
stmt = conn.prepareStatement("SELECT COL FROM MYTABLE WHERE OWNER_ID=1")
stmt.execute()
res = stmt.getResultSet()
res.next()
console.log("==== useJDBCCompliantTimeZoneShift ====")
console.log("=== getTimestamp ===")
console.log(`plain: ${new Date(res.getTimestamp(1).getTime())} (${res.getTimestamp(1).getTime()})`)
console.log(`utc: ${new Date(res.getTimestamp(1, "UTC").getTime())} (${res.getTimestamp(1, "UTC").getTime()})`)
console.log("=== getTime ===")
console.log(`plain: ${new Date(res.getTime(1).getTime())} (${res.getTime(1).getTime()})`)
console.log(`utc: ${new Date(res.getTime(1, "UTC").getTime())} (${res.getTime(1, "UTC").getTime()})`)
console.log("=== getDate ===")
console.log(`plain: ${new Date(res.getDate(1).getTime())} (${res.getDate(1).getTime()})`)
console.log(`utc: ${new Date(res.getDate(1, "UTC").getTime())} (${res.getDate(1, "UTC").getTime()})`)
conn.close()
}
This results in the following output:
==== DEFAULT ====
=== getTimestamp ===
plain: Sat Dec 21 2019 15:39:17 GMT+0000 (Coordinated Universal Time) (1576942757000)
utc: Sat Dec 21 2019 15:39:17 GMT+0000 (Coordinated Universal Time) (1576942757000)
=== getTime ===
plain: Thu Jan 01 1970 15:39:17 GMT+0000 (Coordinated Universal Time) (56357000)
utc: Thu Jan 01 1970 15:39:17 GMT+0000 (Coordinated Universal Time) (56357000)
=== getDate ===
plain: Sat Dec 21 2019 08:00:00 GMT+0000 (Coordinated Universal Time) (1576915200000)
utc: Sat Dec 21 2019 00:00:00 GMT+0000 (Coordinated Universal Time) (1576886400000)
==== useJDBCCompliantTimeZoneShift ====
=== getTimestamp ===
plain: Sat Dec 21 2019 15:39:17 GMT+0000 (Coordinated Universal Time) (1576942757000)
utc: Sat Dec 21 2019 15:39:17 GMT+0000 (Coordinated Universal Time) (1576942757000)
=== getTime ===
plain: Thu Jan 01 1970 15:39:17 GMT+0000 (Coordinated Universal Time) (56357000)
utc: Thu Jan 01 1970 15:39:17 GMT+0000 (Coordinated Universal Time) (56357000)
=== getDate ===
plain: Sat Dec 21 2019 08:00:00 GMT+0000 (Coordinated Universal Time) (1576915200000)
utc: Sat Dec 21 2019 00:00:00 GMT+0000 (Coordinated Universal Time) (1576886400000)
For comparison, SELECT COL,(UNIX_TIMESTAMP(COL) * 1000) FROM MYTABLE WHERE OWNER_ID=1 gives 2019-12-21 07:39:17 and 1576913957000.
This issue seems to be a bug in the past and should already be fixed.
Including useJDBCCompliantTimezoneShift=true in the connection parameter should fix the issue to interpret the timezone correctly.
Noting here that the timezone shown when converting a JavaScript Date to a string will always be the timezone of the server (in this case UTC) that's why your workaround fixed it.

How to fetch JSON content values dynamically using JSON slurper in groovy

I am trying to filter out the JSON response values by passing on few parameters dynamically. Below is the code.
import com.eviware.soapui.support.XmlHolder
import groovy.json.JsonSlurper
responseContent = testRunner.testCase.getTestStepByName("Request 1").getPropertyValue("Response")
jsonresponse = new JsonSlurper().parseText(responseContent)
log.info jsonresponse.context["parameter"]
context["parameter"] stores the values from an Excel sheet and doing only a log.info for context["parameter"], it shows those values correctly. Below is the output of the code log.info context["parameter"].
Thu Dec 14 07:18:53 CST 2017:INFO:firstName
Thu Dec 14 07:18:53 CST 2017:INFO:lastName
Thu Dec 14 07:18:54 CST 2017:INFO:frNum
Thu Dec 14 07:18:54 CST 2017:INFO:notes
But when I execute the code
log.info jsonresponse.context["parameter"]
Result:
Thu Dec 14 07:20:41 CST 2017:INFO:[]
Thu Dec 14 07:20:41 CST 2017:INFO:[]
Thu Dec 14 07:20:41 CST 2017:INFO:[]
Thu Dec 14 07:20:42 CST 2017:INFO:[]
Thu Dec 14 07:20:42 CST 2017:INFO:[]
log.info jsonresponse yields the below response out of which I need to get certain values (values stored in the context["parameter"])
Thu Dec 14 07:21:45 CST 2017:INFO:[{errorMessage=null, middleName=null, lastName=Kosnick, frName=Kosnick Steven H , mplastName=null, competeRgnTxt=null, doNum=null, gddUnitStDate=null, fdNum=null, mpfirstName=null, legalEntityID=null, noNum=null, contractType=Financial Rep, frNum=046426, offcNum=NO 091, notes=Active, fullTmeSrvDt=null, firstName=Steven, networkOfficeNum=091}]
Instead of this :
log.info jsonresponse.context["parameter"]
Try this :
log.info jsonresponse[context["parameter"]]
This should resolve your issue :)

To get values from 2D array

I have used this query to retrieve the dates for one particular user's approved leaves -
LeaveRequest.where(user_id: 6).where(status: 1).pluck(:from_date, :to_date)
and I'm getting this array as result -
[[Mon, 12 Sep 2016, Fri, 16 Sep 2016], [Tue, 06 Sep 2016, Tue, 06 Sep 2016], [Thu, 01 Sep 2016, Fri, 02 Sep 2016], [Tue, 30 Aug 2016, Wed, 31 Aug 2016]]
what I want is to fetch all the dates as well as the dates between 12 Sep 2016 and 16 Sep, 2016 (13th 14th and 15th).
I am assuming you mean something like this
require 'date'
#This is to simulate your current Array
current_array = 5.times.map {|n [Date.new(2016,n+1,1).<<(1),Date.new(2016,n+1,1)]}
#map the 2 dates to a Range
new_array = current_array.map{|start_date,end_date| (start_date..end_date)}
new_array.first.class
#=> Range
Calling to_a on the Range will blow it out into all the dates between start_date and end_date
With a rails you could do something like
class LeaveRequest
def self.user_requested_ranges(user_id, status_id)
scoped.
where(user_id: user_id, status: status_id).
pluck(:from_date, :to_date).
map do |from_date, to_date|
#optionally to output the full Array in each Range you could use
#(from_date..to_date).to_a
(from_date..to_date)
end
end
end
Then call as
LeaveRequest.user_requested_ranges(6,1)

logging mysql statements executed by jdbc

I tried to log mysql statements , executed by jdbc , hoping to see strings containing declare some cursor or fetch some cursor. But there was not.
Are there any ways to see them?
PS i set variables in mysql as following:
SET GLOBAL log_output="FILE"
SET GLOBAL general_log_file="Path/File"
SET GLOBAL general_log='ON'
Try this.
Add 'logger' and 'profileSQL' to the jdbc url:
&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true
Then you will get the SQL statement below:
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 message: SET sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 13 resultset: 17 message: select 1
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 13 resultset: 17
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 15 resultset: 18 message: select ##session.tx_read_only
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 15 resultset: 18
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 14 resultset: 0 message: update sequence set seq=seq+incr where name='demo' and seq=4602
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 14 resultset: 0
The default logger is:
com.mysql.jdbc.log.StandardLogger
Mysql jdbc property list: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Haskell: count an enum (Days of week) by an int

I want to create a function for a calender programm, that does the following:
proceed :: Day -> Int -> Day
> proceed Mon 9
Wed
The function proceed should tell me, what weekday it is in 9 days, if today is Monday.
Now I try this:
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving Show
next :: Day -> Day
next Mon = Tue
next Tue = Wed
next Wed = Thu
next Thu = Fri
next Fri = Sat
next Sat = Sun
next Sun = Mon
proceed :: Day -> Int -> Day
proceed d a = if a==0 then next d
else proceed (next d) (a-1)
I try :
proceed Mon 9
Thu
But that's wrong, the right answear is Wed!!!!!!!
I don't know where I've made the mistake.
Thanks to bheklilr
if a == 0 then d else proceed (next d) (a-1)
It was only an off by one error!