]> granicus.if.org Git - icinga2/commitdiff
Require at least one user for notification objects (user or as member of user_groups)
authorMichael Friedrich <michael.friedrich@gmail.com>
Sat, 7 Feb 2015 22:04:01 +0000 (23:04 +0100)
committerMichael Friedrich <michael.friedrich@gmail.com>
Sat, 7 Feb 2015 22:04:01 +0000 (23:04 +0100)
fixes #8067

lib/icinga/icinga-type.conf
lib/icinga/notification.cpp
lib/icinga/notification.hpp

index fc91e2c73a923a1f879a9589ed176f6bcfc76e90..6cf117ecff60b941b7ad006382050d7d5686a1a2 100644 (file)
 
 %type Notification {
        %validator "ValidateNotificationFilters"
+       %validator "ValidateNotificationUsers"
 
        %require "host_name",
        %attribute %name(Host) "host_name",
index ccb3465478c7edfbd6f0c9b81ecbdc042172a622..4e86dfec88fb9fe7d2f3557cc89877d32ca72a8a 100644 (file)
@@ -34,6 +34,7 @@ using namespace icinga;
 
 REGISTER_TYPE(Notification);
 REGISTER_SCRIPTFUNCTION(ValidateNotificationFilters, &Notification::ValidateFilters);
+REGISTER_SCRIPTFUNCTION(ValidateNotificationUsers, &Notification::ValidateUsers);
 INITIALIZE_ONCE(&Notification::StaticInitialize);
 
 boost::signals2::signal<void (const Notification::Ptr&, double, const MessageOrigin&)> Notification::OnNextNotificationChanged;
@@ -500,6 +501,24 @@ int icinga::FilterArrayToInt(const Array::Ptr& typeFilters, int defaultValue)
        return resultTypeFilter;
 }
 
+void Notification::ValidateUsers(const String& location, const Notification::Ptr& object)
+{
+       std::set<User::Ptr> allUsers;
+
+       std::set<User::Ptr> users = object->GetUsers();
+       std::copy(users.begin(), users.end(), std::inserter(allUsers, allUsers.begin()));
+
+       BOOST_FOREACH(const UserGroup::Ptr& ug, object->GetUserGroups()) {
+               std::set<User::Ptr> members = ug->GetMembers();
+               std::copy(members.begin(), members.end(), std::inserter(allUsers, allUsers.begin()));
+       }
+
+       if (allUsers.empty()) {
+               BOOST_THROW_EXCEPTION(ScriptError("Validation failed for " +
+                   location + ": No users/user_groups specified.", object->GetDebugInfo()));
+       }
+}
+
 void Notification::ValidateFilters(const String& location, const Notification::Ptr& object)
 {
        int sfilter = FilterArrayToInt(object->GetStates(), 0);
index 5bafdaf85742a4557786eb112a754c54e442048b..5c0b20c1dda1862abf12c87b063367d832476ee9 100644 (file)
@@ -109,6 +109,7 @@ public:
 
        static void RegisterApplyRuleHandler(void);
 
+       static void ValidateUsers(const String& location, const Notification::Ptr& object);
        static void ValidateFilters(const String& location, const Notification::Ptr& object);
 
        static void EvaluateApplyRules(const intrusive_ptr<Host>& host);