]> granicus.if.org Git - icinga2/blobdiff - lib/icinga/legacytimeperiod.cpp
Merge pull request #6727 from Icinga/feature/cluster-config-sync-stage
[icinga2] / lib / icinga / legacytimeperiod.cpp
index 777a1cc10ebca0ab8ba1ad1fee9eefe44a3207db..2ae72e6519ac9984de282c367f95fbc53433b6e4 100644 (file)
@@ -1,21 +1,4 @@
-/******************************************************************************
- * Icinga 2                                                                   *
- * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
- *                                                                            *
- * 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.             *
- ******************************************************************************/
+/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 
 #include "icinga/legacytimeperiod.hpp"
 #include "base/function.hpp"
@@ -42,7 +25,7 @@ bool LegacyTimePeriod::IsInTimeRange(tm *begin, tm *end, int stride, tm *referen
 
        int daynumber = (tsref - tsbegin) / (24 * 60 * 60);
 
-       if (stride > 1 && daynumber % stride == 0)
+       if (stride > 1 && daynumber % stride > 0)
                return false;
 
        return true;
@@ -359,7 +342,7 @@ void LegacyTimePeriod::ProcessTimeRangeRaw(const String& timerange, tm *referenc
 
        if (begin->tm_hour * 3600 + begin->tm_min * 60 + begin->tm_sec >=
                end->tm_hour * 3600 + end->tm_min * 60 + end->tm_sec)
-               BOOST_THROW_EXCEPTION(std::invalid_argument("Time period segment ends before it begins"));
+               end->tm_hour += 24;
 }
 
 Dictionary::Ptr LegacyTimePeriod::ProcessTimeRange(const String& timestamp, tm *reference)
@@ -388,6 +371,56 @@ void LegacyTimePeriod::ProcessTimeRanges(const String& timeranges, tm *reference
        }
 }
 
+Dictionary::Ptr LegacyTimePeriod::FindRunningSegment(const String& daydef, const String& timeranges, tm *reference)
+{
+       tm begin, end, iter;
+       time_t tsend, tsiter, tsref;
+       int stride;
+
+       tsref = mktime(reference);
+
+       ParseTimeRange(daydef, &begin, &end, &stride, reference);
+
+       iter = begin;
+
+       tsend = mktime(&end);
+
+       do {
+               if (IsInTimeRange(&begin, &end, stride, &iter)) {
+                       Array::Ptr segments = new Array();
+                       ProcessTimeRanges(timeranges, &iter, segments);
+
+                       Dictionary::Ptr bestSegment;
+                       double bestEnd = 0.0;
+
+                       ObjectLock olock(segments);
+                       for (const Dictionary::Ptr& segment : segments) {
+                               double begin = segment->Get("begin");
+                               double end = segment->Get("end");
+
+                               if (begin >= tsref || end < tsref)
+                                       continue;
+
+                               if (!bestSegment || end > bestEnd) {
+                                       bestSegment = segment;
+                                       bestEnd = end;
+                               }
+                       }
+
+                       if (bestSegment)
+                               return bestSegment;
+               }
+
+               iter.tm_mday++;
+               iter.tm_hour = 0;
+               iter.tm_min = 0;
+               iter.tm_sec = 0;
+               tsiter = mktime(&iter);
+       } while (tsiter < tsend);
+
+       return nullptr;
+}
+
 Dictionary::Ptr LegacyTimePeriod::FindNextSegment(const String& daydef, const String& timeranges, tm *reference)
 {
        tm begin, end, iter, ref;