ot Todor Lazarov(20-02-2002)
reiting (1)
[ dobre ]
[ zle ]
Variant za otpechatvane
Eto vi edno reshenie kak da ograzhichim Dial-up po trafik kato
izpolzvame ICRadius
IC-RADIUS 0.18.1 ne razpolaga sus sredstva za da mozhem da
ogranichavame Dial-up po trafik.
Po ne az ne mozhash da otkriia.
Za tova eto edno reshenie za tova.
Hubavoto e che Linux e otvorena sistema (t.e. vseki mozhe da
promenia koda)
Eto i kakvo sam dobavil:
----------------------------------------------------------------------------------
1. files.c
sled red 429: case PW_WEEKLY_TIME_LIMIT:
se dobavia: case PW_MAX_MEGABYTES:
Promenliva koiato se proveriava v faila auth.c
----------------------------------------------------------------------------------
2. radius.h
sled red 156: #define PW_WEEKLY_TIME_LIMIT 2006
se dobavia: #define PW_MAX_MEGABYTES 2010
Deklarirane na tazi promenliva
----------------------------------------------------------------------------------
3. auth.c
Postavete go naprimer sled proverkata za WEEKLY_TIME_LIMIT
za Realm
/* New attribute in Mb format */
if (result >=0 && (check_item =
pairfind(authreq->check_pairs, PW_MAX_MEGABYTES)) !=
NULL) {
SQL_ROW row;
char querystr[256];
unsigned long allowed;
unsigned long used = 0;
allowed = check_item->lvalue * 1048576;
/* Proverka dali Realm e nadhvurlil trafika
tuka mozhem i da proveriavame i
za mesets, den i t.n */
sprintf(querystr, "SELECT
SUM(AcctInputOctets+AcctOutputOctets) FROM radacct WHERE
Realm ='%s'", authreq->realm);
sql_select_query(socket, querystr);
row = sql_fetch_row(socket);
if (row[0] == NULL)
used = 0;
else
used = atol(row[0]);
sql_finish_select_query(socket);
if (used >= allowed) {
sprintf(umsg, "\r\nYour realm has
reached it's limit of %d
Mb\r\n\n",(int)check_item->lvalue);
user_msg = umsg;
result = -1;
/* Vrushta se rezultat za greshka pri
indifikatsiiata
s koeto napraktika se vodi do
prekusvane na sesiiata*/
rad_send_reply(PW_AUTHENTICATION_REJECT, authreq,
authreq->reply_pairs, user_msg, activefd);
log(L_ERR, "ERR - Realm usage
limit of %d Mb reached: [%s] (%s)",
(int)check_item->lvalue, authreq->realm,
auth_name(authreq, 1));
}
}
Postavete go naprimer sled proverkata za MAX_HOURS za
Username
/* New attribute in Mb format */
if (result >=0 && (check_item =
pairfind(authreq->check_pairs, PW_MAX_MEGABYTES)) !=
NULL) {
SQL_ROW row;
char querystr[256];
unsigned long allowed;
unsigned long used = 0;
allowed = check_item->lvalue *
1048576;
/* Proverka dali potrebitelia e nadhvurlil
trafika
tuka mozhem i da proveriavame i
za mesets, den i t.n */
sprintf(querystr, "SELECT
SUM(AcctInputOctets+AcctOutputOctets) FROM radacct WHERE
UserName ='%s'", authreq->realm);
sql_select_query(socket, querystr);
row = sql_fetch_row(socket);
if (row[0] == NULL)
used = 0;
else
used = atol(row[0]);
sql_finish_select_query(socket);
if (used >= allowed) {
sprintf(umsg, "\r\nYour
account has reached its limit of %d Mb\r\n\n",
(int)check_item->lvalue);
user_msg = umsg;
result = -1;
/* Vrushta se rezultat za greshka
pri indifikatsiiata
s koeto napraktika se vodi do
prekusvane na sesiiata*/
rad_send_reply(PW_AUTHENTICATION_REJECT, authreq,
authreq->reply_pairs, user_msg, activefd);
log(L_ERR, "ERR - Usage
limit of %d Mb reached: [%s] (%s)",
(int)check_item->lvalue, namepair->strvalue,
auth_name(authreq, 1));
}
}
4. Dobavete red v tablitsa dictionnary:
INSERT INTO dictionnary (Type, Attribute, Value, Format)
VALUES ('ATTRIBUTE', 'MAX_MEGABYTES', '2010',
'integer');
sled koeto si prekompiliraite ICRadius-a i go startiraite
otnovo
Samoto zadavane go izvurshvam ot modula radius.cgi
Tova e pokazano v prikrepeniia fail:
Edna zabelezhka:
Ima samo edno slabo mesto !!!
Kakto vizhdate ot source dannite se chetat ot tablitsata
radacct
A tam se zapisvat dannite sled kato sesiiata svurshi.
t.e. Dial-up nozhe da previshi dadeniia mu trafik ako go
nadhvurli v dadena sesiia.
No pri sledvashto logvane mashinata shte go izhvurli.
Koeto razbira se e niakukuv rezultat. !!!
<< KAK DA SE BULGARIZIRAME - nov tertip | Devet preporuki za pisane na siguren php kod >>
|