2014-10-17 14:13:31 +02: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 18:37:19 +02:00
# include "cli/repositoryutility.hpp"
2014-10-19 14:21:12 +02:00
# include "base/logger.hpp"
2014-10-17 14:13:31 +02:00
# include "base/application.hpp"
2014-10-27 14:13:55 +01:00
# include "base/utility.hpp"
2014-10-20 18:37:19 +02:00
# include <boost/foreach.hpp>
# include <boost/algorithm/string/join.hpp>
2014-10-17 14:13:31 +02:00
# include <boost/algorithm/string/case_conv.hpp>
# include <fstream>
2014-10-24 08:27:03 +02:00
# include <iostream>
2014-10-17 14:13:31 +02:00
using namespace icinga ;
2014-10-17 18:55:34 +02:00
namespace po = boost : : program_options ;
2014-10-17 14:13:31 +02:00
2014-10-23 19:07:14 +02:00
REGISTER_REPOSITORY_CLICOMMAND ( Host ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Service ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Zone ) ;
REGISTER_REPOSITORY_CLICOMMAND ( Endpoint ) ;
2014-10-17 14:13:31 +02: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 18:37:19 +02:00
case RepositoryCommandSet :
description = " Set attributes for a " ;
break ;
default :
break ;
2014-10-17 14:13:31 +02: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 18:37:19 +02:00
case RepositoryCommandSet :
description = " set attributes for a " ;
break ;
default :
break ;
2014-10-17 14:13:31 +02: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 15:54:46 +02:00
boost : : program_options : : options_description & hiddenDesc ) const
2014-10-17 14:13:31 +02:00
{
2014-10-28 12:08:31 +01:00
if ( m_Command = = RepositoryCommandAdd ) {
visibleDesc . add_options ( )
( " import " , 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-17 15:54:46 +02:00
}
2014-10-17 14:13:31 +02:00
2014-10-17 15:54:46 +02:00
std : : vector < String > RepositoryObjectCommand : : GetPositionalSuggestions ( const String & word ) const
{
2014-10-17 16:02:25 +02:00
if ( m_Command = = RepositoryCommandAdd ) {
2014-10-27 14:13:55 +01:00
Utility : : LoadExtensionLibrary ( " icinga " ) ;
2014-10-17 16:02:25 +02:00
const Type * ptype = Type : : GetByName ( m_Type ) ;
ASSERT ( ptype ) ;
return GetFieldCompletionSuggestions ( ptype , word ) ;
2014-10-27 15:48:52 +01:00
} else if ( m_Command = = RepositoryCommandRemove ) {
std : : vector < String > suggestions ;
String argName = " name= " ;
if ( argName . Find ( word ) = = 0 )
suggestions . push_back ( argName ) ;
if ( m_Type = = " Service " ) {
String argHostName = " host_name= " ;
if ( argHostName . Find ( word ) = = 0 )
suggestions . push_back ( argHostName ) ;
}
return suggestions ;
2014-10-17 16:02:25 +02:00
} else
return CLICommand : : GetPositionalSuggestions ( word ) ;
2014-10-17 14:13:31 +02:00
}
2014-10-24 13:15:21 +02:00
int RepositoryObjectCommand : : GetMaxArguments ( void ) const
{
return - 1 ;
}
2014-10-28 19:16:48 +01:00
ImpersonationLevel RepositoryObjectCommand : : GetImpersonationLevel ( void ) const
{
return ImpersonateRoot ;
}
2014-10-17 14:13:31 +02: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-24 12:42:57 +02:00
Dictionary : : Ptr attrs = RepositoryUtility : : GetArgumentAttributes ( ap ) ;
2014-10-20 18:37:19 +02:00
2014-10-27 13:01:21 +01:00
/* shortcut for list command */
if ( m_Command = = RepositoryCommandList ) {
RepositoryUtility : : PrintObjects ( std : : cout , m_Type ) ;
return 0 ;
}
2014-10-24 12:42:57 +02:00
if ( ! attrs - > Contains ( " name " ) ) {
Log ( LogCritical , " cli " , " Object requires a name (Hint: 'name=<objectname>')! " ) ;
return 1 ;
}
2014-10-20 18:37:19 +02:00
2014-10-24 12:42:57 +02:00
String name = attrs - > Get ( " name " ) ;
2014-10-20 18:37:19 +02:00
2014-10-24 12:42:57 +02:00
if ( vm . count ( " import " ) ) {
Array : : Ptr imports = make_shared < Array > ( ) ;
2014-10-23 19:06:02 +02:00
2014-10-24 12:42:57 +02:00
BOOST_FOREACH ( const String & import , vm [ " import " ] . as < std : : vector < std : : string > > ( ) ) {
imports - > Add ( import ) ;
2014-10-23 20:42:56 +02:00
}
2014-10-24 12:42:57 +02:00
//Update object attributes
if ( imports - > GetLength ( ) > 0 )
attrs - > Set ( " import " , imports ) ;
2014-10-23 20:42:56 +02:00
}
2014-10-23 19:06:02 +02:00
2014-10-27 13:01:21 +01:00
if ( m_Command = = RepositoryCommandAdd ) {
2014-10-28 11:54:56 +01:00
Utility : : LoadExtensionLibrary ( " icinga " ) ;
2014-10-24 12:42:57 +02:00
RepositoryUtility : : AddObject ( name , m_Type , attrs ) ;
2014-10-28 11:54:56 +01:00
} else if ( m_Command = = RepositoryCommandRemove ) {
2014-10-24 15:27:20 +02:00
/* pass attrs for service->host_name requirement */
RepositoryUtility : : RemoveObject ( name , m_Type , attrs ) ;
2014-10-28 11:54:56 +01:00
} else if ( m_Command = = RepositoryCommandSet ) {
2014-10-20 18:37:19 +02:00
Log ( LogWarning , " cli " )
2014-10-24 12:42:57 +02:00
< < " Not supported yet. Please check the roadmap at https://dev.icinga.org \n " ;
2014-10-20 18:37:19 +02:00
return 1 ;
} else {
Log ( LogCritical , " cli " )
< < " Invalid command ' " < < m_Command < < " 'specified. \n " ;
return 1 ;
}
2014-10-17 14:13:31 +02:00
return 0 ;
}