2014-05-12 10:45:25 -04:00
/******************************************************************************
* Icinga 2 *
2015-01-22 06:00:23 -05:00
* Copyright ( C ) 2012 - 2015 Icinga Development Team ( http : //www.icinga.org) *
2014-05-12 10:45:25 -04: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 10:23:35 -04:00
# include "icinga/customvarobject.hpp"
2015-03-28 06:04:42 -04:00
# include "icinga/customvarobject.tcpp"
2015-02-11 10:08:02 -05:00
# include "icinga/macroprocessor.hpp"
2014-10-19 08:21:12 -04:00
# include "base/logger.hpp"
2015-02-11 07:12:08 -05:00
# include "base/function.hpp"
# include "base/exception.hpp"
# include "base/objectlock.hpp"
# include <boost/foreach.hpp>
2014-05-12 10:45:25 -04:00
using namespace icinga ;
REGISTER_TYPE ( CustomVarObject ) ;
2014-08-26 08:59:55 -04:00
boost : : signals2 : : signal < void ( const CustomVarObject : : Ptr & , const Dictionary : : Ptr & vars , const MessageOrigin & ) > CustomVarObject : : OnVarsChanged ;
2014-05-12 10:45:25 -04:00
Dictionary : : Ptr CustomVarObject : : GetVars ( void ) const
{
2014-11-07 15:40:47 -05:00
if ( GetOverrideVars ( ) )
2014-05-12 10:45:25 -04:00
return GetOverrideVars ( ) ;
else
return GetVarsRaw ( ) ;
}
2014-05-19 12:17:47 -04:00
void CustomVarObject : : SetVars ( const Dictionary : : Ptr & vars , const MessageOrigin & origin )
2014-05-12 10:45:25 -04:00
{
SetOverrideVars ( vars ) ;
2014-11-08 15:17:16 -05:00
OnVarsChanged ( this , vars , origin ) ;
2014-05-12 10:45:25 -04:00
}
int CustomVarObject : : GetModifiedAttributes ( void ) const
{
/* does nothing by default */
return 0 ;
}
void CustomVarObject : : SetModifiedAttributes ( int , const MessageOrigin & )
{
/* does nothing by default */
}
2014-05-19 12:17:47 -04:00
bool CustomVarObject : : IsVarOverridden ( const String & name ) const
2014-05-12 10:45:25 -04:00
{
Dictionary : : Ptr vars_override = GetOverrideVars ( ) ;
if ( ! vars_override )
return false ;
return vars_override - > Contains ( name ) ;
}
2015-02-11 07:12:08 -05:00
2014-11-30 17:32:13 -05:00
void CustomVarObject : : ValidateVarsRaw ( const Dictionary : : Ptr & value , const ValidationUtils & utils )
2015-02-11 07:12:08 -05:00
{
2014-11-30 17:32:13 -05:00
if ( ! value )
2015-02-11 07:12:08 -05:00
return ;
/* string, array, dictionary */
2014-11-30 17:32:13 -05:00
ObjectLock olock ( value ) ;
BOOST_FOREACH ( const Dictionary : : Pair & kv , value ) {
2015-02-11 07:12:08 -05:00
const Value & varval = kv . second ;
if ( varval . IsObjectType < Dictionary > ( ) ) {
/* only one dictonary level */
Dictionary : : Ptr varval_dict = varval ;
ObjectLock xlock ( varval_dict ) ;
BOOST_FOREACH ( const Dictionary : : Pair & kv_var , varval_dict ) {
2015-02-11 09:47:45 -05:00
if ( kv_var . second . IsEmpty ( ) )
2015-02-11 07:12:08 -05:00
continue ;
2014-11-30 17:32:13 -05:00
if ( ! MacroProcessor : : ValidateMacroString ( kv_var . second ) )
BOOST_THROW_EXCEPTION ( ValidationError ( this , boost : : assign : : list_of < String > ( " vars " ) ( kv . first ) ( kv_var . first ) , " Closing $ not found in macro format string ' " + kv_var . second + " '. " ) ) ;
2015-02-11 07:12:08 -05:00
}
} else if ( varval . IsObjectType < Array > ( ) ) {
/* check all array entries */
Array : : Ptr varval_arr = varval ;
ObjectLock ylock ( varval_arr ) ;
BOOST_FOREACH ( const Value & arrval , varval_arr ) {
if ( arrval . IsEmpty ( ) )
continue ;
2015-02-11 10:08:02 -05:00
if ( ! MacroProcessor : : ValidateMacroString ( arrval ) ) {
2014-11-30 17:32:13 -05:00
BOOST_THROW_EXCEPTION ( ValidationError ( this , boost : : assign : : list_of < String > ( " vars " ) ( kv . first ) , " Closing $ not found in macro format string ' " + arrval + " '. " ) ) ;
2015-02-11 07:12:08 -05:00
}
}
} else {
if ( varval . IsEmpty ( ) )
continue ;
String varstr = varval ;
2014-11-30 17:32:13 -05:00
if ( ! MacroProcessor : : ValidateMacroString ( varstr ) )
BOOST_THROW_EXCEPTION ( ValidationError ( this , boost : : assign : : list_of < String > ( " vars " ) ( kv . first ) , " Closing $ not found in macro format string ' " + varstr + " '. " ) ) ;
2015-02-11 07:12:08 -05:00
}
}
2015-02-11 09:47:45 -05:00
}