my previous message incuded one stupid error. sorry. here is corrected one. 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, querystr, PW_VP_USERDATA); + + pairxlatmove(request, &request->reply->vps, &sql_reply); + pairfree(&sql_reply); + } sql_release_socket(inst, sqlsocket);