Implement command line parsing; Implement messages-per-second limits in uploader; First playable version

This commit is contained in:
Marko Zivanovic
2015-09-07 11:43:32 +02:00
parent 4f1d9f4c3d
commit 8fe990e64d
8 changed files with 99 additions and 7 deletions
+10 -2
View File
@@ -1,4 +1,5 @@
find_package(Boost COMPONENTS date_time REQUIRED) find_package(Boost COMPONENTS date_time filesystem system thread program_options REQUIRED)
find_package(Threads)
include_directories( include_directories(
${Boost_INLUDE_DIRS} ${Boost_INLUDE_DIRS}
) )
@@ -10,9 +11,16 @@ add_library(slbu-lib
SyslogMessage.cpp SyslogMessage.cpp
UDPWriter.cpp UDPWriter.cpp
) )
target_link_libraries(slbu-lib
${Boost_DATE_TIME_LIBRARY}
${Boost_THREAD_LIBRARY}
)
add_executable(syslog-bulk-uploader main.cpp) add_executable(syslog-bulk-uploader main.cpp)
target_link_libraries(syslog-bulk-uploader target_link_libraries(syslog-bulk-uploader
${CMAKE_THREAD_LIBS_INIT}
${Boost_SYSTEM_LIBRARY}
${Boost_FILESYSTEM_LIBRARY}
${Boost_PROGRAM_OPTIONS_LIBRARY}
slbu-lib slbu-lib
${Boost_DATE_TIME_LIBRARY}
) )
+2 -1
View File
@@ -27,11 +27,12 @@ SOFTWARE.
#include <fstream> #include <fstream>
#include "Reader.h" #include "Reader.h"
#include "SyslogMessage.h"
class FileReader : public Reader { class FileReader : public Reader {
public: public:
FileReader(const std::string filename) : _stream(std::ifstream(filename)) { FileReader(const std::string& filename) : _stream(filename) {
if (!_stream.is_open()) { if (!_stream.is_open()) {
throw "File not found: " + filename; throw "File not found: " + filename;
} }
+6
View File
@@ -25,9 +25,15 @@ SOFTWARE.
#include "SyslogBulkUploader.h" #include "SyslogBulkUploader.h"
#include "Reader.h" #include "Reader.h"
#include "Writer.h" #include "Writer.h"
#include "FrequencyLimit.h"
const size_t SyslogBulkUploader::DEFAULT_MPS;
void SyslogBulkUploader::run() { void SyslogBulkUploader::run() {
FrequencyLimit freqLimit(_mps);
while (auto msg = _reader.nextMessage()) { while (auto msg = _reader.nextMessage()) {
freqLimit.tick();
_writer.sendMessage(msg); _writer.sendMessage(msg);
} }
} }
+4 -1
View File
@@ -33,13 +33,16 @@ class Writer;
class SyslogBulkUploader : boost::noncopyable { class SyslogBulkUploader : boost::noncopyable {
public: public:
SyslogBulkUploader(Reader& reader, Writer& writer) : _reader(reader), _writer(writer) { SyslogBulkUploader(Reader& reader, Writer& writer, const size_t& mps = DEFAULT_MPS) : _reader(reader),
_writer(writer), _mps(mps) {
}; };
void run(); void run();
private: private:
const static size_t DEFAULT_MPS = 1000;
Reader& _reader; Reader& _reader;
Writer& _writer; Writer& _writer;
const size_t _mps;
}; };
#endif /* SYSLOGBULKUPLOADER_H */ #endif /* SYSLOGBULKUPLOADER_H */
+1 -1
View File
@@ -29,7 +29,7 @@ SOFTWARE.
using boost::asio::ip::udp; using boost::asio::ip::udp;
using namespace boost::asio; using namespace boost::asio;
UDPWriter::UDPWriter(const std::string& destination, const int port) { UDPWriter::UDPWriter(const std::string& destination, const uint16_t port) {
udp::resolver resolver(_ios); udp::resolver resolver(_ios);
udp::resolver::query query(destination, std::to_string(port)); udp::resolver::query query(destination, std::to_string(port));
udp::resolver::iterator it = resolver.resolve(query); udp::resolver::iterator it = resolver.resolve(query);
+1 -1
View File
@@ -32,7 +32,7 @@ SOFTWARE.
class UDPWriter : public Writer { class UDPWriter : public Writer {
public: public:
UDPWriter(const std::string&, const int); UDPWriter(const std::string&, const uint16_t);
virtual void sendMessage(std::shared_ptr<const SyslogMessage>); virtual void sendMessage(std::shared_ptr<const SyslogMessage>);
+73 -1
View File
@@ -21,10 +21,82 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include <iostream> #include <iostream>
#include <boost/program_options.hpp>
#include "SyslogBulkUploader.h"
#include "FileReader.h"
#include "UDPWriter.h"
namespace po = boost::program_options;
using namespace std;
size_t mps;
string dest;
uint16_t port;
vector<string> files;
int main(int argc, char** argv) { int main(int argc, char** argv) {
std::cout << "Hello World!" << std::endl; po::options_description desc("Supported options");
desc.add_options()
("help,h", "display help message")
("version,v", "display version information")
("mps,m", po::value<size_t>(&mps)->default_value(1000), "try to maintain this rate of messages-per-second")
("dest,d", po::value<string>(&dest), "destination host name")
("port,p", po::value<uint16_t>(&port)->default_value(514), "destination port")
("files,f", po::value<vector < string >> (&files), "input file(s)")
;
po::positional_options_description pos;
pos.add("files", -1);
po::variables_map vars;
try {
po::store(po::command_line_parser(argc, argv).options(desc).positional(pos).run(), vars);
} catch (exception& ex) {
cout << "Error parsing command line: " << ex.what() << endl;
return -1;
}
po::notify(vars);
if (vars.count("help")) {
desc.print(std::cout);
return 0;
}
if (vars.count("version")) {
cout << "VERSION" << std::endl;
return 0;
}
if (!vars.count("dest")) {
cout << "ERROR: You must specify destination hostname" << endl;
desc.print(cout);
return -1;
}
if (!vars.count("files")) {
cout << "ERROR: You must specify at least one input file" << endl;
desc.print(cout);
return -1;
}
UDPWriter w(dest, port);
for (auto& file : files) {
try {
FileReader r(file);
SyslogBulkUploader uploader(r, w, mps);
cout << "Sending logs from " << file << " to udp://" << dest << ":" << port << " at a max rate of " <<
mps << " messages per second ... ";
uploader.run();
cout << "done" << endl;
} catch (string& ex) {
cout << ex << endl;
} catch (exception& ex) {
cout << ex.what() << endl;
}
}
} }
+2
View File
@@ -14,6 +14,7 @@ target_link_libraries(SyslogBulkUploaderTests
${Boost_FILESYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY}
${CMAKE_THREAD_LIBS_INIT} ${CMAKE_THREAD_LIBS_INIT}
${Boost_THREAD_LIBRARY}
) )
add_executable(SyslogMessageTests SyslogMessageTests.cpp) add_executable(SyslogMessageTests SyslogMessageTests.cpp)
@@ -36,5 +37,6 @@ target_link_libraries(FrequencyLimitTests
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
${Boost_DATE_TIME_LIBRARY} ${Boost_DATE_TIME_LIBRARY}
${Boost_THREAD_LIBRARY} ${Boost_THREAD_LIBRARY}
${Boost_SYSTEM_LIBRARY}
) )