Blob Blame History Raw
From cf86dbaf75f4c81e406036b6695c717cf4fd1331 Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
Date: Wed, 24 Oct 2012 20:28:09 -0500
Subject: [PATCH 1/3] First attempt at syslog code for dprintf.

---
 src/condor_includes/dprintf_internal.h |   11 ++++-
 src/condor_utils/dprintf_setup.cpp     |   16 ++++++
 src/condor_utils/dprintf_syslog.cpp    |   19 +++++++
 src/condor_utils/dprintf_syslog.h      |   82 ++++++++++++++++++++++++++++++++
 4 files changed, 127 insertions(+), 1 deletions(-)
 create mode 100644 src/condor_utils/dprintf_syslog.cpp
 create mode 100644 src/condor_utils/dprintf_syslog.h

diff --git a/src/condor_includes/dprintf_internal.h b/src/condor_includes/dprintf_internal.h
index c26a886..b0ecf48 100644
--- a/src/condor_includes/dprintf_internal.h
+++ b/src/condor_includes/dprintf_internal.h
@@ -17,6 +17,9 @@
  *
  ***************************************************************/
 
+#ifndef __dprintf_internal_h_
+#define __dprintf_internal_h_
+
 // This #define doesn't actually do anything. This value needs to be
 // defined before any system header files are included in the source file
 // to have any effect.
@@ -27,6 +30,7 @@ typedef _Longlong int64_t;
 #else
 #include <stdint.h>
 #endif
+#include <ctime>
 
 struct DebugFileInfo;
 
@@ -37,7 +41,8 @@ enum DebugOutput
 	FILE_OUT,
 	STD_OUT,
 	STD_ERR,
-	OUTPUT_DEBUG_STR
+	OUTPUT_DEBUG_STR,
+	SYSLOG
 };
 
 /* future
@@ -70,6 +75,7 @@ struct DebugFileInfo
 	bool want_truncate;
 	bool accepts_all;
 	bool dont_panic;
+	void *userData;
 	DebugFileInfo() :
 			outputTarget(FILE_OUT),
 			debugFP(0),
@@ -79,6 +85,7 @@ struct DebugFileInfo
 			want_truncate(false),
 			accepts_all(false),
 			dont_panic(false),
+			userData(NULL),
 			dprintfFunc(NULL)
 			{}
 	DebugFileInfo(const DebugFileInfo &dfi) : outputTarget(dfi.outputTarget), debugFP(NULL), choice(dfi.choice),
@@ -115,3 +122,5 @@ void _dprintf_global_func(int cat_and_flags, int hdr_flags, time_t clock_now, st
 void dprintf_to_outdbgstr(int cat_and_flags, int hdr_flags, time_t clock_now, struct tm *tm, const char* message, DebugFileInfo* dbgInfo);
 #endif
 
+#endif
+
diff --git a/src/condor_utils/dprintf_setup.cpp b/src/condor_utils/dprintf_setup.cpp
index 440ef98..b1ccd3a 100644
--- a/src/condor_utils/dprintf_setup.cpp
+++ b/src/condor_utils/dprintf_setup.cpp
@@ -24,6 +24,7 @@
 #include "condor_sys_types.h"
 #include "condor_debug.h"
 #include "dprintf_internal.h"
+#include "dprintf_syslog.h"
 #include "condor_constants.h"
 
 #if HAVE_BACKTRACE
@@ -134,6 +135,13 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf
 					it->dprintfFunc = dprintf_to_outdbgstr;
 				}
 #endif
+				else if (logPath == "SYSLOG")
+				{
+					// Intention is to eventually user-selected
+					it->dprintfFunc = DprintfSyslog::Log;
+					it->outputTarget = SYSLOG;
+					it->userData = static_cast<void*>(DprintfSyslogFactory::NewLog(LOG_DAEMON));
+				}
 				else
 				{
 					it->outputTarget = FILE_OUT;
@@ -211,6 +219,14 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf
 
 	if(debugLogsOld)
 	{
+		
+		for (it = debugLogsOld->begin(); it != debugLogsOld->end(); it++)
+		{
+			if ((it->outputTarget == SYSLOG) && (it->userData))
+			{
+				delete static_cast<DprintfSyslog*>(it->userData);
+			}
+		}
 		delete debugLogsOld;
 	}
 
diff --git a/src/condor_utils/dprintf_syslog.cpp b/src/condor_utils/dprintf_syslog.cpp
new file mode 100644
index 0000000..d0189f8
--- /dev/null
+++ b/src/condor_utils/dprintf_syslog.cpp
@@ -0,0 +1,19 @@
+
+#include "condor_common.h"
+#include "condor_debug.h"
+#include "dprintf_syslog.h"
+
+DprintfSyslogFactory * DprintfSyslogFactory::m_singleton = NULL;
+
+void
+DprintfSyslog::Log(const char * message)
+{
+	syslog(LOG_INFO, "%s", message);
+}
+
+DprintfSyslog::~DprintfSyslog()
+{
+	DprintfSyslogFactory &factory = DprintfSyslogFactory::getInstance();
+	factory.DecCount();
+}
+
diff --git a/src/condor_utils/dprintf_syslog.h b/src/condor_utils/dprintf_syslog.h
new file mode 100644
index 0000000..a10d42d
--- /dev/null
+++ b/src/condor_utils/dprintf_syslog.h
@@ -0,0 +1,82 @@
+
+#include "dprintf_internal.h"
+#include <syslog.h>
+
+class DprintfSyslogFactory;
+
+class DprintfSyslog
+{
+	friend class DprintfSyslogFactory;
+
+public:
+	static void Log(int, int, time_t, struct tm*, const char * message, DebugFileInfo* info)
+	{
+		if (!info || !info->userData)
+		{
+			return;
+		}
+		DprintfSyslog * logger = static_cast<DprintfSyslog*>(info->userData);
+		logger->Log(message);
+	}
+
+	~DprintfSyslog();
+
+protected:
+	DprintfSyslog() {}
+
+private:
+	void Log(const char *);
+};
+
+class DprintfSyslogFactory
+{
+	friend class DprintfSyslog;
+
+public:
+	static DprintfSyslog *NewLog(int facility)
+	{
+		DprintfSyslogFactory & factory = getInstance();
+		return factory.NewDprintfSyslog(facility);
+	}
+
+protected:
+	void DecCount()
+	{
+		m_count--;
+		if (m_count == 0)
+		{
+			closelog();
+		}
+	}
+
+	static DprintfSyslogFactory & getInstance()
+	{
+		if (!m_singleton)
+		{
+			m_singleton = new DprintfSyslogFactory();
+		}
+		return *m_singleton;
+	}
+
+private:
+	DprintfSyslog * NewDprintfSyslog(int facility)
+	{
+		DprintfSyslog * logger = new DprintfSyslog();
+		if (!logger) return NULL;
+		if (m_count == 0)
+		{
+			openlog("condor", LOG_PID|LOG_NDELAY, facility);
+		}
+		m_count++;
+		return logger;
+	}
+
+	DprintfSyslogFactory() :
+		m_count(0)
+	{
+	}
+
+	static DprintfSyslogFactory *m_singleton;
+
+	unsigned int m_count;
+};
-- 
1.7.4.1


From 5b17f58b41722735bf1a7da34c728bfe3114479b Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
Date: Wed, 24 Oct 2012 20:46:52 -0500
Subject: [PATCH 2/3] Don't provide an ident - it defaults to the binary name, which is more useful anyway.

---
 src/condor_utils/dprintf_syslog.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/condor_utils/dprintf_syslog.h b/src/condor_utils/dprintf_syslog.h
index a10d42d..364a228 100644
--- a/src/condor_utils/dprintf_syslog.h
+++ b/src/condor_utils/dprintf_syslog.h
@@ -65,7 +65,7 @@ private:
 		if (!logger) return NULL;
 		if (m_count == 0)
 		{
-			openlog("condor", LOG_PID|LOG_NDELAY, facility);
+			openlog(NULL, LOG_PID|LOG_NDELAY, facility);
 		}
 		m_count++;
 		return logger;
-- 
1.7.4.1


From d082fcc410b3729241dbe82912f526d51a96a2f5 Mon Sep 17 00:00:00 2001
From: Brian Bockelman <bbockelm@cse.unl.edu>
Date: Tue, 30 Oct 2012 18:15:21 -0500
Subject: [PATCH 3/3] Prevent dprintf_syslog from compiling on Windows.

---
 src/condor_utils/CMakeLists.txt    |    4 +++-
 src/condor_utils/dprintf_setup.cpp |    7 ++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/condor_utils/CMakeLists.txt b/src/condor_utils/CMakeLists.txt
index 7ce1fd6..7de76fb 100644
--- a/src/condor_utils/CMakeLists.txt
+++ b/src/condor_utils/CMakeLists.txt
@@ -84,10 +84,12 @@ endif()
 ##################################################
 # condorapi & tests
 
-condor_selective_glob("my_username.*;condor_event.*;file_sql.*;misc_utils.*;user_log_header.*;write_user_log*;read_user_log*;iso_dates.*;file_lock.*;format_time.*;utc_time.*;stat_wrapper*;log_rotate.*;dprintf*;sig_install.*;basename.*;mkargv.*;except.*;strupr.*;lock_file.*;rotate_file.*;strcasestr.*;strnewp.*;condor_environ.*;setsyscalls.*;passwd_cache.*;uids.c*;chomp.*;subsystem_info.*;my_subsystem.*;distribution.*;my_distribution.*;get_random_num.*;libcondorapi_stubs.*;seteuid.*;setegid.*;condor_open.*;classad_merge.*;condor_attributes.*;simple_arg.*;compat_classad.*;compat_classad_util.*;classad_oldnew.*;condor_snutils.*;stringSpace.*;string_list.*;stl_string_utils.*;MyString.*;condor_xml_classads.*;directory*;param_functions.*;filename_tools_cpp.*;filename_tools.*;stat_info.*;${SAFE_OPEN_SRC}" ApiSrcs)
+condor_selective_glob("my_username.*;condor_event.*;file_sql.*;misc_utils.*;user_log_header.*;write_user_log*;read_user_log*;iso_dates.*;file_lock.*;format_time.*;utc_time.*;stat_wrapper*;log_rotate.*;dprintf.cpp;dprintf_c*;dprintf_setup.cpp;sig_install.*;basename.*;mkargv.*;except.*;strupr.*;lock_file.*;rotate_file.*;strcasestr.*;strnewp.*;condor_environ.*;setsyscalls.*;passwd_cache.*;uids.c*;chomp.*;subsystem_info.*;my_subsystem.*;distribution.*;my_distribution.*;get_random_num.*;libcondorapi_stubs.*;seteuid.*;setegid.*;condor_open.*;classad_merge.*;condor_attributes.*;simple_arg.*;compat_classad.*;compat_classad_util.*;classad_oldnew.*;condor_snutils.*;stringSpace.*;string_list.*;stl_string_utils.*;MyString.*;condor_xml_classads.*;directory*;param_functions.*;filename_tools_cpp.*;filename_tools.*;stat_info.*;${SAFE_OPEN_SRC}" ApiSrcs)
 if(WINDOWS)
     condor_selective_glob("directory.WINDOWS.*;directory_util.*;dynuser.WINDOWS.*;lock_file.WINDOWS.*;lsa_mgr.*;my_dynuser.*;ntsysinfo.WINDOWS.*;posix.WINDOWS.*;stat.WINDOWS.*;store_cred.*;token_cache.WINDOWS.*;truncate.WINDOWS.*" ApiSrcs)
     set_property( TARGET utils_genparams PROPERTY FOLDER "libraries" )
+else()
+    condor_selective_glob("dprintf_syslog*" ApiSrcs)
 endif()
 
 condor_static_lib( condorapi "${ApiSrcs}" )
diff --git a/src/condor_utils/dprintf_setup.cpp b/src/condor_utils/dprintf_setup.cpp
index b1ccd3a..b5938e2 100644
--- a/src/condor_utils/dprintf_setup.cpp
+++ b/src/condor_utils/dprintf_setup.cpp
@@ -24,7 +24,9 @@
 #include "condor_sys_types.h"
 #include "condor_debug.h"
 #include "dprintf_internal.h"
+#if !defined(WIN32)
 #include "dprintf_syslog.h"
+#endif
 #include "condor_constants.h"
 
 #if HAVE_BACKTRACE
@@ -134,7 +136,7 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf
 					it->outputTarget = OUTPUT_DEBUG_STR;
 					it->dprintfFunc = dprintf_to_outdbgstr;
 				}
-#endif
+#else
 				else if (logPath == "SYSLOG")
 				{
 					// Intention is to eventually user-selected
@@ -142,6 +144,7 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf
 					it->outputTarget = SYSLOG;
 					it->userData = static_cast<void*>(DprintfSyslogFactory::NewLog(LOG_DAEMON));
 				}
+#endif
 				else
 				{
 					it->outputTarget = FILE_OUT;
@@ -224,7 +227,9 @@ void dprintf_set_outputs(const struct dprintf_output_settings *p_info, int c_inf
 		{
 			if ((it->outputTarget == SYSLOG) && (it->userData))
 			{
+#if !defined(WIN32)
 				delete static_cast<DprintfSyslog*>(it->userData);
+#endif
 			}
 		}
 		delete debugLogsOld;
-- 
1.7.4.1