recalc_quotes.pl 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use FindBin '$Bin';
  6. use lib "$Bin/";
  7. use strict;
  8. use DBI;
  9. use Time::Local;
  10. use Data::Dumper;
  11. use Date::Parse;
  12. use Socket;
  13. use Rstat::config;
  14. use Rstat::main;
  15. use Rstat::net_utils;
  16. use Rstat::mysql;
  17. setpriority(0,0,19);
  18. InitSubnets();
  19. my ($sec,$min,$hour,$day,$month,$year,$zone) = strptime(localtime());
  20. $month++;
  21. $year += 1900;
  22. my $day_date=$dbh->quote("$year-$month-$day");
  23. my $dbt = init_traf_db();
  24. #get user limits
  25. 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" );
  26. if ( !defined $user_auth_list ) { die "Cannot prepare statement: $DBI::errstr\n"; }
  27. $user_auth_list->execute;
  28. my $authlist_ref = $user_auth_list->fetchall_arrayref();
  29. $user_auth_list->finish();
  30. my %user_stats;
  31. my %auth_info;
  32. foreach my $row (@$authlist_ref) {
  33. $auth_info{$row->[0]}{user_id}=$row->[1];
  34. $auth_info{$row->[0]}{day_limit}=$row->[4];
  35. $auth_info{$row->[0]}{month_limit}=$row->[5];
  36. $auth_info{$row->[0]}{day}=0;
  37. $auth_info{$row->[0]}{month}=0;
  38. $user_stats{$row->[1]}{day_limit}=$row->[2];
  39. $user_stats{$row->[1]}{month_limit}=$row->[3];
  40. $user_stats{$row->[1]}{day}=0;
  41. $user_stats{$row->[1]}{month}=0;
  42. }
  43. #recalc quotes - global
  44. #day
  45. my $day_sql="SELECT User_stats.auth_id, SUM( byte_in + byte_out ) AS traf_all FROM User_stats
  46. WHERE ( Date( User_stats.timestamp ) = $day_date ) GROUP BY User_stats.auth_id";
  47. my $fth = $dbt->prepare($day_sql);
  48. $fth->execute;
  49. my $day_stats=$fth->fetchall_arrayref();
  50. $fth->finish;
  51. foreach my $row (@$day_stats) {
  52. my ($a_id,$a_traf)=@$row;
  53. my $user_id=$auth_info{$a_id}{user_id};
  54. $auth_info{$a_id}{day}=$a_traf;
  55. $user_stats{$user_id}{day}+=$a_traf;
  56. }
  57. #month
  58. my $month_sql="SELECT User_stats.auth_id, SUM( byte_in + byte_out ) AS traf_all FROM User_stats
  59. WHERE ( YEAR(User_stats.timestamp) = $year and MONTH(User_stats.timestamp) = $month ) GROUP BY User_stats.auth_id";
  60. my $mth = $dbt->prepare($month_sql);
  61. $mth->execute;
  62. my $month_stats=$mth->fetchall_arrayref();
  63. $mth->finish;
  64. foreach my $row (@$month_stats) {
  65. my ($a_id,$a_traf)=@$row;
  66. my $user_id=$auth_info{$a_id}{user_id};
  67. $auth_info{$a_id}{month}=$a_traf;
  68. $user_stats{$user_id}{month}+=$a_traf;
  69. }
  70. foreach my $auth_id (keys %auth_info) {
  71. next if (!$auth_info{$auth_id}{day_limit});
  72. next if (!$auth_info{$auth_id}{month_limit});
  73. my $day_limit=$auth_info{$auth_id}{day_limit}*$KB*$KB;
  74. my $month_limit=$auth_info{$auth_id}{month_limit}*$KB*$KB;
  75. my $blocked_d=($auth_info{$auth_id}{day}>$day_limit);
  76. my $blocked_m=($auth_info{$auth_id}{month}>$month_limit);
  77. if ($blocked_d or $blocked_m) {
  78. my $history_msg;
  79. 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; }
  80. 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; }
  81. do_sql($dbh,"UPDATE User_auth set blocked=1 where id=$auth_id");
  82. db_log_verbose($dbh,$history_msg);
  83. }
  84. }
  85. foreach my $user_id (keys %user_stats) {
  86. next if (!$user_stats{$user_id}{day_limit});
  87. next if (!$user_stats{$user_id}{month_limit});
  88. my $day_limit=$user_stats{$user_id}{day_limit}*$KB*$KB;
  89. my $month_limit=$user_stats{$user_id}{month_limit}*$KB*$KB;
  90. my $blocked_d=($user_stats{$user_id}{day}>$day_limit);
  91. my $blocked_m=($user_stats{$user_id}{month}>$month_limit);
  92. if ($blocked_d or $blocked_m) {
  93. my $history_msg;
  94. 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; }
  95. 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; }
  96. do_sql($dbh,"UPDATE User_user set blocked=1 where id=$user_id");
  97. do_sql($dbh,"UPDATE User_auth set blocked=1 where user_id=$user_id");
  98. db_log_verbose($dbh,$history_msg);
  99. }
  100. }
  101. $dbh->disconnect;
  102. $dbt->disconnect;
  103. print "Done\n" if ($debug);
  104. exit 0;