/trunk/GBUDBTool/main.cpp
1,9 → 1,133
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include "../CodeDweller/faults.hpp"
#include "../SNFMulti/GBUdb.hpp"
 
using namespace std;
 
int main()
{
cout << "Hello world!" << endl;
return 0;
const string VersionInfo = "V0.1";
const int ErrorResultCode = 1;
const int SuccessResultCode = 0;
 
struct Configuration {
string GBXFile;
double Probability;
double Confidence;
bool findBlack;
bool showDetails;
Configuration():
GBXFile(""),
Probability(0.0),
Confidence(0.0),
findBlack(true),
showDetails(false) {}
} myConfig;
 
class BadArguments : public RuntimeFault {public: BadArguments(string s):RuntimeFault(s){}};
const BadArguments BadArgumentCount("Wrong number of arguments");
const BadArguments BadSwitch("Bad command line switch");
 
void setConfiguration(Configuration &conf, int argc, char* argv[]) {
BadArgumentCount(argc > 6 || argc < 1);
for(int i = 1; i < argc; i++) {
string thisArgument(argv[i]);
 
if(0 == thisArgument.find("-black")) {
conf.findBlack = true;
}
 
else if(0 == thisArgument.find("-white")) {
conf.findBlack = false;
}
 
else if(0 == thisArgument.find("-details")) {
conf.showDetails = true;
}
 
else if(0 == thisArgument.find("-p=")) {
conf.Probability = strtod(thisArgument.substr(3).c_str(),0);
}
 
else if(0 == thisArgument.find("-c=")) {
conf.Confidence = strtod(thisArgument.substr(3).c_str(),0);
}
 
else if(0 == thisArgument.find("-")) {
BadSwitch(true);
}
 
else {
conf.GBXFile = thisArgument;
}
}
}
 
void displayHelp() {
cerr << "GBUDBTool " << VersionInfo << endl;
cerr << "Use: GBUDBTool [-black | -white] [-p=<value>] [-c=<value>] <gbx file>" << endl;
cerr << " -black prints out blacklist IPs based on p & c" << endl;
cerr << " -white prints out whitelist IPs based on p & c" << endl;
cerr << " -details prints out counts, confidence, and probability" << endl;
cerr << " -c=<value> sets the confidence figure for the list" << endl;
cerr << " -p=<value> sets the probability figure for the list" << endl;
cerr << " <gbx file> is the path to a GBUdb snapshot" << endl;
}
 
class Reporter : public GBUdbOperator {
private:
Configuration myConfig;
 
string toIP4String(unsigned int IP) {
int a, b, c, d;
d = IP & 0x000000ff; IP >>= 8;
c = IP & 0x000000ff; IP >>= 8;
b = IP & 0x000000ff; IP >>= 8;
a = IP;
ostringstream S;
S << a << "." << b << "." << c << "." << d;
return S.str();
}
 
public:
 
Reporter(Configuration Config) : myConfig(Config) {}
 
GBUdbRecord& operator()(unsigned int IP, GBUdbRecord& R) {
bool goodConfidence = (myConfig.Confidence <= R.Confidence());
bool goodProbability = false;
if(myConfig.findBlack) goodProbability = (myConfig.Probability <= R.Probability());
else goodProbability = (myConfig.Probability <= R.Probability());
if(goodProbability && goodConfidence) {
cout << toIP4String(IP);
if(myConfig.showDetails) {
cout << "\t"
<< "g=" << R.Good()
<< ", b=" << R.Bad()
<< ", c=" << R.Confidence()
<< ", p=" << R.Probability();
}
cout << endl;
}
return R;
}
};
 
int main(int argc, char* argv[]) {
try {
setConfiguration(myConfig, argc, argv);
GBUdbDataset DB(myConfig.GBXFile.c_str());
DB.load();
Reporter R(myConfig);
DB.doForAllRecords(R);
}
 
catch(exception &e) {
displayHelp();
cerr << endl << "Exception: " << e.what() << endl;
return ErrorResultCode;
}
 
return SuccessResultCode;
}