#include #include #include #include #include "../CodeDweller/faults.hpp" #include "../SNFMulti/GBUdb.hpp" using namespace std; 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=] [-c=] " << 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= sets the confidence figure for the list" << endl; cerr << " -p= sets the probability figure for the list" << endl; cerr << " 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; }