2013-03-19 13:04:30 +01:00
/******************************************************************************
* Icinga 2 *
2014-03-19 01:02:29 +01:00
* Copyright ( C ) 2012 - 2014 Icinga Development Team ( http : //www.icinga.org) *
2013-03-19 13:04:30 +01:00
* *
* This program is free software ; you can redistribute it and / or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation ; either version 2 *
* of the License , or ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program ; if not , write to the Free Software Foundation *
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA . *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-05-25 16:23:35 +02:00
# include "compat/compatlogger.hpp"
# include "icinga/service.hpp"
# include "icinga/checkcommand.hpp"
# include "icinga/eventcommand.hpp"
# include "icinga/notification.hpp"
# include "icinga/macroprocessor.hpp"
# include "icinga/externalcommandprocessor.hpp"
# include "icinga/compatutility.hpp"
# include "config/configcompilercontext.hpp"
# include "base/dynamictype.hpp"
# include "base/objectlock.hpp"
# include "base/logger_fwd.hpp"
# include "base/exception.hpp"
# include "base/convert.hpp"
# include "base/application.hpp"
# include "base/utility.hpp"
# include "base/scriptfunction.hpp"
# include "base/statsfunction.hpp"
2013-03-19 13:04:30 +01:00
# include <boost/foreach.hpp>
2013-07-02 13:38:06 +02:00
# include <boost/algorithm/string.hpp>
2013-03-19 13:04:30 +01:00
using namespace icinga ;
2013-09-25 10:55:50 +02:00
REGISTER_TYPE ( CompatLogger ) ;
REGISTER_SCRIPTFUNCTION ( ValidateRotationMethod , & CompatLogger : : ValidateRotationMethod ) ;
2013-03-19 13:04:30 +01:00
2014-02-17 16:34:18 +01:00
REGISTER_STATSFUNCTION ( CompatLoggerStats , & CompatLogger : : StatsFunc ) ;
2014-05-22 09:02:44 +02:00
Value CompatLogger : : StatsFunc ( Dictionary : : Ptr & status , Dictionary : : Ptr & )
2014-02-17 16:34:18 +01:00
{
2014-02-18 10:53:44 +01:00
Dictionary : : Ptr nodes = make_shared < Dictionary > ( ) ;
BOOST_FOREACH ( const CompatLogger : : Ptr & compat_logger , DynamicType : : GetObjects < CompatLogger > ( ) ) {
nodes - > Set ( compat_logger - > GetName ( ) , 1 ) ; //add more stats
}
status - > Set ( " compatlogger " , nodes ) ;
2014-02-17 16:34:18 +01:00
return 0 ;
}
2013-03-19 13:04:30 +01:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : Start ( void )
2013-03-19 13:04:30 +01:00
{
2013-09-09 10:06:49 +02:00
DynamicObject : : Start ( ) ;
2014-04-03 15:36:13 +02:00
Checkable : : OnNewCheckResult . connect ( bind ( & CompatLogger : : CheckResultHandler , this , _1 , _2 ) ) ;
Checkable : : OnNotificationSentToUser . connect ( bind ( & CompatLogger : : NotificationSentHandler , this , _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 ) ) ;
Checkable : : OnFlappingChanged . connect ( bind ( & CompatLogger : : FlappingHandler , this , _1 , _2 ) ) ;
Checkable : : OnDowntimeTriggered . connect ( boost : : bind ( & CompatLogger : : TriggerDowntimeHandler , this , _1 , _2 ) ) ;
Checkable : : OnDowntimeRemoved . connect ( boost : : bind ( & CompatLogger : : RemoveDowntimeHandler , this , _1 , _2 ) ) ;
Checkable : : OnEventCommandExecuted . connect ( bind ( & CompatLogger : : EventCommandHandler , this , _1 ) ) ;
2013-10-09 14:56:03 +02:00
ExternalCommandProcessor : : OnNewExternalCommand . connect ( boost : : bind ( & CompatLogger : : ExternalCommandHandler , this , _2 , _3 ) ) ;
2013-06-28 16:08:43 +02:00
2013-11-06 08:51:56 +01:00
m_RotationTimer = make_shared < Timer > ( ) ;
2013-09-25 10:55:50 +02:00
m_RotationTimer - > OnTimerExpired . connect ( boost : : bind ( & CompatLogger : : RotationTimerHandler , this ) ) ;
2013-03-19 13:04:30 +01:00
m_RotationTimer - > Start ( ) ;
2013-03-20 11:11:46 +01:00
ReopenFile ( false ) ;
ScheduleNextRotation ( ) ;
2013-03-19 13:04:30 +01:00
}
/**
* @ threadsafety Always .
*/
2014-04-03 15:36:13 +02:00
void CompatLogger : : CheckResultHandler ( const Checkable : : Ptr & checkable , const CheckResult : : Ptr & cr )
2013-03-19 13:04:30 +01:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2013-03-19 13:04:30 +01:00
2013-11-09 14:22:38 +01:00
Dictionary : : Ptr vars_after = cr - > GetVarsAfter ( ) ;
2013-03-19 13:04:30 +01:00
long state_after = vars_after - > Get ( " state " ) ;
long stateType_after = vars_after - > Get ( " state_type " ) ;
long attempt_after = vars_after - > Get ( " attempt " ) ;
bool reachable_after = vars_after - > Get ( " reachable " ) ;
2013-11-09 14:22:38 +01:00
Dictionary : : Ptr vars_before = cr - > GetVarsBefore ( ) ;
2013-03-19 13:04:30 +01:00
if ( vars_before ) {
long state_before = vars_before - > Get ( " state " ) ;
long stateType_before = vars_before - > Get ( " state_type " ) ;
long attempt_before = vars_before - > Get ( " attempt " ) ;
bool reachable_before = vars_before - > Get ( " reachable " ) ;
if ( state_before = = state_after & & stateType_before = = stateType_after & &
attempt_before = = attempt_after & & reachable_before = = reachable_after )
return ; /* Nothing changed, ignore this checkresult. */
}
2013-10-31 14:18:20 +01:00
String output ;
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-06-26 18:23:59 +02:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < Service : : StateToString ( static_cast < ServiceState > ( state_after ) ) < < " ; "
< < Service : : StateTypeToString ( static_cast < StateType > ( stateType_after ) ) < < " ; "
< < attempt_after < < " ; "
< < output < < " "
< < " " ;
} else {
2014-04-08 08:54:49 +02:00
String state = Host : : StateToString ( Host : : CalculateState ( static_cast < ServiceState > ( state_after ) ) ) ;
if ( ! reachable_after )
state = " UNREACHABLE " ;
2013-03-19 13:04:30 +01:00
msgbuf < < " HOST ALERT: "
< < host - > GetName ( ) < < " ; "
2014-04-08 08:54:49 +02:00
< < state < < " ; "
2014-04-03 15:36:13 +02:00
< < Host : : StateTypeToString ( static_cast < StateType > ( stateType_after ) ) < < " ; "
2013-03-19 13:04:30 +01:00
< < attempt_after < < " ; "
2013-06-26 18:23:59 +02:00
< < output < < " "
2013-03-19 13:04:30 +01:00
< < " " ;
}
2013-06-24 08:56:13 +02:00
{
ObjectLock olock ( this ) ;
2014-04-03 15:36:13 +02:00
WriteLine ( msgbuf . str ( ) ) ;
2013-06-24 08:56:13 +02:00
Flush ( ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-09-17 19:40:23 +02:00
/**
* @ threadsafety Always .
*/
2014-04-03 15:36:13 +02:00
void CompatLogger : : TriggerDowntimeHandler ( const Checkable : : Ptr & checkable , const Downtime : : Ptr & downtime )
2013-09-17 19:40:23 +02:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2013-09-17 19:40:23 +02:00
if ( ! downtime )
return ;
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < " STARTED " < < " ; "
< < " Checkable has entered a period of scheduled downtime. "
< < " " ;
} else {
2013-09-17 19:40:23 +02:00
msgbuf < < " HOST DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
2013-09-18 10:08:28 +02:00
< < " STARTED " < < " ; "
2014-04-03 15:36:13 +02:00
< < " Checkable has entered a period of scheduled downtime. "
2013-09-17 19:40:23 +02:00
< < " " ;
}
{
ObjectLock oLock ( this ) ;
2014-04-03 15:36:13 +02:00
WriteLine ( msgbuf . str ( ) ) ;
2013-09-17 19:40:23 +02:00
Flush ( ) ;
}
}
/**
* @ threadsafety Always .
*/
2014-04-03 15:36:13 +02:00
void CompatLogger : : RemoveDowntimeHandler ( const Checkable : : Ptr & checkable , const Downtime : : Ptr & downtime )
2013-09-17 19:40:23 +02:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2013-09-17 19:40:23 +02:00
if ( ! downtime )
return ;
String downtime_output ;
String downtime_state_str ;
2013-11-09 22:08:26 +01:00
if ( downtime - > GetWasCancelled ( ) ) {
2013-09-17 19:40:23 +02:00
downtime_output = " Scheduled downtime for service has been cancelled. " ;
downtime_state_str = " CANCELLED " ;
} else {
2014-04-03 15:36:13 +02:00
downtime_output = " Checkable has exited from a period of scheduled downtime. " ;
2013-09-17 19:40:23 +02:00
downtime_state_str = " STOPPED " ;
}
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < downtime_state_str < < " ; "
< < downtime_output
< < " " ;
} else {
2013-09-17 19:40:23 +02:00
msgbuf < < " HOST DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < downtime_state_str < < " ; "
< < downtime_output
< < " " ;
}
{
ObjectLock oLock ( this ) ;
2014-04-03 15:36:13 +02:00
WriteLine ( msgbuf . str ( ) ) ;
2013-09-17 19:40:23 +02:00
Flush ( ) ;
}
}
2013-06-28 13:40:01 +02:00
2013-06-28 21:31:38 +02:00
/**
* @ threadsafety Always .
*/
2014-04-03 15:36:13 +02:00
void CompatLogger : : NotificationSentHandler ( const Notification : : Ptr & notification , const Checkable : : Ptr & checkable ,
2014-01-27 17:22:48 +01:00
const User : : Ptr & user , NotificationType const & notification_type , CheckResult : : Ptr const & cr ,
2013-11-09 14:22:38 +01:00
const String & author , const String & comment_text , const String & command_name )
2013-06-28 21:31:38 +02:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2013-06-28 21:31:38 +02:00
String notification_type_str = Notification : : NotificationTypeToString ( notification_type ) ;
2014-02-04 10:54:38 +01:00
/* override problem notifications with their current state string */
2014-04-03 15:36:13 +02:00
if ( notification_type = = NotificationProblem ) {
2014-04-07 21:19:07 +02:00
if ( service )
2014-04-03 15:36:13 +02:00
notification_type_str = Service : : StateToString ( service - > GetState ( ) ) ;
else
2014-04-08 08:54:49 +02:00
notification_type_str = host - > IsReachable ( ) ? Host : : StateToString ( host - > GetState ( ) ) : " UNREACHABLE " ;
2014-04-03 15:36:13 +02:00
}
2014-02-04 10:54:38 +01:00
2013-06-28 21:31:38 +02:00
String author_comment = " " ;
if ( notification_type = = NotificationCustom | | notification_type = = NotificationAcknowledgement ) {
2013-10-29 13:44:43 +01:00
author_comment = author + " ; " + comment_text ;
2013-06-28 21:31:38 +02:00
}
if ( ! cr )
return ;
String output ;
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-06-28 21:31:38 +02:00
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE NOTIFICATION: "
< < user - > GetName ( ) < < " ; "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < notification_type_str < < " ; "
< < command_name < < " ; "
< < output < < " ; "
< < author_comment
< < " " ;
} else {
2013-06-28 21:31:38 +02:00
msgbuf < < " HOST NOTIFICATION: "
2013-08-20 11:06:04 +02:00
< < user - > GetName ( ) < < " ; "
2013-06-28 21:31:38 +02:00
< < host - > GetName ( ) < < " ; "
< < notification_type_str < < " "
2014-04-08 08:54:49 +02:00
< < " ( " < < ( host - > IsReachable ( ) ? Host : : StateToString ( host - > GetState ( ) ) : " UNREACHABLE " ) < < " ); "
2013-10-29 13:44:43 +01:00
< < command_name < < " ; "
< < output < < " ; "
< < author_comment
2013-06-28 21:31:38 +02:00
< < " " ;
2014-04-03 15:36:13 +02:00
}
2013-06-28 21:31:38 +02:00
2014-04-03 15:36:13 +02:00
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
2013-06-28 21:31:38 +02:00
Flush ( ) ;
}
}
2013-07-01 14:29:07 +02:00
/**
* @ threadsafety Always .
*/
2014-04-03 15:36:13 +02:00
void CompatLogger : : FlappingHandler ( const Checkable : : Ptr & checkable , FlappingState flapping_state )
2013-07-01 14:29:07 +02:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2013-07-01 14:29:07 +02:00
String flapping_state_str ;
String flapping_output ;
switch ( flapping_state ) {
case FlappingStarted :
2014-04-07 21:19:07 +02:00
flapping_output = " Checkable appears to have started flapping ( " + Convert : : ToString ( checkable - > GetFlappingCurrent ( ) ) + " % change >= " + Convert : : ToString ( checkable - > GetFlappingThreshold ( ) ) + " % threshold) " ;
2013-07-01 14:29:07 +02:00
flapping_state_str = " STARTED " ;
break ;
case FlappingStopped :
2014-04-07 21:19:07 +02:00
flapping_output = " Checkable appears to have stopped flapping ( " + Convert : : ToString ( checkable - > GetFlappingCurrent ( ) ) + " % change < " + Convert : : ToString ( checkable - > GetFlappingThreshold ( ) ) + " % threshold) " ;
2013-07-01 14:29:07 +02:00
flapping_state_str = " STOPPED " ;
break ;
case FlappingDisabled :
flapping_output = " Flap detection has been disabled " ;
flapping_state_str = " DISABLED " ;
break ;
default :
2014-05-28 13:03:44 +02:00
Log ( LogCritical , " CompatLogger " , " Unknown flapping state: " + Convert : : ToString ( flapping_state ) ) ;
2013-07-01 14:29:07 +02:00
return ;
}
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE FLAPPING ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < flapping_state_str < < " ; "
< < flapping_output
< < " " ;
} else {
2013-07-01 14:29:07 +02:00
msgbuf < < " HOST FLAPPING ALERT: "
< < host - > GetName ( ) < < " ; "
< < flapping_state_str < < " ; "
< < flapping_output
< < " " ;
2014-04-03 15:36:13 +02:00
}
2013-07-01 14:29:07 +02:00
2014-04-03 15:36:13 +02:00
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
2013-07-01 14:29:07 +02:00
Flush ( ) ;
}
}
2013-06-28 21:31:38 +02:00
2013-09-30 20:34:55 +02:00
void CompatLogger : : ExternalCommandHandler ( const String & command , const std : : vector < String > & arguments )
{
std : : ostringstream msgbuf ;
msgbuf < < " EXTERNAL COMMAND: "
< < command < < " ; "
< < boost : : algorithm : : join ( arguments , " ; " )
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
2014-04-03 15:36:13 +02:00
void CompatLogger : : EventCommandHandler ( const Checkable : : Ptr & checkable )
2013-11-05 18:33:57 +01:00
{
2014-04-03 15:36:13 +02:00
Host : : Ptr host ;
Service : : Ptr service ;
2014-04-07 21:19:07 +02:00
tie ( host , service ) = GetHostService ( checkable ) ;
2014-04-03 15:36:13 +02:00
2014-04-07 21:19:07 +02:00
EventCommand : : Ptr event_command = checkable - > GetEventCommand ( ) ;
2013-11-05 18:33:57 +01:00
String event_command_name = event_command - > GetName ( ) ;
2014-04-07 21:19:07 +02:00
long current_attempt = checkable - > GetCheckAttempt ( ) ;
2013-11-05 18:33:57 +01:00
std : : ostringstream msgbuf ;
2014-04-07 21:19:07 +02:00
if ( service ) {
2014-04-03 15:36:13 +02:00
msgbuf < < " SERVICE EVENT HANDLER: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < Service : : StateToString ( service - > GetState ( ) ) < < " ; "
< < Service : : StateTypeToString ( service - > GetStateType ( ) ) < < " ; "
< < current_attempt < < " ; "
< < event_command_name ;
} else {
msgbuf < < " HOST EVENT HANDLER: "
2013-11-05 18:33:57 +01:00
< < host - > GetName ( ) < < " ; "
2014-04-08 08:54:49 +02:00
< < ( host - > IsReachable ( ) ? Host : : StateToString ( host - > GetState ( ) ) : " UNREACHABLE " ) < < " ; "
2014-04-03 15:36:13 +02:00
< < Host : : StateTypeToString ( host - > GetStateType ( ) ) < < " ; "
2013-11-05 18:33:57 +01:00
< < current_attempt < < " ; "
< < event_command_name ;
2014-04-03 15:36:13 +02:00
}
2013-11-05 18:33:57 +01:00
2014-04-03 15:36:13 +02:00
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
2013-11-05 18:33:57 +01:00
Flush ( ) ;
}
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : WriteLine ( const String & line )
2013-03-19 13:04:30 +01:00
{
ASSERT ( OwnsLock ( ) ) ;
if ( ! m_OutputFile . good ( ) )
return ;
m_OutputFile < < " [ " < < ( long ) Utility : : GetTime ( ) < < " ] " < < line < < " \n " ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : Flush ( void )
2013-03-19 13:04:30 +01:00
{
ASSERT ( OwnsLock ( ) ) ;
if ( ! m_OutputFile . good ( ) )
return ;
m_OutputFile < < std : : flush ;
}
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : ReopenFile ( bool rotate )
2013-03-19 13:04:30 +01:00
{
ObjectLock olock ( this ) ;
String tempFile = GetLogDir ( ) + " /icinga.log " ;
2013-03-20 11:11:46 +01:00
if ( m_OutputFile ) {
2013-03-19 13:04:30 +01:00
m_OutputFile . close ( ) ;
2013-03-20 11:11:46 +01:00
if ( rotate ) {
String archiveFile = GetLogDir ( ) + " /archives/icinga- " + Utility : : FormatDateTime ( " %m-%d-%Y-%H " , Utility : : GetTime ( ) ) + " .log " ;
2014-05-28 13:03:44 +02:00
Log ( LogNotice , " CompatLogger " , " Rotating compat log file ' " + tempFile + " ' -> ' " + archiveFile + " ' " ) ;
2013-03-20 11:11:46 +01:00
( void ) rename ( tempFile . CStr ( ) , archiveFile . CStr ( ) ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-03-20 11:11:46 +01:00
m_OutputFile . open ( tempFile . CStr ( ) , std : : ofstream : : app ) ;
2013-03-19 13:04:30 +01:00
if ( ! m_OutputFile . good ( ) ) {
2014-05-28 13:03:44 +02:00
Log ( LogWarning , " CompatLogger " , " Could not open compat log file ' " + tempFile + " ' for writing. Log output will be lost. " ) ;
2013-03-19 13:04:30 +01:00
return ;
}
2013-03-20 11:11:46 +01:00
WriteLine ( " LOG ROTATION: " + GetRotationMethod ( ) ) ;
2013-03-19 13:04:30 +01:00
WriteLine ( " LOG VERSION: 2.0 " ) ;
2013-08-20 11:06:04 +02:00
BOOST_FOREACH ( const Host : : Ptr & host , DynamicType : : GetObjects < Host > ( ) ) {
2013-10-31 14:18:20 +01:00
String output ;
2014-04-03 15:36:13 +02:00
CheckResult : : Ptr cr = host - > GetLastCheckResult ( ) ;
2013-10-31 14:18:20 +01:00
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-10-31 14:18:20 +01:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
2013-10-29 13:44:43 +01:00
msgbuf < < " CURRENT HOST STATE: "
2013-03-19 13:04:30 +01:00
< < host - > GetName ( ) < < " ; "
2014-04-08 08:54:49 +02:00
< < ( host - > IsReachable ( ) ? Host : : StateToString ( host - > GetState ( ) ) : " UNREACHABLE " ) < < " ; "
2014-04-03 15:36:13 +02:00
< < Host : : StateTypeToString ( host - > GetStateType ( ) ) < < " ; "
< < host - > GetCheckAttempt ( ) < < " ; "
2013-10-31 14:18:20 +01:00
< < output < < " " ;
2013-03-19 13:04:30 +01:00
WriteLine ( msgbuf . str ( ) ) ;
}
2013-08-20 11:06:04 +02:00
BOOST_FOREACH ( const Service : : Ptr & service , DynamicType : : GetObjects < Service > ( ) ) {
2013-03-19 13:04:30 +01:00
Host : : Ptr host = service - > GetHost ( ) ;
2013-10-31 14:18:20 +01:00
String output ;
2013-11-09 14:22:38 +01:00
CheckResult : : Ptr cr = service - > GetLastCheckResult ( ) ;
2013-10-31 14:18:20 +01:00
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-10-31 14:18:20 +01:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
2013-10-29 13:44:43 +01:00
msgbuf < < " CURRENT SERVICE STATE: "
2013-03-19 13:04:30 +01:00
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < Service : : StateToString ( service - > GetState ( ) ) < < " ; "
< < Service : : StateTypeToString ( service - > GetStateType ( ) ) < < " ; "
2013-10-26 09:41:45 +02:00
< < service - > GetCheckAttempt ( ) < < " ; "
2013-10-31 14:18:20 +01:00
< < output < < " " ;
2013-03-19 13:04:30 +01:00
WriteLine ( msgbuf . str ( ) ) ;
}
Flush ( ) ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : ScheduleNextRotation ( void )
2013-03-20 11:11:46 +01:00
{
time_t now = ( time_t ) Utility : : GetTime ( ) ;
String method = GetRotationMethod ( ) ;
tm tmthen ;
# ifdef _MSC_VER
tm * temp = localtime ( & now ) ;
if ( temp = = NULL ) {
BOOST_THROW_EXCEPTION ( posix_error ( )
< < boost : : errinfo_api_function ( " localtime " )
< < boost : : errinfo_errno ( errno ) ) ;
}
tmthen = * temp ;
# else /* _MSC_VER */
if ( localtime_r ( & now , & tmthen ) = = NULL ) {
BOOST_THROW_EXCEPTION ( posix_error ( )
< < boost : : errinfo_api_function ( " localtime_r " )
< < boost : : errinfo_errno ( errno ) ) ;
}
# endif /* _MSC_VER */
tmthen . tm_min = 0 ;
tmthen . tm_sec = 0 ;
if ( method = = " HOURLY " ) {
tmthen . tm_hour + + ;
} else if ( method = = " DAILY " ) {
tmthen . tm_mday + + ;
tmthen . tm_hour = 0 ;
} else if ( method = = " WEEKLY " ) {
tmthen . tm_mday + = 7 - tmthen . tm_wday ;
tmthen . tm_hour = 0 ;
} else if ( method = = " MONTHLY " ) {
tmthen . tm_mon + + ;
tmthen . tm_mday = 1 ;
tmthen . tm_hour = 0 ;
}
time_t ts = mktime ( & tmthen ) ;
2014-05-28 13:03:44 +02:00
Log ( LogNotice , " CompatLogger " , " Rescheduling rotation timer for compat log ' "
2013-03-20 11:11:46 +01:00
+ GetName ( ) + " ' to ' " + Utility : : FormatDateTime ( " %Y/%m/%d %H:%M:%S %z " , ts ) + " ' " ) ;
m_RotationTimer - > Reschedule ( ts ) ;
}
2013-03-19 13:04:30 +01:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : RotationTimerHandler ( void )
2013-03-19 13:04:30 +01:00
{
2013-03-20 11:11:46 +01:00
try {
ReopenFile ( true ) ;
} catch ( . . . ) {
ScheduleNextRotation ( ) ;
throw ;
}
ScheduleNextRotation ( ) ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : ValidateRotationMethod ( const String & location , const Dictionary : : Ptr & attrs )
2013-03-20 11:11:46 +01:00
{
Value rotation_method = attrs - > Get ( " rotation_method " ) ;
if ( ! rotation_method . IsEmpty ( ) & & rotation_method ! = " HOURLY " & & rotation_method ! = " DAILY " & &
rotation_method ! = " WEEKLY " & & rotation_method ! = " MONTHLY " & & rotation_method ! = " NONE " ) {
2013-09-24 13:13:14 +02:00
ConfigCompilerContext : : GetInstance ( ) - > AddMessage ( true , " Validation failed for " +
2013-03-20 11:11:46 +01:00
location + " : Rotation method ' " + rotation_method + " ' is invalid. " ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-08-20 11:06:04 +02:00