---
 opensaf.spec.in                            |  2 +
 src/dtm/Makefile.am                        |  3 +
 src/dtm/transport/log_server.cc            | 95 ++++++++++++++++++++++++++++--
 src/dtm/transport/log_server.h             | 10 +++-
 src/dtm/transport/log_writer.cc            |  6 +-
 src/dtm/transport/log_writer.h             |  4 +-
 src/dtm/transport/main.cc                  |  4 ++
 src/dtm/transport/osaf-transport.in        |  1 +
 src/dtm/transport/tests/log_writer_test.cc |  2 +-
 src/dtm/transport/transportd.conf          | 13 ++++
 10 files changed, 129 insertions(+), 11 deletions(-)
 create mode 100644 src/dtm/transport/transportd.conf

diff --git a/opensaf.spec.in b/opensaf.spec.in
index db4b5be..452d1c8 100644
--- a/opensaf.spec.in
+++ b/opensaf.spec.in
@@ -1397,6 +1397,7 @@ fi
 %config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.controller
 %config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.payload
 %config(noreplace) %{_pkgsysconfdir}/dtmd.conf
+%config(noreplace) %{_pkgsysconfdir}/transportd.conf
 %{_pkglibdir}/osafrded
 %{_pkgclcclidir}/osaf-rded
 %{_pkglibdir}/osaffmd
@@ -1423,6 +1424,7 @@ fi
 %dir %{_pkgsysconfdir}
 %config(noreplace) %{_pkgsysconfdir}/nodeinit.conf.payload
 %config(noreplace) %{_pkgsysconfdir}/dtmd.conf
+%config(noreplace) %{_pkgsysconfdir}/transportd.conf
 %{_pkglibdir}/osafdtmd
 %{_pkglibdir}/osaftransportd
 %{_pkgclcclidir}/osaf-dtm
diff --git a/src/dtm/Makefile.am b/src/dtm/Makefile.am
index f3ba720..822249c 100644
--- a/src/dtm/Makefile.am
+++ b/src/dtm/Makefile.am
@@ -57,6 +57,9 @@ nodist_pkgclccli_SCRIPTS += \
 dist_pkgsysconf_DATA += \
        src/dtm/dtmnd/dtmd.conf
 
+dist_pkgsysconf_DATA += \
+       src/dtm/transport/transportd.conf
+
 bin_osaftransportd_CXXFLAGS = $(AM_CXXFLAGS)
 
 bin_osaftransportd_CPPFLAGS = \
diff --git a/src/dtm/transport/log_server.cc b/src/dtm/transport/log_server.cc
index 2d6c961..780feb1 100644
--- a/src/dtm/transport/log_server.cc
+++ b/src/dtm/transport/log_server.cc
@@ -18,21 +18,28 @@
 
 #include "dtm/transport/log_server.h"
 #include <cstring>
+#include <signal.h>
+#include <syslog.h>
 #include "base/osaf_poll.h"
 #include "base/time.h"
 #include "dtm/common/osaflog_protocol.h"
 #include "osaf/configmake.h"
 
+#define TRANSPORTD_CONFIG_FILE PKGSYSCONFDIR "/transportd.conf"
+
+size_t LogServer::no_of_backups = 9;
+size_t LogServer::kmax_file_size = 5000 * 1024;
+
 const Osaflog::ClientAddressConstantPrefix LogServer::address_header_{};
 
 LogServer::LogServer(int term_fd)
     : term_fd_{term_fd},
       log_socket_{Osaflog::kServerSocketPath, base::UnixSocket::kNonblocking},
       log_streams_{},
-      current_stream_{new LogStream{"mds.log", 1}},
+      current_stream_{new LogStream{"mds.log", 1, LogServer::kmax_file_size}},
       no_of_log_streams_{1} {
   log_streams_["mds.log"] = current_stream_;
-}
+  }
 
 LogServer::~LogServer() {
   for (const auto& s : log_streams_) delete s.second;
@@ -40,6 +47,12 @@ LogServer::~LogServer() {
 
 void LogServer::Run() {
   struct pollfd pfd[2] = {{term_fd_, POLLIN, 0}, {log_socket_.fd(), POLLIN, 
0}};
+
+  /* Initialize a signal handler for loading new configuration from 
transportd.conf */
+  if ((signal(SIGUSR2, usr2_sig_handler)) == SIG_ERR) {
+      syslog(LOG_ERR,"signal USR2 registration failed: %s", strerror(errno));
+  }
+
   do {
     for (int i = 0; i < 256; ++i) {
       char* buffer = current_stream_->current_buffer_position();
@@ -88,6 +101,12 @@ void LogServer::Run() {
   } while ((pfd[0].revents & POLLIN) == 0);
 }
 
+void LogServer::usr2_sig_handler(int sig) {
+   syslog(LOG_ERR, "Recived the SIGUSR2 Signal");
+   ReadConfig(TRANSPORTD_CONFIG_FILE);
+   signal(SIGUSR2, usr2_sig_handler);
+}
+
 LogServer::LogStream* LogServer::GetStream(const char* msg_id,
                                            size_t msg_id_size) {
   if (msg_id_size == current_stream_->log_name_size() &&
@@ -99,7 +118,8 @@ LogServer::LogStream* LogServer::GetStream(const char* 
msg_id,
   if (iter != log_streams_.end()) return iter->second;
   if (no_of_log_streams_ >= kMaxNoOfStreams) return nullptr;
   if (!ValidateLogName(msg_id, msg_id_size)) return nullptr;
-  LogStream* stream = new LogStream{log_name, 9};
+
+  LogStream* stream = new LogStream{log_name, LogServer::no_of_backups, 
LogServer::kmax_file_size};
   auto result = log_streams_.insert(
       std::map<std::string, LogStream*>::value_type{log_name, stream});
   if (!result.second) osaf_abort(msg_id_size);
@@ -107,6 +127,71 @@ LogServer::LogStream* LogServer::GetStream(const char* 
msg_id,
   return stream;
 }
 
+bool LogServer::ReadConfig(const char *transport_config_file) {
+  FILE *transport_conf_file;
+  char line[256];
+  size_t maxFileSize=0;
+  size_t noOfBackupFiles=0;
+  int i, n, comment_line, tag_len = 0;
+
+  /* Open transportd.conf config file. */
+  transport_conf_file = fopen(transport_config_file, "r");
+  if (transport_conf_file == nullptr) {
+
+    syslog(LOG_ERR,"Not able to read transportd.conf: %s", strerror(errno));
+    return false;
+  }
+
+
+  /* Read file. */
+  while (fgets(line, 256, transport_conf_file)) {
+    /* If blank line, skip it - and set tag back to 0. */
+    if (strcmp(line, "\n") == 0) {
+      continue;
+    }
+
+    /* If a comment line, skip it. */
+    n = strlen(line);
+    comment_line = 0;
+    for (i = 0; i < n; i++) {
+      if ((line[i] == ' ') || (line[i] == '\t'))
+        continue;
+      else if (line[i] == '#') {
+        comment_line = 1;
+        break;
+      } else
+        break;
+    }
+    if (comment_line) continue;
+    line[n - 1] = 0;
+
+    if (strncmp(line, "TRANSPORT_MAX_LOG_FILESIZE=",
+                  strlen("TRANSPORT_MAX_LOG_FILESIZE=")) == 0) {
+      tag_len = strlen("TRANSPORT_MAX_LOG_FILESIZE=");
+      maxFileSize = atoi(&line[tag_len]);
+
+      if (maxFileSize > 1) {
+        LogServer::kmax_file_size = maxFileSize * 1024 * 1024;
+      }
+    }
+
+    if (strncmp(line, "TRANSPORT_NO_OF_BACKUP_LOG_FILES=",
+                  strlen("TRANSPORT_NO_OF_BACKUP_LOG_FILES=")) == 0) {
+      tag_len = strlen("TRANSPORT_NO_OF_BACKUP_LOG_FILES=");
+      noOfBackupFiles = atoi(&line[tag_len]);
+
+      if (noOfBackupFiles > 1) {
+        LogServer::no_of_backups = noOfBackupFiles;
+      }
+    }
+  }
+
+  /* Close file. */
+  fclose(transport_conf_file);
+
+  return true;
+}
+
 bool LogServer::ValidateLogName(const char* msg_id, size_t msg_id_size) {
   if (msg_id_size < 1 || msg_id_size > LogStream::kMaxLogNameSize) return 
false;
   if (msg_id[0] == '.') return false;
@@ -152,8 +237,8 @@ std::string LogServer::ExecuteCommand(const std::string& 
command) {
 }
 
 LogServer::LogStream::LogStream(const std::string& log_name,
-                                size_t no_of_backups)
-    : log_name_{log_name}, last_flush_{}, log_writer_{log_name, no_of_backups} 
{
+                                size_t no_of_backups, size_t kmax_file_size)
+    : log_name_{log_name}, last_flush_{}, log_writer_{log_name, no_of_backups, 
kmax_file_size} {
   if (log_name.size() > kMaxLogNameSize) osaf_abort(log_name.size());
 }
 
diff --git a/src/dtm/transport/log_server.h b/src/dtm/transport/log_server.h
index c988b61..95ea980 100644
--- a/src/dtm/transport/log_server.h
+++ b/src/dtm/transport/log_server.h
@@ -42,12 +42,14 @@ class LogServer {
   // process has received the SIGTERM signal, which is indicated by the caller
   // by making the term_fd (provided in the constructor) readable.
   void Run();
+  // To read Transportd.conf
+  static bool ReadConfig(const char *transport_config_file);
 
  private:
   class LogStream {
    public:
     static constexpr size_t kMaxLogNameSize = 32;
-    LogStream(const std::string& log_name, size_t no_of_backups);
+    LogStream(const std::string& log_name, size_t no_of_backups, size_t 
kMaxFileSize);
 
     size_t log_name_size() const { return log_name_.size(); }
     const char* log_name_data() const { return log_name_.data(); }
@@ -79,10 +81,16 @@ class LogServer {
   static bool ValidateLogName(const char* msg_id, size_t msg_id_size);
   void ExecuteCommand(const char* command, size_t size,
                       const struct sockaddr_un& addr, socklen_t addrlen);
+  // Signal handler for reading config file transportd.conf
+  static void usr2_sig_handler(int sig);
   static bool ValidateAddress(const struct sockaddr_un& addr,
                               socklen_t addrlen);
   std::string ExecuteCommand(const std::string& command);
   int term_fd_;
+  // Configuration for LogServer
+  static size_t no_of_backups;
+  static size_t kmax_file_size;
+
   base::UnixServerSocket log_socket_;
   std::map<std::string, LogStream*> log_streams_;
   LogStream* current_stream_;
diff --git a/src/dtm/transport/log_writer.cc b/src/dtm/transport/log_writer.cc
index 8f1d6a7..329ad77 100644
--- a/src/dtm/transport/log_writer.cc
+++ b/src/dtm/transport/log_writer.cc
@@ -17,6 +17,7 @@
  */
 
 #include "dtm/transport/log_writer.h"
+#include "dtm/transport/log_server.h"
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <unistd.h>
@@ -25,13 +26,14 @@
 #include "base/getenv.h"
 #include "osaf/configmake.h"
 
-LogWriter::LogWriter(const std::string& log_name, size_t no_of_backups)
+LogWriter::LogWriter(const std::string& log_name, size_t no_of_backups, size_t 
kmax_file_size)
     : log_file_{base::GetEnv<std::string>("pkglogdir", PKGLOGDIR) + "/" +
                 log_name},
       fd_{-1},
       current_file_size_{0},
       current_buffer_size_{0},
       no_of_backups_{no_of_backups},
+      kmax_file_size_{kmax_file_size},
       buffer_{new char[kBufferSize]} {}
 
 LogWriter::~LogWriter() {
@@ -95,7 +97,7 @@ void LogWriter::Flush() {
   if (size == 0) return;
   if (fd_ < 0) Open();
   if (fd_ < 0) return;
-  if (current_file_size_ >= kMaxFileSize) {
+  if (current_file_size_ >= kmax_file_size_) {
     RotateLog();
     if (fd_ < 0) Open();
     if (fd_ < 0) return;
diff --git a/src/dtm/transport/log_writer.h b/src/dtm/transport/log_writer.h
index 89d7b37..eb38cfa 100644
--- a/src/dtm/transport/log_writer.h
+++ b/src/dtm/transport/log_writer.h
@@ -29,7 +29,7 @@ class LogWriter {
  public:
   constexpr static const size_t kMaxMessageSize = 2 * size_t{1024};
 
-  LogWriter(const std::string& log_name, size_t no_of_backups);
+  LogWriter(const std::string& log_name, size_t no_of_backups, size_t 
kmax_file_size);
   virtual ~LogWriter();
 
   char* current_buffer_position() { return buffer_ + current_buffer_size_; }
@@ -43,7 +43,6 @@ class LogWriter {
 
  private:
   constexpr static const size_t kBufferSize = 128 * size_t{1024};
-  constexpr static const size_t kMaxFileSize = 5000 * size_t{1024};
   void Open();
   void Close();
   void RotateLog();
@@ -55,6 +54,7 @@ class LogWriter {
   size_t current_file_size_;
   size_t current_buffer_size_;
   size_t no_of_backups_;
+  size_t kmax_file_size_;
   char* buffer_;
 
   DELETE_COPY_AND_MOVE_OPERATORS(LogWriter);
diff --git a/src/dtm/transport/main.cc b/src/dtm/transport/main.cc
index cf091c8..0d1fedf 100644
--- a/src/dtm/transport/main.cc
+++ b/src/dtm/transport/main.cc
@@ -26,6 +26,9 @@
 #include "dtm/transport/log_server.h"
 #include "dtm/transport/transport_monitor.h"
 
+
+#define TRANSPORTD_CONFIG_FILE PKGSYSCONFDIR "/transportd.conf"
+
 constexpr static const int kDaemonStartWaitTimeInSeconds = 15;
 
 enum Termination { kExit, kDaemonExit, kReboot };
@@ -82,6 +85,7 @@ Result MainFunction(int term_fd) {
     pthread_attr_destroy(&attr);
     return Result{kExit, "pthread_attr_setinheritsched() failed", result};
   }
+  LogServer::ReadConfig(TRANSPORTD_CONFIG_FILE);
   LogServer log_server{term_fd};
   pthread_t thread_id;
   result =
diff --git a/src/dtm/transport/osaf-transport.in 
b/src/dtm/transport/osaf-transport.in
index 99a2563..a30ac63 100644
--- a/src/dtm/transport/osaf-transport.in
+++ b/src/dtm/transport/osaf-transport.in
@@ -24,6 +24,7 @@ if [ ! -r $osafdirfile ]; then
        exit 6
 else
        . $osafdirfile
+       . $pkgsysconfdir/transportd.conf
        . $pkgsysconfdir/nid.conf
 fi
 
diff --git a/src/dtm/transport/tests/log_writer_test.cc 
b/src/dtm/transport/tests/log_writer_test.cc
index f57681c..e96831e 100644
--- a/src/dtm/transport/tests/log_writer_test.cc
+++ b/src/dtm/transport/tests/log_writer_test.cc
@@ -54,7 +54,7 @@ TEST_F(LogWriterTest, ExistingFileShouldBeAppended) {
   std::ofstream ostr(tmpdir_ + std::string("/mds.log"));
   ostr << first_line << std::endl;
   ostr.close();
-  LogWriter* log_writer = new LogWriter{"mds.log", 1};
+  LogWriter* log_writer = new LogWriter{"mds.log", 1, 5000 * 1024};
   memcpy(log_writer->current_buffer_position(), second_line,
          sizeof(second_line) - 1);
   log_writer->current_buffer_position()[sizeof(second_line) - 1] = '\n';
diff --git a/src/dtm/transport/transportd.conf 
b/src/dtm/transport/transportd.conf
new file mode 100644
index 0000000..48b334f
--- /dev/null
+++ b/src/dtm/transport/transportd.conf
@@ -0,0 +1,13 @@
+# This file contains configuration for the Transportd service
+
+#
+# TRANSPORT_MAX_LOG_FILESIZE: The  maximum size of the log file. The size 
value should
+# be in MB's i.e if you give 6 then it is treated as 6 MB. By default value 
will be
+# 5 MB
+TRANSPORT_MAX_LOG_FILESIZE=5
+
+#
+# TRANSPORT_NO_OF_BACKUP_LOG_FILES: Number of backup files to maintain. Log 
rotation will
+# be done based on this value. Default value will be 9
+# i.e totally 10 log files will be maintain.
+TRANSPORT_NO_OF_BACKUP_LOG_FILES=9
-- 
1.9.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to