accounting_reply_query
halic
halic at inbox.ru
Thu Dec 7 13:59:47 CET 2006
this is a simple patch to rlm_sql module.
it allows module to get attributes from db and send them in
Accounting-Response packet.
"select-query" configured via default sql.conf; parameter is
accounting_reply_query.
it is useful to, for example, send "vendor-specific-drop" attribute to NAS
in response to Interim-Update.
other accounting_*_query parameters may not be defined.
configuration example:
accounting_reply_query="select id, login as UserName, 'Terminate-Session'
as Attribute, 'Yes' as Value, '=' as op from clients where ballance <= 0
and '%{Acct-Status-Type}' = 'Interim-Update' and login = '%{User-Name}'"
creating db-view is also a good choise; query like:
accounting_reply_query="select id, UserName, Attribute, Value, op from
acct_reply status_type = '%{Acct-Status-Type}' and UserName =
'%{User-Name}'"
my patched pppd recieves "Terminate-Session" attribute.
mpd can also receive "Drop-User" attr.
currenty a lot of billing systems use different nas-specific scripts to
drop client with negative ballance.
i think this patch is pretty usefull.
sorry, but it's patch to 1.1.3 version; not devel, from cvs.
due to bad internet i didnt downloaded cvs version.
here it is:
diff -urN freeradius-1.1.3/src/modules/rlm_sql/conf.h
freeradius-1.1.3-oops/src/modules/rlm_sql/conf.h
--- freeradius-1.1.3/src/modules/rlm_sql/conf.h Sat May 20 12:44:37 2006
+++ freeradius-1.1.3-oops/src/modules/rlm_sql/conf.h Wed Dec 6 21:56:15
2006
@@ -29,6 +29,7 @@
char *accounting_start_query_alt;
char *accounting_stop_query;
char *accounting_stop_query_alt;
+ char *accounting_reply_query;
char *simul_count_query;
char *simul_verify_query;
char *groupmemb_query;
diff -urN freeradius-1.1.3/src/modules/rlm_sql/rlm_sql.c
freeradius-1.1.3-oops/src/modules/rlm_sql/rlm_sql.c
--- freeradius-1.1.3/src/modules/rlm_sql/rlm_sql.c Sat May 20 12:44:37 2006
+++ freeradius-1.1.3-oops/src/modules/rlm_sql/rlm_sql.c Wed Dec 6
22:03:35 2006
@@ -103,6 +103,8 @@
offsetof(SQL_CONFIG,accounting_stop_query), NULL, ""},
{"accounting_stop_query_alt", PW_TYPE_STRING_PTR,
offsetof(SQL_CONFIG,accounting_stop_query_alt), NULL, ""},
+ {"accounting_reply_query", PW_TYPE_STRING_PTR,
+ offsetof(SQL_CONFIG,accounting_reply_query), NULL, ""},
{"group_membership_query", PW_TYPE_STRING_PTR,
offsetof(SQL_CONFIG,groupmemb_query), NULL, ""},
{"connect_failure_retry_delay", PW_TYPE_INTEGER,
@@ -887,6 +889,7 @@
char querystr[MAX_QUERY_LEN];
char logstr[MAX_QUERY_LEN];
char sqlusername[MAX_STRING_LEN];
+ VALUE_PAIR *sql_reply = NULL;
#ifdef CISCO_ACCOUNTING_HACK
int acctsessiontime = 0;
@@ -1103,6 +1106,19 @@
break;
}
+
+ radius_xlat(querystr, sizeof(querystr),
inst->config->accounting_reply_query, request, sql_escape_func);
+ query_log(request, inst, querystr);
+
+ if (*querystr) {
+ if(sqlsocket == NULL && (sqlsocket = sql_get_socket(inst)) == NULL)
+ return(RLM_MODULE_FAIL);
+
+ sql_getvpdata(inst, sqlsocket, &sql_reply, "SELECT 4 as id, 'dayset'
as UserName, 'Terminate-Session' as Attribute, 'Yes' as Value, '=' as op",
PW_VP_USERDATA);
+
+ pairxlatmove(request, &request->reply->vps, &sql_reply);
+ pairfree(&sql_reply);
+ }
sql_release_socket(inst, sqlsocket);
More information about the Freeradius-Devel
mailing list