2014-10-17 08:13:31 -04:00
/******************************************************************************
* Icinga 2 *
* Copyright ( C ) 2012 - 2014 Icinga Development Team ( http : //www.icinga.org) *
* *
* 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 . *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "cli/repositoryobjectcommand.hpp"
2014-10-20 12:37:19 -04:00
# include "cli/repositoryutility.hpp"
2014-10-19 08:21:12 -04:00
# include "base/logger.hpp"
2014-10-17 08:13:31 -04:00
# include "base/application.hpp"
2014-10-20 12:37:19 -04:00
# include <boost/foreach.hpp>
# include <boost/algorithm/string/join.hpp>
2014-10-17 08:13:31 -04:00
# include <boost/algorithm/string/case_conv.hpp>
2014-10-20 12:37:19 -04:00
# include <boost/algorithm/string/split.hpp>
# include <boost/algorithm/string/classification.hpp>
2014-10-17 08:13:31 -04:00
# include <fstream>
using namespace icinga ;
2014-10-17 12:55:34 -04:00
namespace po = boost : : program_options ;
2014-10-17 08:13:31 -04:00
2014-10-23 13:07:14 -04:00
REGISTER_REPOSITORY_CLICOMMAND ( Host ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Service ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Zone ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Endpoint ) ;
2014-10-17 08:13:31 -04:00
RegisterRepositoryCLICommandHelper : : RegisterRepositoryCLICommandHelper ( const String & type )
{
String ltype = type ;
boost : : algorithm : : to_lower ( ltype ) ;
std : : vector < String > name ;
name . push_back ( " repository " ) ;
name . push_back ( ltype ) ;
name . push_back ( " add " ) ;
CLICommand : : Register ( name , make_shared < RepositoryObjectCommand > ( type , RepositoryCommandAdd ) ) ;
name [ 2 ] = " remove " ;
CLICommand : : Register ( name , make_shared < RepositoryObjectCommand > ( type , RepositoryCommandRemove ) ) ;
name [ 2 ] = " list " ;
CLICommand : : Register ( name , make_shared < RepositoryObjectCommand > ( type , RepositoryCommandList ) ) ;
}
RepositoryObjectCommand : : RepositoryObjectCommand ( const String & type , RepositoryCommandType command )
: m_Type ( type ) , m_Command ( command )
{ }
String RepositoryObjectCommand : : GetDescription ( void ) const
{
String description ;
switch ( m_Command ) {
case RepositoryCommandAdd :
description = " Adds a new " ;
break ;
case RepositoryCommandRemove :
description = " Removes a " ;
break ;
case RepositoryCommandList :
description = " Lists all " ;
break ;
2014-10-20 12:37:19 -04:00
case RepositoryCommandSet :
description = " Set attributes for a " ;
break ;
default :
break ;
2014-10-17 08:13:31 -04:00
}
description + = " " + m_Type + " object " ;
if ( m_Command = = RepositoryCommandList )
description + = " s " ;
return description ;
}
String RepositoryObjectCommand : : GetShortDescription ( void ) const
{
String description ;
switch ( m_Command ) {
case RepositoryCommandAdd :
description = " adds a new " ;
break ;
case RepositoryCommandRemove :
description = " removes a " ;
break ;
case RepositoryCommandList :
description = " lists all " ;
break ;
2014-10-20 12:37:19 -04:00
case RepositoryCommandSet :
description = " set attributes for a " ;
break ;
default :
break ;
2014-10-17 08:13:31 -04:00
}
description + = " " + m_Type + " object " ;
if ( m_Command = = RepositoryCommandList )
description + = " s " ;
return description ;
}
void RepositoryObjectCommand : : InitParameters ( boost : : program_options : : options_description & visibleDesc ,
2014-10-17 09:54:46 -04:00
boost : : program_options : : options_description & hiddenDesc ) const
2014-10-17 08:13:31 -04:00
{
visibleDesc . add_options ( )
2014-10-23 13:06:02 -04:00
( " name " , po : : value < std : : string > ( ) , " The name of the object " )
2014-10-23 14:42:56 -04:00
( " template " , po : : value < std : : vector < std : : string > > ( ) , " Import the defined template(s) into the object. Must be defined and included separately in Icinga 2 " ) ;
2014-10-23 13:06:02 -04:00
if ( m_Type = = " Service " ) {
visibleDesc . add_options ( )
( " host " , po : : value < std : : string > ( ) , " The host name related to this service object " ) ;
}
2014-10-17 09:54:46 -04:00
}
2014-10-17 08:13:31 -04:00
2014-10-17 09:54:46 -04:00
std : : vector < String > RepositoryObjectCommand : : GetPositionalSuggestions ( const String & word ) const
{
2014-10-17 10:02:25 -04:00
if ( m_Command = = RepositoryCommandAdd ) {
const Type * ptype = Type : : GetByName ( m_Type ) ;
ASSERT ( ptype ) ;
return GetFieldCompletionSuggestions ( ptype , word ) ;
} else
return CLICommand : : GetPositionalSuggestions ( word ) ;
2014-10-17 08:13:31 -04:00
}
/**
* The entry point for the " repository <type> <add/remove/list> " CLI command .
*
* @ returns An exit status .
*/
int RepositoryObjectCommand : : Run ( const boost : : program_options : : variables_map & vm , const std : : vector < std : : string > & ap ) const
{
2014-10-20 12:37:19 -04:00
if ( ap . empty ( ) ) {
Log ( LogCritical , " cli " )
2014-10-23 10:07:48 -04:00
< < " No object name given. Bailing out. " ;
2014-10-20 12:37:19 -04:00
return 1 ;
}
String name = ap [ 0 ] ;
std : : vector < String > tokens ;
Dictionary : : Ptr attr = make_shared < Dictionary > ( ) ;
std : : vector < std : : string > attrs = ap ;
attrs . erase ( attrs . begin ( ) ) ; //remove name
BOOST_FOREACH ( const String & kv , attrs ) {
boost : : algorithm : : split ( tokens , kv , boost : : is_any_of ( " = " ) ) ;
2014-10-23 10:07:48 -04:00
if ( tokens . size ( ) = = 2 ) {
2014-10-20 12:37:19 -04:00
attr - > Set ( tokens [ 0 ] , tokens [ 1 ] ) ;
2014-10-23 10:07:48 -04:00
} else
2014-10-20 12:37:19 -04:00
Log ( LogWarning , " cli " )
< < " Cannot parse passed attributes for object ' " < < name < < " ': " < < boost : : algorithm : : join ( tokens , " = " ) ;
}
2014-10-23 14:42:56 -04:00
if ( vm . count ( " template " ) ) {
Array : : Ptr templates = make_shared < Array > ( ) ;
2014-10-23 13:06:02 -04:00
2014-10-23 14:42:56 -04:00
BOOST_FOREACH ( const String & tmpl , vm [ " template " ] . as < std : : vector < std : : string > > ( ) ) {
templates - > Add ( tmpl ) ;
}
if ( templates - > GetLength ( ) > 0 )
attr - > Set ( " templates " , templates ) ;
}
2014-10-23 13:06:02 -04:00
2014-10-20 12:37:19 -04:00
if ( m_Command = = RepositoryCommandList ) {
RepositoryUtility : : PrintObjects ( std : : cout , m_Type ) ;
}
else if ( m_Command = = RepositoryCommandAdd ) {
RepositoryUtility : : AddObject ( name , m_Type , attr ) ;
}
else if ( m_Command = = RepositoryCommandRemove ) {
RepositoryUtility : : RemoveObject ( name , m_Type ) ;
}
else if ( m_Command = = RepositoryCommandSet ) {
Log ( LogWarning , " cli " )
< < " Not implemented yet. \n " ;
return 1 ;
} else {
Log ( LogCritical , " cli " )
< < " Invalid command ' " < < m_Command < < " 'specified. \n " ;
return 1 ;
}
2014-10-17 08:13:31 -04:00
return 0 ;
}