Implement all actions except modified attributes

refs #9080 #9979
This commit is contained in:
Jean Flach 2015-08-21 15:50:40 +02:00
parent 3afe9a35d8
commit 01ced1549a
6 changed files with 87 additions and 85 deletions

View File

@ -8,11 +8,12 @@ reschedule-check | {next_check}; {(force_check)} | Service
acknowledge-problem | author; comment; {timestamp}; {(sticky)}; {(notify)} | Service; Host | -
remove-acknowledgement | - | Service; Host | -
add-comment | author; comment | Service; Host | -
remove-comment | comment_id | - | -
remove-all-comments | - | Service; Host | -
remove-comment | - | Service;Host | -
remove-comment-by-id | comment_id | - | -
delay-notifications | timestamp | Service;Host | -
add-downtime | start_time; end_time; duration; author; comment; {trigger_id}; {(fixed)} | Service; Host; ServiceGroup; HostGroup | Downtime for all services on host x?
remove-downtime | downtime_id | - | remove by name?
remove-downtime | - | Service; Host | -
remove-downtime-by-id | downtime_id | - | -
send-custom-notification | options[]; author; comment | Service; Host | -
enable-passive-checks | - | Service; Host; ServiceGroup; HostGroup | "System" as target?
@ -35,18 +36,17 @@ change-check-interval | check_interval | Service; Host | -
change-retry-interval | retry_interval | Service; Host | -
change-check-period | time_period_name | Service; Host | -
enable-all-notifications | - | - | -
disable-all-notifications | - | - | -
enable-all-flap-detection | - | - | -
disable-all-flap-detection | - | - | -
enable-all-event-handlers | - | - | -
disable-all-event-handlers | - | - | -
enable-all-performance-data | - | - | -
disable-all-performance-data | - | - | -
start-all-executing-svc-checks | - | - | -
stop-all-executing-svc-checks | - | - | -
start-all-executing-host-checks | - | - | -
stop-all-executing-host-checks | - | - | -
enable-global-notifications | - | - | -
disable-global-notifications | - | - | -
enable-global-flap-detection | - | - | -
disable-global-flap-detection | - | - | -
enable-global-event-handlers | - | - | -
disable-global-event-handlers | - | - | -
enable-global-performance-data | - | - | -
disable-global-performance-data | - | - | -
start-global-executing-svc-checks | - | - | -
stop-global-executing-svc-checks | - | - | -
start-global-executing-host-checks | - | - | -
stop-global-executing-host-checks | - | - | -
shutdown-process | - | - | -
restart-process | - | - | -
process-file | - | - | -

View File

@ -29,6 +29,7 @@
#include "remote/httputility.hpp"
#include "base/utility.hpp"
#include "base/convert.hpp"
#include <fstream>
using namespace icinga;
@ -39,10 +40,11 @@ REGISTER_APIACTION(delay_notifications, "Service;Host", &ApiActions::DelayNotifi
REGISTER_APIACTION(acknowledge_problem, "Service;Host", &ApiActions::AcknowledgeProblem);
REGISTER_APIACTION(remove_acknowledgement, "Service;Host", &ApiActions::RemoveAcknowledgement);
REGISTER_APIACTION(add_comment, "Service;Host", &ApiActions::AddComment);
REGISTER_APIACTION(remove_comment, "", &ApiActions::RemoveComment);
REGISTER_APIACTION(remove_all_comments, "Service;Host", &ApiActions::RemoveAllComments);
REGISTER_APIACTION(remove_comment, "Service;Host", &ApiActions::RemoveComment);
REGISTER_APIACTION(remove_comment_by_id, "", &ApiActions::RemoveCommentByID);
REGISTER_APIACTION(schedule_downtime, "Service;Host", &ApiActions::ScheduleDowntime);
REGISTER_APIACTION(remove_downtime, "", &ApiActions::RemoveDowntime);
REGISTER_APIACTION(remove_downtime, "Service;Host", &ApiActions::RemoveDowntime);
REGISTER_APIACTION(remove_downtime_by_id, "", &ApiActions::RemoveDowntimeByID);
REGISTER_APIACTION(enable_passive_checks, "Service;Host", &ApiActions::EnablePassiveChecks);
REGISTER_APIACTION(disable_passive_checks, "Service;Host", &ApiActions::DisablePassiveChecks);
@ -76,12 +78,8 @@ REGISTER_APIACTION(stop_global_executing_svc_checks, "", &ApiActions::StopGlobal
REGISTER_APIACTION(start_global_executing_host_checks, "", &ApiActions::StartGlobalExecutingHostChecks);
REGISTER_APIACTION(stop_global_executing_host_checks, "", &ApiActions::StopGlobalExecutingHostChecks);
//TODO: add process related actions
/*
REGISTER_APIACTION(shutdown_process, "", &ApiActions::ShutdownProcess);
REGISTER_APIACTION(restart_process, "", &ApiActions::RestartProcess);
REGISTER_APIACTION(process_file, "", &ApiActions::ProcessFile);
*/
Dictionary::Ptr ApiActions::CreateResult(int code, const String& status, const Dictionary::Ptr& additional)
{
@ -299,30 +297,34 @@ Dictionary::Ptr ApiActions::AddComment(const ConfigObject::Ptr& object, const Di
}
Dictionary::Ptr ApiActions::RemoveComment(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Checkable::Ptr checkable = static_pointer_cast<Checkable>(object);
if (!checkable)
return ApiActions::CreateResult(404, "Cannot remove comment form non-existent object");
checkable->RemoveAllComments();
return ApiActions::CreateResult(200, "Successfully removed comments for " + checkable->GetName());
}
Dictionary::Ptr ApiActions::RemoveCommentByID(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
if (!params->Contains("comment_id"))
return ApiActions::CreateResult(403, "'comment_id' required.");
return ApiActions::CreateResult(403, "Parameter 'comment_id' is required.");
int comment_id = HttpUtility::GetLastParameter(params, "comment_id");
String rid = Service::GetCommentIDFromLegacyID(comment_id);
if (rid.IsEmpty())
return ApiActions::CreateResult(404, "Comment '" + Convert::ToString(comment_id) + "' does not exist.");
Service::RemoveComment(rid);
return ApiActions::CreateResult(200, "Successfully removed comment " + Convert::ToString(comment_id) + ".");
}
Dictionary::Ptr ApiActions::RemoveAllComments(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Checkable::Ptr checkable = static_pointer_cast<Checkable>(object);
if (!checkable)
return ApiActions::CreateResult(404, "Cannot remove comments from non-existent object");
checkable->RemoveAllComments();
return ApiActions::CreateResult(200, "Successfully removed all comments for " + checkable->GetName());
}
Dictionary::Ptr ApiActions::EnableNotifications(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Checkable::Ptr checkable = static_pointer_cast<Checkable>(object);
@ -424,16 +426,31 @@ Dictionary::Ptr ApiActions::DisableFlapDetection(const ConfigObject::Ptr& object
}
Dictionary::Ptr ApiActions::RemoveDowntime(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Checkable::Ptr checkable = static_pointer_cast<Checkable>(object);
if (!checkable)
return ApiActions::CreateResult(404, "Cannot remove downtime for non-existent object");
checkable->RemoveAllDowntimes();
return ApiActions::CreateResult(200, "Successfully removed downtimes for " + checkable->GetName());
}
Dictionary::Ptr ApiActions::RemoveDowntimeByID(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
if (!params->Contains("downtime_id"))
return ApiActions::CreateResult(403, "Downtime removal requires a downtime_id");
return ApiActions::CreateResult(403, "Parameter 'downtime_id' is required.");
int downtime_id = HttpUtility::GetLastParameter(params, "downtime_id");
String rid = Service::GetDowntimeIDFromLegacyID(downtime_id);
if (rid.IsEmpty())
return ApiActions::CreateResult(404, "Downtime '" + Convert::ToString(downtime_id) + "' does not exist.");
Service::RemoveDowntime(rid, true);
return ApiActions::CreateResult(200, "Successfully removed downtime with id " + Convert::ToString(downtime_id) + ".");
return ApiActions::CreateResult(200, "Successfully removed downtime " + Convert::ToString(downtime_id) + ".");
}
Dictionary::Ptr ApiActions::EnableGlobalNotifications(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
@ -632,55 +649,17 @@ Dictionary::Ptr ApiActions::ChangeRetryInterval(const ConfigObject::Ptr& object,
}
*/
//TODO: process actions
/*
Dictionary::Ptr ApiActions::RestartProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
Dictionary::Ptr ApiActions::ShutdownProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Application::RequestShutdown();
return ApiActions::CreateResult(200, "I don't exist!");
return ApiActions::CreateResult(200, "Shutting down Icinga2");
}
Dictionary::Ptr ApiActions::RestartProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
Application::RequestRestart();
return ApiActions::CreateResult(200, "That's not how this works");
return ApiActions::CreateResult(200, "Restarting Icinga");
}
Dictionary::Ptr ApiActions::ProcessFile(const ConfigObject::Ptr& object, const Dictionary::Ptr& params)
{
if (!params->Contains("file_name")
return ApiActions::CreateResult(403, "Parameter 'file_name' is required");
String file = HttpUtility::GetLastParameter(params, "file_name")
bool del = true;
if (!params->Contains("delete") || !HttpUtility::GetLastParameter(params, "delete"))
del = false;
std::ifstream ifp;
ifp.exceptions(std::ifstream::badbit);
ifp.open(file.CStr(), std::ifstream::in);
while (ifp.good()) {
std::string line;
std::getline(ifp, line);
try {
Execute(line);
} catch (const std::exception& ex) {
ifp.close();
return ApiActions::CreateResult(500, "Command execution failed");
}
}
ifp.close();
if (del)
(void) unlink(file.CStr());
return ApiActions::CreateResult(200, "Successfully processed " + (del?"and deleted ":"") + "file " + file);
}
*/

View File

@ -41,9 +41,10 @@ public:
static Dictionary::Ptr RemoveAcknowledgement(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr AddComment(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RemoveComment(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RemoveAllComments(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RemoveCommentByID(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ScheduleDowntime(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RemoveDowntime(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RemoveDowntimeByID(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr EnablePassiveChecks(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr DisablePassiveChecks(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
@ -54,12 +55,14 @@ public:
static Dictionary::Ptr EnableFlapDetection(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr DisableFlapDetection(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
/* static Dictionary::Ptr ChangeEventHandler(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
/*
static Dictionary::Ptr ChangeEventHandler(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ChangeCheckCommand(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ChangeMaxCheckAttempts(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ChangeCheckInterval(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ChangeRetryInterval(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ChangeCheckPeriod(const ConfigObject::Ptr& object, const Dictionary::Ptr& params); */
static Dictionary::Ptr ChangeCheckPeriod(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
*/
static Dictionary::Ptr EnableGlobalNotifications(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr DisableGlobalNotifications(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
@ -74,10 +77,8 @@ public:
static Dictionary::Ptr StartGlobalExecutingHostChecks(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr StopGlobalExecutingHostChecks(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
/* static Dictionary::Ptr ShutdownProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ShutdownProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr RestartProcess(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
static Dictionary::Ptr ProcessFile(const ConfigObject::Ptr& object, const Dictionary::Ptr& params);
*/
private:
static Dictionary::Ptr CreateResult(int code, const String& status, const Dictionary::Ptr& additional = Dictionary::Ptr());

View File

@ -165,6 +165,23 @@ void Checkable::RemoveDowntime(const String& id, bool cancelled, const MessageOr
OnDowntimeRemoved(owner, downtime, origin);
}
void Checkable::RemoveAllDowntimes(void)
{
std::vector<String> ids;
Dictionary::Ptr downtimes = GetDowntimes();
{
ObjectLock olock(downtimes);
BOOST_FOREACH(const Dictionary::Pair& kv, downtimes) {
ids.push_back(kv.first);
}
}
BOOST_FOREACH(const String& id, ids) {
RemoveDowntime(id, true);
}
}
void Checkable::TriggerDowntimes(void)
{
Dictionary::Ptr downtimes = GetDowntimes();

View File

@ -148,6 +148,7 @@ public:
const String& scheduledBy = String(), const String& id = String(),
const MessageOrigin::Ptr& origin = MessageOrigin::Ptr());
void RemoveAllDowntimes(void);
static void RemoveDowntime(const String& id, bool cancelled, const MessageOrigin::Ptr& origin = MessageOrigin::Ptr());
void TriggerDowntimes(void);

View File

@ -23,6 +23,7 @@
#include "remote/apiaction.hpp"
#include "base/exception.hpp"
#include "base/serializer.hpp"
#include "base/logger.hpp"
#include <boost/algorithm/string.hpp>
#include <set>
@ -63,6 +64,9 @@ bool ActionsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& reques
Array::Ptr results = new Array();
Log(LogNotice, "ApiActionHandler")
<< "Running action " << actionName;
BOOST_FOREACH(const ConfigObject::Ptr& obj, objs) {
try {
results->Add(action->Invoke(obj, params));