Sitenize dadanmış sömürgenleri bulun

Apache loglarını incelerken bazı IP’lerden arka arkaya çok fazla istek geldiğini farkettim. Ama gözle bunları tespit etmek neredeyse imkansız olduğu için C++ ile şöyle bir programcık yazdım.

sivri

/*
* copyLeft by Mustafa Aldemir
* 18.05.2015
* find the IPs that make too many requests 
*/
#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
 
using namespace std;
 
int main(int argc, char* argv[])
{
  map<string, int> mymap;
  string s;
  int limit;
  int size;
 
  if(argc==2){
    limit = atoi(argv[1]);
  } else {
    cout << "Usage:" << endl << "tail -f /var/log/apache2/access.log | awk -Winteractive '{print $1}' | findleechers 10" << endl;
    return 0;
  }
 
  cout << "limit: " << limit <<endl;
 
  while (cin >> s)
  {
    if ( mymap.count(s)>0 ){
      mymap[s]++;
      if ( (limit <= mymap[s]) && (0 == (mymap[s]%limit)) ){
        cout << s << " " << mymap[s] << endl;                                                                                            
      }                                                                                                                                  
    } else {
      mymap.insert( pair<string,int>(s,1) );
    }
 
    size = mymap.size();
    if(10000 < size){
      cout << "Exiting: size has grown too big" << endl;
      return 0;
    }
    /*
    if(0 == (size % 100)){
      cout << "map size: " << size << endl;
    }
    */
  }
 
 return 0;
}
 

 

Derlemek için:

g++ findleechers.cpp  -o findleechers 

 

Derledikten sonra diğer kendi yazdığım programların yanına /usr/local/bin klasörüne taşıdım.

Çalıştırmak için şu komutu kullanıyorum:

tail -f /var/log/apache2/access.log | awk -Winteractive '{print $1}' | findleechers 10

 

Bu programı çalıştırmaya çalışırken yeni bir şey öğrendim. awk komutu veriyi tamponluyormuş (buffer) [1]. Yani, awk’ın çalışması bitene kadar findleechers borudan (pipe) bir şey alamıyordu. tail komutunu da -f ile çalıştırdığım için awk’ın çalışması hiç bitmiyordu. -W interactive parametresi ile kendisine gelen veriyi buffer’lamadan çalışmasını sağladım.

Kaynak:
[1] http://www.perkin.org.uk/posts/how-to-fix-stdio-buffering.html