| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/usr/bin/perl
- #
- # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
- #
- use FindBin '$Bin';
- use lib "$Bin/";
- use strict;
- use DBI;
- use Time::Local;
- use Data::Dumper;
- use Date::Parse;
- use Socket;
- use Rstat::config;
- use Rstat::main;
- use Rstat::net_utils;
- use Rstat::mysql;
- setpriority(0,0,19);
- InitSubnets();
- my ($sec,$min,$hour,$day,$month,$year,$zone) = strptime(localtime());
- $month++;
- $year += 1900;
- my $day_date=$dbh->quote("$year-$month-$day");
- my $dbt = init_traf_db();
- #get user limits
- my $user_auth_list=$dbh->prepare( "SELECT A.id, U.id, U.day_quota, U.month_quota, A.day_quota, A.month_quota FROM User_auth as A,User_list as U where A.deleted=0 ORDER by user_id" );
- if ( !defined $user_auth_list ) { die "Cannot prepare statement: $DBI::errstr\n"; }
- $user_auth_list->execute;
- my $authlist_ref = $user_auth_list->fetchall_arrayref();
- $user_auth_list->finish();
- my %user_stats;
- my %auth_info;
- foreach my $row (@$authlist_ref) {
- $auth_info{$row->[0]}{user_id}=$row->[1];
- $auth_info{$row->[0]}{day_limit}=$row->[4];
- $auth_info{$row->[0]}{month_limit}=$row->[5];
- $auth_info{$row->[0]}{day}=0;
- $auth_info{$row->[0]}{month}=0;
- $user_stats{$row->[1]}{day_limit}=$row->[2];
- $user_stats{$row->[1]}{month_limit}=$row->[3];
- $user_stats{$row->[1]}{day}=0;
- $user_stats{$row->[1]}{month}=0;
- }
- #recalc quotes - global
- #day
- my $day_sql="SELECT User_stats.auth_id, SUM( byte_in + byte_out ) AS traf_all FROM User_stats
- WHERE ( Date( User_stats.timestamp ) = $day_date ) GROUP BY User_stats.auth_id";
- my $fth = $dbt->prepare($day_sql);
- $fth->execute;
- my $day_stats=$fth->fetchall_arrayref();
- $fth->finish;
- foreach my $row (@$day_stats) {
- my ($a_id,$a_traf)=@$row;
- my $user_id=$auth_info{$a_id}{user_id};
- $auth_info{$a_id}{day}=$a_traf;
- $user_stats{$user_id}{day}+=$a_traf;
- }
- #month
- my $month_sql="SELECT User_stats.auth_id, SUM( byte_in + byte_out ) AS traf_all FROM User_stats
- WHERE ( YEAR(User_stats.timestamp) = $year and MONTH(User_stats.timestamp) = $month ) GROUP BY User_stats.auth_id";
- my $mth = $dbt->prepare($month_sql);
- $mth->execute;
- my $month_stats=$mth->fetchall_arrayref();
- $mth->finish;
- foreach my $row (@$month_stats) {
- my ($a_id,$a_traf)=@$row;
- my $user_id=$auth_info{$a_id}{user_id};
- $auth_info{$a_id}{month}=$a_traf;
- $user_stats{$user_id}{month}+=$a_traf;
- }
- foreach my $auth_id (keys %auth_info) {
- next if (!$auth_info{$auth_id}{day_limit});
- next if (!$auth_info{$auth_id}{month_limit});
- my $day_limit=$auth_info{$auth_id}{day_limit}*$KB*$KB;
- my $month_limit=$auth_info{$auth_id}{month_limit}*$KB*$KB;
- my $blocked_d=($auth_info{$auth_id}{day}>$day_limit);
- my $blocked_m=($auth_info{$auth_id}{month}>$month_limit);
- if ($blocked_d or $blocked_m) {
- my $history_msg;
- if ($blocked_d) { $history_msg=printf "Day quota limit found for auth_id: $auth_id - Current: %d Max: %d",$auth_info{$auth_id}{day},$day_limit; }
- if ($blocked_m) { $history_msg=printf "Month quota limit found for auth_id: $auth_id - Current: %d Max: %d",$auth_info{$auth_id}{month},$month_limit; }
- do_sql($dbh,"UPDATE User_auth set blocked=1 where id=$auth_id");
- db_log_verbose($dbh,$history_msg);
- }
- }
- foreach my $user_id (keys %user_stats) {
- next if (!$user_stats{$user_id}{day_limit});
- next if (!$user_stats{$user_id}{month_limit});
- my $day_limit=$user_stats{$user_id}{day_limit}*$KB*$KB;
- my $month_limit=$user_stats{$user_id}{month_limit}*$KB*$KB;
- my $blocked_d=($user_stats{$user_id}{day}>$day_limit);
- my $blocked_m=($user_stats{$user_id}{month}>$month_limit);
- if ($blocked_d or $blocked_m) {
- my $history_msg;
- if ($blocked_d) { $history_msg=printf "Day quota limit found for user_id: $user_id - Current: %d Max: %d",$user_stats{$user_id}{day},$day_limit; }
- if ($blocked_m) { $history_msg=printf "Month quota limit found for user_id: $user_id - Current: %d Max: %d",$user_stats{$user_id}{month},$month_limit; }
- do_sql($dbh,"UPDATE User_user set blocked=1 where id=$user_id");
- do_sql($dbh,"UPDATE User_auth set blocked=1 where user_id=$user_id");
- db_log_verbose($dbh,$history_msg);
- }
- }
- $dbh->disconnect;
- $dbt->disconnect;
- print "Done\n" if ($debug);
- exit 0;
|