/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #include "base/polygraph.h" #include "xstd/h/iostream.h" #include #include "xstd/h/sstream.h" #include "xstd/h/iomanip.h" #include "base/StatPhaseRec.h" #include "base/polyLogCats.h" #include "base/polyLogTags.h" #include "base/polyOpts.h" #include "base/CmdLine.h" #include "base/opts.h" #include "logextractors/LogIter.h" #include "logextractors/LogCatFilter.h" #include "logextractors/AggrInfoLoader.h" #include "logextractors/matchAndPrint.h" class MyOpts: public OptGrp { public: MyOpts(): theHelpOpt(this, "help", "list of options"), theVersOpt(this, "version", "package version info"), theOutFileName(this, "out ", "redirect console output", "-"), theSideName(this, "side ", "name of `side' to extract"), thePhases(this, "phases ","names of phases to extract"), theObjects(this, "objects ","names of objects to extract") {} virtual ostream &printAnonym(ostream &os) const; virtual bool parseAnonym(const Array &opts); virtual bool canParseAnonym() const { return true; } virtual bool validate() const; public: HelpOpt theHelpOpt; VersionOpt theVersOpt; StrOpt theOutFileName; StrOpt theSideName; StrArrOpt thePhases; StrArrOpt theObjects; Array theFiles; }; static MyOpts TheOpts; static stringstream ReportBuf; /* MyOpt */ bool MyOpts::validate() const { if (theSideName && theSideName != "clt" && theSideName != "srv" && theSideName != "all") cerr << "side name must be `clt' or `srv' or `all'; got: " << theSideName << endl; else return OptGrp::validate(); return false; } ostream &MyOpts::printAnonym(ostream &os) const { return os << " ..."; } bool MyOpts::parseAnonym(const Array &opts) { for (int i = 0 ; i < opts.count(); ++i) theFiles.append(new String(opts[i])); return theFiles.count() > 0; } /* local routines */ static void configureLogs(int prec) { if (TheOpts.theOutFileName && TheOpts.theOutFileName != "-") redirectOutput(TheOpts.theOutFileName.cstr()); configureStream(cout, prec); configureStream(cerr, prec); configureStream(clog, prec); configureStream(ReportBuf, prec); } static void configure() { configureLogs(2); } static void report(const AggrInfoLoader &ldr) { StatPhaseRec r; if (!ldr.aggregate(r)) { if (TheOpts.thePhases.val().count()) cerr << "no matching phases found" << endl; else cerr << "no phase statistics found" << endl; exit(-1); } r.print(ReportBuf, ""); ReportBuf << "log.count:\t " << TheOpts.theFiles.count() << endl; ReportBuf << ends; if (MatchAndPrint(cout, ReportBuf.str().c_str(), TheOpts.theObjects.val()) == 0) { cerr << "no logged objects matched any of the requested object names" << endl; exit(-2); } } int main(int argc, char *argv[]) { CmdLine cmd; cmd.configure(Array() << &TheOpts); if (!cmd.parse(argc, argv) || !TheOpts.validate()) return -1; configure(); int lc = lgcAll; if (TheOpts.theSideName == "clt") lc = lgcCltSide; else if (TheOpts.theSideName == "srv") lc = lgcSrvSide; LogCatFilter *filter = new LogCatFilter; filter->logCat(lc); AggrInfoLoader ldr(TheOpts.thePhases.val()); ldr.filter(filter); for (int i = 0; i < TheOpts.theFiles.count(); ++i) { const String &fname = *TheOpts.theFiles[i]; ILog log; if (fname == "-") log.stream("stdin", &cin); else log.stream(fname, (istream*)new ifstream(fname.cstr(), ios::binary|ios::in)); for (LogIter li(&log); li; ++li) ldr.load(log, *li); } report(ldr); delete filter; return 0; }