2019-02-25 14:48:22 +01:00
/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2013-06-13 11:33:00 +02:00
2014-05-25 16:23:35 +02:00
# include "icinga/command.hpp"
2018-01-18 13:50:38 +01:00
# include "icinga/command-ti.cpp"
2015-02-11 16:08:02 +01:00
# include "icinga/macroprocessor.hpp"
2014-12-18 15:43:01 +01:00
# include "base/exception.hpp"
2015-02-11 13:12:08 +01:00
# include "base/objectlock.hpp"
2013-06-13 11:33:00 +02:00
using namespace icinga ;
2013-11-08 16:07:21 +01:00
REGISTER_TYPE ( Command ) ;
2013-11-08 11:17:46 +01:00
2014-11-30 23:32:13 +01:00
void Command : : Validate ( int types , const ValidationUtils & utils )
2014-07-16 12:58:18 +02:00
{
2014-11-30 23:32:13 +01:00
ObjectImpl < Command > : : Validate ( types , utils ) ;
2014-07-16 12:58:18 +02:00
2014-11-30 23:32:13 +01:00
Dictionary : : Ptr arguments = GetArguments ( ) ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
if ( ! ( types & FAConfig ) )
2015-02-11 13:12:08 +01:00
return ;
2014-11-30 23:32:13 +01:00
if ( arguments ) {
if ( ! GetCommandLine ( ) . IsObjectType < Array > ( ) )
2017-11-30 18:09:38 +01:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , { " command " } , " Attribute 'command' must be an array if the 'arguments' attribute is set. " ) ) ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
ObjectLock olock ( arguments ) ;
2016-08-25 06:19:44 +02:00
for ( const Dictionary : : Pair & kv : arguments ) {
2014-11-30 23:32:13 +01:00
const Value & arginfo = kv . second ;
Value argval ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
if ( arginfo . IsObjectType < Dictionary > ( ) ) {
Dictionary : : Ptr argdict = arginfo ;
2015-03-12 18:05:58 +01:00
2014-11-30 23:32:13 +01:00
if ( argdict - > Contains ( " value " ) ) {
2015-11-10 07:59:10 +01:00
Value argvalue = argdict - > Get ( " value " ) ;
2014-11-30 23:32:13 +01:00
2015-11-10 07:59:10 +01:00
if ( argvalue . IsString ( ) & & ! MacroProcessor : : ValidateMacroString ( argvalue ) )
2017-11-30 18:09:38 +01:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , { " arguments " , kv . first , " value " } , " Validation failed: Closing $ not found in macro format string ' " + argvalue + " '. " ) ) ;
2015-03-12 18:05:58 +01:00
}
2014-11-30 23:32:13 +01:00
if ( argdict - > Contains ( " set_if " ) ) {
2015-11-10 07:59:10 +01:00
Value argsetif = argdict - > Get ( " set_if " ) ;
2015-03-12 18:05:58 +01:00
2015-11-10 07:59:10 +01:00
if ( argsetif . IsString ( ) & & ! MacroProcessor : : ValidateMacroString ( argsetif ) )
2017-11-30 18:09:38 +01:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , { " arguments " , kv . first , " set_if " } , " Closing $ not found in macro format string ' " + argsetif + " '. " ) ) ;
2015-03-12 18:05:58 +01:00
}
2015-11-10 07:59:10 +01:00
} else if ( arginfo . IsString ( ) ) {
if ( ! MacroProcessor : : ValidateMacroString ( arginfo ) )
2017-11-30 18:09:38 +01:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , { " arguments " , kv . first } , " Closing $ not found in macro format string ' " + arginfo + " '. " ) ) ;
2015-03-12 18:05:58 +01:00
}
2015-02-11 13:12:08 +01:00
}
}
2014-11-30 23:32:13 +01:00
Dictionary : : Ptr env = GetEnv ( ) ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
if ( env ) {
ObjectLock olock ( env ) ;
2016-08-25 06:19:44 +02:00
for ( const Dictionary : : Pair & kv : env ) {
2014-11-30 23:32:13 +01:00
const Value & envval = kv . second ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
if ( ! envval . IsString ( ) | | envval . IsEmpty ( ) )
continue ;
2015-02-11 13:12:08 +01:00
2014-11-30 23:32:13 +01:00
if ( ! MacroProcessor : : ValidateMacroString ( envval ) )
2017-11-30 18:09:38 +01:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , { " env " , kv . first } , " Closing $ not found in macro format string ' " + envval + " '. " ) ) ;
2015-02-11 13:12:08 +01:00
}
}
}