Esempio n. 1
0
int main(int argc, char *argv[]) {
	options_description desc_gen("Arguments");
	desc_gen.add_options()
		("help", "display help message")
		("config-file", 
			value<string>()->default_value
				("/usr/local/etc/infer.conf"),
			"specify configuration file")
		("date", value<string>(), "the date (YYYY-mm-dd)")
	;

	positional_options_description p;
	p.add("date", 1);
	variables_map vm;
	try {
		store(command_line_parser(argc, argv).
			options(desc_gen).positional(p).run(), vm);
	}
	catch (error e) {
		cerr << e.what() << endl;
		return 1;
	}
	notify(vm);

	if (vm.count("help")) {
		cout << desc_gen << endl;
		return 0;
	}

	if (!vm.count("date")) {
		cerr << "Error: date is requred." << endl;
		cerr << desc_gen << endl;
		return 1;
	}

	struct tm _tm;
	if (strptime(vm["date"].as<string>().c_str(), "%Y-%m-%d", &_tm) == NULL) {
		cerr << "Error: invalid date: " << vm["date"].as<string>() << endl;
		return 1;
	}

	cerr << "Config file: " << vm["config-file"].as<string>().c_str() << endl;
	cerr << "Date:        " << vm["date"].as<string>().c_str() << endl;

	struct tm tm_begin, tm_end;
	memset(&tm_begin, 0, sizeof(tm_begin));
	memset(&tm_end, 0, sizeof(tm_end));

	tm_begin.tm_isdst = tm_end.tm_isdst = -1;
	tm_begin.tm_year = tm_end.tm_year = _tm.tm_year;
	tm_begin.tm_mon = tm_end.tm_mon = _tm.tm_mon;
	tm_begin.tm_mday = tm_end.tm_mday = _tm.tm_mday;
	tm_begin.tm_hour = 0;
	tm_end.tm_hour = 24;

	time_t unix_begin, unix_end;
	unix_begin = mktime(&tm_begin);
	unix_end = mktime(&tm_end);

	TimeStamp time_begin, time_end;
	time_begin.set(unix_begin, 0);
	time_end.set(unix_end, 0);

	configuration conf;
	if (!conf.load(vm["config-file"].as<string>())) {
		cerr << argv[0] << ": unable to load configuration" << endl;
		return 1;
	}
	
	string data_directory;
	if (conf.get(data_directory, "data-directory", "split_http", true)
			!= configuration::OK)
	{
		cerr << argv[0] << ": data-directory required" << endl;
		return 1;
	}

	string output_directory;
	if (conf.get(output_directory, "output-directory", "split_http")
			!= configuration::OK)
	{
		cerr << argv[0] << ": output-directory required" << endl;
		return 1;
	}


	OldHTTP http;
	HTTPRequest request;
	HTTPResponse response;

	boost::shared_ptr<StrftimeReadEnumerator> readEnum(
		new StrftimeReadEnumerator);

	readEnum->init(data_directory,
				   "%Y/%m/%d/http_%H",
				   time_begin,
				   time_end);
	if (!(*readEnum)) {
		cerr << "Error: Unable to initialize read readEnumerator" << endl;
		return 1;
	}

	EnumeratedFileReader
		<FlatFileReader
			<OldHTTP>,
		 StrftimeReadEnumerator
		> reader;
	ErrorStatus error_status;
	error_status = reader.init(readEnum);
	if (error_status != E_SUCCESS && error_status != E_EOF) {
		cerr << "Error: Unable to initialize EnumeratedFileReader" << endl;
		return 1;
	}

	boost::shared_ptr<StrftimeWriteEnumerator<HTTPRequest> >
		request_enumerator(new StrftimeWriteEnumerator<HTTPRequest>(
			output_directory, "%Y/%m/%d/http_request_%H"));
	boost::shared_ptr<StrftimeWriteEnumerator<HTTPResponse> >
		response_enumerator(new StrftimeWriteEnumerator<HTTPResponse>(
			output_directory, "%Y/%m/%d/http_response_%H"));

	InferFileWriter<FlatFileWriter<HTTPRequest> > request_writer(request_enumerator);

	InferFileWriter<FlatFileWriter<HTTPResponse> > response_writer(response_enumerator);

	while ((error_status = reader.read(http)) == E_SUCCESS) {
		if (http.type() == 'q') {
			request.time(http.time());
			request.protocol(http.protocol());
			request.raw_source_ip(http.rawSourceIP());
			request.raw_destination_ip(http.rawDestinationIP());
			request.raw_source_port(http.rawSourcePort());
			request.raw_destination_port(http.rawDestinationPort());

			request.type(http.requestType());
			request.uri(http.uri());
			request.version(http.version());
			request.host(http.host());
			request.user_agent(http.userAgent());
			request.referer(http.referer());

			request_writer.write(&request);
		}
		else {
			response.time(http.time());
			response.protocol(http.protocol());
			response.raw_source_ip(http.rawSourceIP());
			response.raw_destination_ip(http.rawDestinationIP());
			response.raw_source_port(http.rawSourcePort());
			response.raw_destination_port(http.rawDestinationPort());

			response.version(http.version());
			response.status(http.status());
			response.reason(http.reason());
			response.response(http.response());
			response.content_type(http.contentType());

			response_writer.write(&response);
		}
	}
	if (error_status != E_EOF) {
		cerr << argv[0] << ": error reading HTTP data!" << endl;
		return 1;
	}

	if (request_writer.close() != E_SUCCESS) {
		cerr << "Error closing request_writer" << endl;
		return 1;
	}

	if (response_writer.close() != E_SUCCESS) {
		cerr << "Error closing response_writer" << endl;
		return 1;
	}

	return 0;
}