From a7ee585a9eb94d6561d9094f0a2f89ac14bbd730 Mon Sep 17 00:00:00 2001 From: Marko Zivanovic Date: Wed, 2 Sep 2015 17:01:01 +0200 Subject: [PATCH] Improve syslog parsing; Implement basic main loop. --- src/Facility.cpp | 4 +-- src/Reader.h | 11 +++----- src/Severity.h | 4 +-- src/SyslogBulkUploader.cpp | 9 ++++--- src/SyslogBulkUploader.h | 12 +++++++-- src/SyslogMessage.cpp | 6 ++--- src/SyslogMessage.h | 4 --- src/Writer.h | 37 +++++++++++++++++++++++++++ test/CMakeLists.txt | 1 + test/SyslogBulkUploaderTests.cpp | 43 ++++++++++++++++++++++++++++++-- test/SyslogMessageTests.cpp | 6 ++--- 11 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 src/Writer.h diff --git a/src/Facility.cpp b/src/Facility.cpp index 54fb2cf..968aa39 100644 --- a/src/Facility.cpp +++ b/src/Facility.cpp @@ -32,9 +32,7 @@ const std::string Facility::readFromStream(std::istream& src) { if (c == '.') { break; } else { - if (c != ' ' && c != '\t') { - ret.push_back(c); - } + ret.push_back(c); } } return ret; diff --git a/src/Reader.h b/src/Reader.h index dc8ee66..4092f48 100644 --- a/src/Reader.h +++ b/src/Reader.h @@ -28,16 +28,11 @@ SOFTWARE. #include #include -class Reader : boost::noncopyable { +class SyslogMessage; + +class Reader : private boost::noncopyable { public: - - virtual ~Reader() { - }; - virtual std::shared_ptr nextMessage() = 0; - -private: - }; #endif /* READER_H */ diff --git a/src/Severity.h b/src/Severity.h index dbb6831..44b08cb 100644 --- a/src/Severity.h +++ b/src/Severity.h @@ -30,10 +30,10 @@ SOFTWARE. class Severity { public: - Severity(const char* src) : Severity(std::string(src)) { + Severity(const std::string& src) : _value(readFromString(src)) { }; - Severity(const std::string& src) : _value(readFromString(src)) { + Severity(const char* src) : Severity(std::string(src)) { }; Severity(std::istream& source) : Severity(readFromStream(source)) { diff --git a/src/SyslogBulkUploader.cpp b/src/SyslogBulkUploader.cpp index b3c57b2..e884d1b 100644 --- a/src/SyslogBulkUploader.cpp +++ b/src/SyslogBulkUploader.cpp @@ -23,8 +23,11 @@ SOFTWARE. */ #include "SyslogBulkUploader.h" +#include "Reader.h" +#include "Writer.h" -SyslogBulkUploader::SyslogBulkUploader() { +void SyslogBulkUploader::run() { + while (auto msg = _reader.nextMessage()) { + _writer.sendMessage(msg); + } } - - diff --git a/src/SyslogBulkUploader.h b/src/SyslogBulkUploader.h index 2e2cc66..dc0ec0a 100644 --- a/src/SyslogBulkUploader.h +++ b/src/SyslogBulkUploader.h @@ -27,11 +27,19 @@ SOFTWARE. #include +class Reader; +class Writer; + class SyslogBulkUploader : boost::noncopyable { public: - SyslogBulkUploader(); -private: + SyslogBulkUploader(Reader& reader, Writer& writer) : _reader(reader), _writer(writer) { + }; + void run(); + +private: + Reader& _reader; + Writer& _writer; }; #endif /* SYSLOGBULKUPLOADER_H */ diff --git a/src/SyslogMessage.cpp b/src/SyslogMessage.cpp index 6b926b5..e91a102 100644 --- a/src/SyslogMessage.cpp +++ b/src/SyslogMessage.cpp @@ -25,14 +25,13 @@ SOFTWARE. #include "SyslogMessage.h" void skipWhitespace(std::istream& src) { - bool whitespace = true; - while (src && whitespace) { + while (src) { std::istream::char_type c = src.peek(); if (c == ' ' || c == '\t') { src.get(); continue; } else { - whitespace = false; + break; } } } @@ -55,6 +54,7 @@ const boost::posix_time::ptime SyslogMessage::readTimestamp(std::istream& src) { }; const Facility SyslogMessage::readFacility(std::istream& src) { + skipWhitespace(src); return Facility(src); }; diff --git a/src/SyslogMessage.h b/src/SyslogMessage.h index 7805025..e27213a 100644 --- a/src/SyslogMessage.h +++ b/src/SyslogMessage.h @@ -45,22 +45,18 @@ public: }; const Facility facility() const { - return _facility; } const std::string message() const { - return _message; } const Severity severity() const { - return _severity; } const std::string source() const { - return _source; } diff --git a/src/Writer.h b/src/Writer.h new file mode 100644 index 0000000..5c4187e --- /dev/null +++ b/src/Writer.h @@ -0,0 +1,37 @@ +/* + The MIT License (MIT) + +Copyright (c) 2015 Marko Živanović + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +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 +SOFTWARE. + */ + + +#ifndef WRITER_H +#define WRITER_H + +#include "SyslogMessage.h" + +class Writer : private boost::noncopyable { +public: + virtual void sendMessage(std::shared_ptr) = 0; +}; + +#endif /* WRITER_H */ + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ef2e04e..a3a394b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable(SyslogBulkUploaderTests SyslogBulkUploaderTests.cpp) target_link_libraries(SyslogBulkUploaderTests slbu-lib ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} + ${Boost_DATE_TIME_LIBRARY} ) add_executable(SyslogMessageTests SyslogMessageTests.cpp) diff --git a/test/SyslogBulkUploaderTests.cpp b/test/SyslogBulkUploaderTests.cpp index 6d3b12b..4e0feaf 100644 --- a/test/SyslogBulkUploaderTests.cpp +++ b/test/SyslogBulkUploaderTests.cpp @@ -23,9 +23,48 @@ SOFTWARE. */ #include "../src/SyslogBulkUploader.h" +#include "../src/Reader.h" +#include "../src/Writer.h" #define BOOST_TEST_MODULE SyslogBulkUploaderTests #include +#include -BOOST_AUTO_TEST_CASE(fakeTest) { - BOOST_CHECK(true); +class MockReader : public Reader { +public: + + virtual std::shared_ptr nextMessage() { + if (_pos >= _messages.size()) { + return std::shared_ptr(); + } else { + std::stringstream ss(_messages[_pos++]); + return std::shared_ptr(new SyslogMessage(dynamic_cast (ss))); + } + } +private: + std::vector _messages = { + "2015-09-02 13:33:11 Local4.Critical 192.168.0.1 Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 1.2.3.4/22084 to 4.3.2.1/53 due to DNS Query", + "2015-09-02 13:33:11 Local4.Critical 192.168.0.1 Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 1.2.3.4/22084 to 4.3.2.1/53 due to DNS Query", + "2015-09-02 13:33:11 Local4.Critical 192.168.0.1 Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 1.2.3.4/22084 to 4.3.2.1/53 due to DNS Query" + }; + size_t _pos; +}; + +class MockWriter : public Writer { +public: + + virtual void sendMessage(std::shared_ptr msg) { + _messages.push_back(msg); + }; + std::vector> _messages; +}; + +BOOST_AUTO_TEST_CASE(test_run) { + MockReader r; + MockWriter w; + SyslogBulkUploader ul(r, w); + ul.run(); + BOOST_CHECK_EQUAL(w._messages.size(), 3); + for (size_t i = 0; i < w._messages.size(); i++) { + std::cout << *(w._messages[i].get()) << std::endl; + } } diff --git a/test/SyslogMessageTests.cpp b/test/SyslogMessageTests.cpp index cacd1c2..f0355f8 100644 --- a/test/SyslogMessageTests.cpp +++ b/test/SyslogMessageTests.cpp @@ -27,15 +27,15 @@ SOFTWARE. #include #include -BOOST_AUTO_TEST_CASE(constructor_and_getters) { - std::stringstream source("2015-09-02 13:33:11 Local4.Critical 192.168.0.1 Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 138.28.4.18/22084 to 9.28.3.28/53 due to DNS Query"); +BOOST_AUTO_TEST_CASE(parsing) { + std::stringstream source("2015-09-02 13:33:11 Local4.Critical 192.168.0.1 Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 1.2.3.4/22084 to 4.3.2.1/53 due to DNS Query"); boost::posix_time::ptime timestamp(boost::posix_time::time_from_string("2015-09-02 13:33:11")); SyslogMessage m(source); BOOST_CHECK_EQUAL(m.timestamp(), timestamp); BOOST_CHECK_EQUAL(m.facility(), Facility("Local4")); BOOST_CHECK_EQUAL(m.severity(), Severity("Critical")); BOOST_CHECK_EQUAL(m.source(), "192.168.0.1"); - BOOST_CHECK_EQUAL(m.message(), "Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 138.28.4.18/22084 to 9.28.3.28/53 due to DNS Query"); + BOOST_CHECK_EQUAL(m.message(), "Kiwi_Syslog_Server %ASA-2-106007: Deny inbound UDP from 1.2.3.4/22084 to 4.3.2.1/53 due to DNS Query"); } BOOST_AUTO_TEST_CASE(invalid_params) {