From 6bb44ed91ae8e68576458110e90f74dc528e9679 Mon Sep 17 00:00:00 2001 From: nemtrif Date: Sat, 15 Aug 2015 12:11:54 -0400 Subject: [PATCH 0001/1162] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..57fbd0bce --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# utfcpp +UTF-8 with C++ in a Portable Way From 46d0d807dcb6cd102be305711d1b0e94da943035 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sun, 16 Aug 2015 08:55:59 -0400 Subject: [PATCH 0002/1162] Initial import Importing utf8 cpp 2.3.4 to GitHub. --- README.md | 1133 ++++++++++++++++- buildrelease.pl | 18 + samples/Makefile | 5 + samples/docsample.cpp | 52 + source/utf8.h | 34 + source/utf8/checked.h | 327 +++++ source/utf8/core.h | 329 +++++ source/utf8/unchecked.h | 228 ++++ test_data/negative/utf8_invalid.txt | Bin 0 -> 20010 bytes test_data/utf8samples/UTF-8-demo.txt | 212 +++ .../utf8samples/Unicode_transcriptions.html | 167 +++ test_data/utf8samples/quickbrown.txt | 126 ++ test_drivers/Makefile | 19 + test_drivers/negative/Makefile | 5 + test_drivers/negative/negative.cpp | 53 + test_drivers/performance/Makefile | 5 + test_drivers/performance/iconvtest.cpp | 132 ++ test_drivers/performance/timer.h | 22 + test_drivers/performance/win32.cpp | 110 ++ test_drivers/runtests.pl | 50 + test_drivers/smoke_test/Makefile | 5 + test_drivers/smoke_test/test.cpp | 297 +++++ test_drivers/utf8reader/Makefile | 5 + test_drivers/utf8reader/utf8reader.cpp | 160 +++ 24 files changed, 3492 insertions(+), 2 deletions(-) create mode 100644 buildrelease.pl create mode 100644 samples/Makefile create mode 100644 samples/docsample.cpp create mode 100644 source/utf8.h create mode 100644 source/utf8/checked.h create mode 100644 source/utf8/core.h create mode 100644 source/utf8/unchecked.h create mode 100644 test_data/negative/utf8_invalid.txt create mode 100644 test_data/utf8samples/UTF-8-demo.txt create mode 100644 test_data/utf8samples/Unicode_transcriptions.html create mode 100644 test_data/utf8samples/quickbrown.txt create mode 100644 test_drivers/Makefile create mode 100644 test_drivers/negative/Makefile create mode 100644 test_drivers/negative/negative.cpp create mode 100644 test_drivers/performance/Makefile create mode 100644 test_drivers/performance/iconvtest.cpp create mode 100644 test_drivers/performance/timer.h create mode 100644 test_drivers/performance/win32.cpp create mode 100644 test_drivers/runtests.pl create mode 100644 test_drivers/smoke_test/Makefile create mode 100644 test_drivers/smoke_test/test.cpp create mode 100644 test_drivers/utf8reader/Makefile create mode 100644 test_drivers/utf8reader/utf8reader.cpp diff --git a/README.md b/README.md index 57fbd0bce..9585b2fe0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,1131 @@ -# utfcpp -UTF-8 with C++ in a Portable Way +# UTF8-CPP: UTF-8 with C++ in a Portable Way + +[The Sourceforge project page](https://sourceforge.net/projects/utfcpp) + +
+ +## Table of Contents + +* [Introduction](#introduction) +* [Examples of Use](#examples) + * [Introductionary Sample](#introsample) + * [Checking if a file contains valid UTF-8 text](#validfile) + * [Ensure that a string contains valid UTF-8 text](#fixinvalid) +* [Reference](#reference) + * [Functions From utf8 Namespace](#funutf8) + * [Types From utf8 Namespace](#typesutf8) + * [Functions From utf8::unchecked Namespace](#fununchecked) + * [Types From utf8::unchecked Namespace](#typesunchecked) +* [Points of Interest](#points) +* [Links](#links) + +
+ +## Introduction + +Many C++ developers miss an easy and portable way of handling Unicode encoded strings. The original C++ Standard (known as C++98 or C++03) is Unicode agnostic. C++11 provides some support for Unicode on core language and library level: u8, u, and U character and string literals, char16_t and char32_t character types, u16string and u32string library classes, and codecvt support for conversions between Unicode encoding forms. In the meantime, developers use third party libraries like ICU, OS specific capabilities, or simply roll out their own solutions. + +In order to easily handle UTF-8 encoded Unicode strings, I came up with a small generic library. For anybody used to work with STL algorithms and iterators, it should be easy and natural to use. The code is freely available for any purpose - check out the license at the beginning of the utf8.h file. If you run into bugs or performance issues, please let me know and I'll do my best to address them. + +The purpose of this article is not to offer an introduction to Unicode in general, and UTF-8 in particular. If you are not familiar with Unicode, be sure to check out [Unicode Home Page](http://www.unicode.org/) or some other source of information for Unicode. Also, it is not my aim to advocate the use of UTF-8 encoded strings in C++ programs; if you want to handle UTF-8 encoded strings from C++, I am sure you have good reasons for it. + +## Examples of use + +### Introductionary Sample + +To illustrate the use of the library, let's start with a small but complete program that opens a file containing UTF-8 encoded text, reads it line by line, checks each line for invalid UTF-8 byte sequences, and converts it to UTF-16 encoding and back to UTF-8: + +
#include 
+#include 
+#include 
+#include 
+#include "utf8.h"
+using namespace std;
+int main(int argc, char** argv)
+{
+    if (argc != 2) {
+        cout << "\nUsage: docsample filename\n";
+        return 0;
+    }
+
+    const char* test_file_path = argv[1];
+    // Open the test file (contains UTF-8 encoded text)
+    ifstream fs8(test_file_path);
+    if (!fs8.is_open()) {
+    cout << "Could not open " << test_file_path << endl;
+    return 0;
+    }
+
+    unsigned line_count = 1;
+    string line;
+    // Play with all the lines in the file
+    while (getline(fs8, line)) {
+       // check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)
+        string::iterator end_it = utf8::find_invalid(line.begin(), line.end());
+        if (end_it != line.end()) {
+            cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n";
+            cout << "This part is fine: " << string(line.begin(), end_it) << "\n";
+        }
+
+        // Get the line length (at least for the valid part)
+        int length = utf8::distance(line.begin(), end_it);
+        cout << "Length of line " << line_count << " is " << length <<  "\n";
+
+        // Convert it to utf-16
+        vector utf16line;
+        utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line));
+
+        // And back to utf-8
+        string utf8line; 
+        utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line));
+
+        // Confirm that the conversion went OK:
+        if (utf8line != string(line.begin(), end_it))
+            cout << "Error in UTF-16 conversion at line: " << line_count << "\n";        
+
+        line_count++;
+    }
+    return 0;
+}
+
+ +In the previous code sample, for each line we performed a detection of invalid UTF-8 sequences with `find_invalid`; the number of characters (more precisely - the number of Unicode code points, including the end of line and even BOM if there is one) in each line was determined with a use of `utf8::distance`; finally, we have converted each line to UTF-16 encoding with `utf8to16` and back to UTF-8 with `utf16to8`. + +### Checking if a file contains valid UTF-8 text + +Here is a function that checks whether the content of a file is valid UTF-8 encoded text without reading the content into the memory: + +
    
+bool valid_utf8_file(iconst char* file_name)
+{
+    ifstream ifs(file_name);
+    if (!ifs)
+        return false; // even better, throw here
+
+    istreambuf_iterator<char> it(ifs.rdbuf());
+    istreambuf_iterator<char> eos;
+
+    return utf8::is_valid(it, eos);
+}
+
+ +Because the function `utf8::is_valid()` works with input iterators, we were able to pass an `istreambuf_iterator` to it and read the content of the file directly without loading it to the memory first. + +Note that other functions that take input iterator arguments can be used in a similar way. For instance, to read the content of a UTF-8 encoded text file and convert the text to UTF-16, just do something like: + +
    utf8::utf8to16(it, eos, back_inserter(u16string));
+
+ +### Ensure that a string contains valid UTF-8 text + +If we have some text that "probably" contains UTF-8 encoded text and we want to replace any invalid UTF-8 sequence with a replacement character, something like the following function may be used: + +
void fix_utf8_string(std::string& str)
+{
+    std::string temp;
+    utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
+    str = temp;
+}
+
+ +The function will replace any invalid UTF-8 sequence with a Unicode replacement character. There is an overloaded function that enables the caller to supply their own replacement character. + +## Reference + +### Functions From utf8 Namespace + +#### utf8::append + +Available in version 1.0 and later. + +Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. + +
template <typename octet_iterator>
+octet_iterator append(uint32_t cp, octet_iterator result);
+
+
+ +`octet_iterator`: an output iterator. + `cp`: a 32 bit integer representing a code point to append to the sequence. + `result`: an output iterator to the place in the sequence where to append the code point. + Return value: an iterator pointing to the place after the newly appended sequence. + +Example of use: + +
unsigned char u[5] = {0,0,0,0,0};
+unsigned char* end = append(0x0448, u);
+assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0);
+
+ +Note that `append` does not allocate any memory - it is the burden of the caller to make sure there is enough memory allocated for the operation. To make things more interesting, `append` can add anywhere between 1 and 4 octets to the sequence. In practice, you would most often want to use `std::back_inserter` to ensure that the necessary memory is allocated. + +In case of an invalid code point, a `utf8::invalid_code_point` exception is thrown. + +#### utf8::next + +Available in version 1.0 and later. + +Given the iterator to the beginning of the UTF-8 sequence, it returns the code point and moves the iterator to the next position. + +
template <typename octet_iterator> 
+uint32_t next(octet_iterator& it, octet_iterator end);
+
+
+ +`octet_iterator`: an input iterator. + `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the beginning of the next code point. + `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. + Return value: the 32 bit representation of the processed UTF-8 code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = next(w, twochars + 6);
+assert (cp == 0x65e5);
+assert (w == twochars + 3);
+
+ +This function is typically used to iterate through a UTF-8 encoded string. + +In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. + +#### utf8::peek_next + +Available in version 2.1 and later. + +Given the iterator to the beginning of the UTF-8 sequence, it returns the code point for the following sequence without changing the value of the iterator. + +
template <typename octet_iterator> 
+uint32_t peek_next(octet_iterator it, octet_iterator end);
+
+
+ +`octet_iterator`: an input iterator. + `it`: an iterator pointing to the beginning of an UTF-8 encoded code point. + `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. + Return value: the 32 bit representation of the processed UTF-8 code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = peek_next(w, twochars + 6);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. + +#### utf8::prior + +Available in version 1.02 and later. + +Given a reference to an iterator pointing to an octet in a UTF-8 sequence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. + +
template <typename octet_iterator> 
+uint32_t prior(octet_iterator& it, octet_iterator start);
+
+
+ +`octet_iterator`: a bidirectional iterator. + `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. + `start`: an iterator to the beginning of the sequence where the search for the beginning of a code point is performed. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. + Return value: the 32 bit representation of the previous code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+unsigned char* w = twochars + 3;
+int cp = prior (w, twochars);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +This function has two purposes: one is two iterate backwards through a UTF-8 encoded string. Note that it is usually a better idea to iterate forward instead, since `utf8::next` is faster. The second purpose is to find a beginning of a UTF-8 sequence if we have a random position within a string. Note that in that case `utf8::prior` may not detect an invalid UTF-8 sequence in some scenarios: for instance if there are superfluous trail octets, it will just skip them. + +`it` will typically point to the beginning of a code point, and `start` will point to the beginning of the string to ensure we don't go backwards too far. `it` is decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence beginning with that octet is decoded to a 32 bit representation and returned. + +In case `start` is reached before a UTF-8 lead octet is hit, or if an invalid UTF-8 sequence is started by the lead octet, an `invalid_utf8` exception is thrown. + +In case `start` equals `it`, a `not_enough_room` exception is thrown. + +#### utf8::previous + +Deprecated in version 1.02 and later. + +Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. + +
template <typename octet_iterator> 
+uint32_t previous(octet_iterator& it, octet_iterator pass_start);
+
+
+ +`octet_iterator`: a random access iterator. + `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. + `pass_start`: an iterator to the point in the sequence where the search for the beginning of a code point is aborted if no result was reached. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. + Return value: the 32 bit representation of the previous code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+unsigned char* w = twochars + 3;
+int cp = previous (w, twochars - 1);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +`utf8::previous` is deprecated, and `utf8::prior` should be used instead, although the existing code can continue using this function. The problem is the parameter `pass_start` that points to the position just before the beginning of the sequence. Standard containers don't have the concept of "pass start" and the function can not be used with their iterators. + +`it` will typically point to the beginning of a code point, and `pass_start` will point to the octet just before the beginning of the string to ensure we don't go backwards too far. `it` is decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence beginning with that octet is decoded to a 32 bit representation and returned. + +In case `pass_start` is reached before a UTF-8 lead octet is hit, or if an invalid UTF-8 sequence is started by the lead octet, an `invalid_utf8` exception is thrown + +#### utf8::advance + +Available in version 1.0 and later. + +Advances an iterator by the specified number of code points within an UTF-8 sequence. + +
template <typename octet_iterator, typename distance_type> 
+void advance (octet_iterator& it, distance_type n, octet_iterator end);
+
+
+ +`octet_iterator`: an input iterator. + `distance_type`: an integral type convertible to `octet_iterator`'s difference type. + `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the nth following code point. + `n`: a positive integer that shows how many code points we want to advance. + `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+unsigned char* w = twochars;
+advance (w, 2, twochars + 6);
+assert (w == twochars + 5);
+
+ +This function works only "forward". In case of a negative `n`, there is no effect. + +In case of an invalid code point, a `utf8::invalid_code_point` exception is thrown. + +#### utf8::distance + +Available in version 1.0 and later. + +Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. + +
template <typename octet_iterator> 
+typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last);
+
+
+ +`octet_iterator`: an input iterator. + `first`: an iterator to a beginning of a UTF-8 encoded code point. + `last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. + Return value the distance between the iterators, in code points. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+size_t dist = utf8::distance(twochars, twochars + 5);
+assert (dist == 2);
+
+ +This function is used to find the length (in code points) of a UTF-8 encoded string. The reason it is called _distance_, rather than, say, _length_ is mainly because developers are used that _length_ is an O(1) function. Computing the length of an UTF-8 string is a linear operation, and it looked better to model it after `std::distance` algorithm. + +In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. If `last` does not point to the past-of-end of a UTF-8 seqence, a `utf8::not_enough_room` exception is thrown. + +#### utf8::utf16to8 + +Available in version 1.0 and later. + +Converts a UTF-16 encoded string to UTF-8. + +
template <typename u16bit_iterator, typename octet_iterator>
+octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
+
+
+ +`u16bit_iterator`: an input iterator. + `octet_iterator`: an output iterator. + `start`: an iterator pointing to the beginning of the UTF-16 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. + `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-8 string. + +Example of use: + +
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
+vector<unsigned char> utf8result;
+utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
+assert (utf8result.size() == 10);    
+
+ +In case of invalid UTF-16 sequence, a `utf8::invalid_utf16` exception is thrown. + +#### utf8::utf8to16 + +Available in version 1.0 and later. + +Converts an UTF-8 encoded string to UTF-16 + +
template <typename u16bit_iterator, typename octet_iterator>
+u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
+
+
+ +`octet_iterator`: an input iterator. + `u16bit_iterator`: an output iterator. + `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. < br /> `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. + `result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-16 string. + +Example of use: + +
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
+vector <unsigned short> utf16result;
+utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result));
+assert (utf16result.size() == 4);
+assert (utf16result[2] == 0xd834);
+assert (utf16result[3] == 0xdd1e);
+
+ +In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. If `end` does not point to the past-of-end of a UTF-8 seqence, a `utf8::not_enough_room` exception is thrown. + +#### utf8::utf32to8 + +Available in version 1.0 and later. + +Converts a UTF-32 encoded string to UTF-8. + +
template <typename octet_iterator, typename u32bit_iterator>
+octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
+
+
+ +`octet_iterator`: an output iterator. + `u32bit_iterator`: an input iterator. + `start`: an iterator pointing to the beginning of the UTF-32 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. + `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-8 string. + +Example of use: + +
int utf32string[] = {0x448, 0x65E5, 0x10346, 0};
+vector<unsigned char> utf8result;
+utf32to8(utf32string, utf32string + 3, back_inserter(utf8result));
+assert (utf8result.size() == 9);
+
+ +In case of invalid UTF-32 string, a `utf8::invalid_code_point` exception is thrown. + +#### utf8::utf8to32 + +Available in version 1.0 and later. + +Converts a UTF-8 encoded string to UTF-32. + +
template <typename octet_iterator, typename u32bit_iterator>
+u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
+
+
+ +`octet_iterator`: an input iterator. + `u32bit_iterator`: an output iterator. + `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. + `result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-32 string. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+vector<int> utf32result;
+utf8to32(twochars, twochars + 5, back_inserter(utf32result));
+assert (utf32result.size() == 2);
+
+ +In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. If `end` does not point to the past-of-end of a UTF-8 seqence, a `utf8::not_enough_room` exception is thrown. + +#### utf8::find_invalid + +Available in version 1.0 and later. + +Detects an invalid sequence within a UTF-8 string. + +
template <typename octet_iterator> 
+octet_iterator find_invalid(octet_iterator start, octet_iterator end);
+
+ +`octet_iterator`: an input iterator. + `start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. + `end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. + Return value: an iterator pointing to the first invalid octet in the UTF-8 string. In case none were found, equals `end`. + +Example of use: + +
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
+char* invalid = find_invalid(utf_invalid, utf_invalid + 6);
+assert (invalid == utf_invalid + 5);
+
+ +This function is typically used to make sure a UTF-8 string is valid before processing it with other functions. It is especially important to call it if before doing any of the _unchecked_ operations on it. + +#### utf8::is_valid + +Available in version 1.0 and later. + +Checks whether a sequence of octets is a valid UTF-8 string. + +
template <typename octet_iterator> 
+bool is_valid(octet_iterator start, octet_iterator end);
+
+
+ +`octet_iterator`: an input iterator. + `start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. + `end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. + Return value: `true` if the sequence is a valid UTF-8 string; `false` if not. + +Example of use: + +
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
+bool bvalid = is_valid(utf_invalid, utf_invalid + 6);
+assert (bvalid == false);
+
+ +`is_valid` is a shorthand for `find_invalid(start, end) == end;`. You may want to use it to make sure that a byte seqence is a valid UTF-8 string without the need to know where it fails if it is not valid. + +#### utf8::replace_invalid + +Available in version 2.0 and later. + +Replaces all invalid UTF-8 sequences within a string with a replacement marker. + +
template <typename octet_iterator, typename output_iterator>
+output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement);
+template <typename octet_iterator, typename output_iterator>
+output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out);
+
+
+ +`octet_iterator`: an input iterator. + `output_iterator`: an output iterator. + `start`: an iterator pointing to the beginning of the UTF-8 string to look for invalid UTF-8 sequences. + `end`: an iterator pointing to pass-the-end of the UTF-8 string to look for invalid UTF-8 sequences. + `out`: An output iterator to the range where the result of replacement is stored. + `replacement`: A Unicode code point for the replacement marker. The version without this parameter assumes the value `0xfffd` + Return value: An iterator pointing to the place after the UTF-8 string with replaced invalid sequences. + +Example of use: + +
char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z";
+vector<char> replace_invalid_result;
+replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), '?');
+bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
+assert (bvalid);
+char* fixed_invalid_sequence = "a????z";
+assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence));
+
+ +`replace_invalid` does not perform in-place replacement of invalid sequences. Rather, it produces a copy of the original string with the invalid sequences replaced with a replacement marker. Therefore, `out` must not be in the `[start, end]` range. + +If `end` does not point to the past-of-end of a UTF-8 sequence, a `utf8::not_enough_room` exception is thrown. + +#### utf8::starts_with_bom + +Available in version 2.3 and later. Relaces deprecated `is_bom()` function. + +Checks whether an octet sequence starts with a UTF-8 byte order mark (BOM) + +
template <typename octet_iterator> 
+bool starts_with_bom (octet_iterator it, octet_iterator end);
+
+ +`octet_iterator`: an input iterator. + `it`: beginning of the octet sequence to check + `end`: pass-end of the sequence to check + Return value: `true` if the sequence starts with a UTF-8 byte order mark; `false` if not. + +Example of use: + +
unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf};
+bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark));
+assert (bbom == true);
+
+ +The typical use of this function is to check the first three bytes of a file. If they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 encoded text. + +#### utf8::is_bom + +Available in version 1.0 and later. Deprecated in version 2.3\. `starts_with_bom()` should be used instead. + +Checks whether a sequence of three octets is a UTF-8 byte order mark (BOM) + +
template <typename octet_iterator> 
+bool is_bom (octet_iterator it);  // Deprecated
+
+ +`octet_iterator`: an input iterator. + `it`: beginning of the 3-octet sequence to check + Return value: `true` if the sequence is UTF-8 byte order mark; `false` if not. + +Example of use: + +
unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf};
+bool bbom = is_bom(byte_order_mark);
+assert (bbom == true);
+
+ +The typical use of this function is to check the first three bytes of a file. If they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 encoded text. + +If a sequence is shorter than three bytes, an invalid iterator will be dereferenced. Therefore, this function is deprecated in favor of `starts_with_bom()`that takes the end of sequence as an argument. + +### Types From utf8 Namespace + +#### utf8::exception + +Available in version 2.3 and later. + +Base class for the exceptions thrown by UTF CPP library functions. + +
class exception : public std::exception {};
+
+ +Example of use: + +
try {
+  code_that_uses_utf_cpp_library();
+}
+catch(const utf8::exception& utfcpp_ex) {
+  cerr << utfcpp_ex.what();
+}
+
+ +#### utf8::invalid_code_point + +Available in version 1.0 and later. + +Thrown by UTF8 CPP functions such as `advance` and `next` if an UTF-8 sequence represents and invalid code point. + +
class invalid_code_point : public exception {
+public: 
+    uint32_t code_point() const;
+};
+
+
+ +Member function `code_point()` can be used to determine the invalid code point that caused the exception to be thrown. + +#### utf8::invalid_utf8 + +Available in version 1.0 and later. + +Thrown by UTF8 CPP functions such as `next` and `prior` if an invalid UTF-8 sequence is detected during decoding. + +
class invalid_utf8 : public exception {
+public: 
+    uint8_t utf8_octet() const;
+};
+
+ +Member function `utf8_octet()` can be used to determine the beginning of the byte sequence that caused the exception to be thrown. + +#### utf8::invalid_utf16 + +Available in version 1.0 and later. + +Thrown by UTF8 CPP function `utf16to8` if an invalid UTF-16 sequence is detected during decoding. + +
class invalid_utf16 : public exception {
+public: 
+    uint16_t utf16_word() const;
+};
+
+ +Member function `utf16_word()` can be used to determine the UTF-16 code unit that caused the exception to be thrown. + +#### utf8::not_enough_room + +Available in version 1.0 and later. + +Thrown by UTF8 CPP functions such as `next` if the end of the decoded UTF-8 sequence was reached before the code point was decoded. + +
class not_enough_room : public exception {};
+
+ +#### utf8::iterator + +Available in version 2.0 and later. + +Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. + +
template <typename octet_iterator>
+class iterator;
+
+ +##### Member functions + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +Example of use: + +
char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
+utf8::iterator<char*> it(threechars, threechars, threechars + 9);
+utf8::iterator<char*> it2 = it;
+assert (it2 == it);
+assert (*it == 0x10346);
+assert (*(++it) == 0x65e5);
+assert ((*it++) == 0x65e5);
+assert (*it == 0x0448);
+assert (it != it2);
+utf8::iterator<char*> endit (threechars + 9, threechars, threechars + 9);  
+assert (++it == endit);
+assert (*(--it) == 0x0448);
+assert ((*it--) == 0x0448);
+assert (*it == 0x65e5);
+assert (--it == utf8::iterator<char*>(threechars, threechars, threechars + 9));
+assert (*it == 0x10346);
+
+ +The purpose of `utf8::iterator` adapter is to enable easy iteration as well as the use of STL algorithms with UTF-8 encoded strings. Increment and decrement operators are implemented in terms of `utf8::next()` and `utf8::prior()` functions. + +Note that `utf8::iterator` adapter is a checked iterator. It operates on the range specified in the constructor; any attempt to go out of that range will result in an exception. Even the comparison operators require both iterator object to be constructed against the same range - otherwise an exception is thrown. Typically, the range will be determined by sequence container functions `begin` and `end`, i.e.: + +
std::string s = "example";
+utf8::iterator i (s.begin(), s.begin(), s.end());
+
+ +### Functions From utf8::unchecked Namespace + +#### utf8::unchecked::append + +Available in version 1.0 and later. + +Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. + +
template <typename octet_iterator>
+octet_iterator append(uint32_t cp, octet_iterator result);
+
+
+ +`cp`: A 32 bit integer representing a code point to append to the sequence. + `result`: An output iterator to the place in the sequence where to append the code point. + Return value: An iterator pointing to the place after the newly appended sequence. + +Example of use: + +
unsigned char u[5] = {0,0,0,0,0};
+unsigned char* end = unchecked::append(0x0448, u);
+assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0);
+
+ +This is a faster but less safe version of `utf8::append`. It does not check for validity of the supplied code point, and may produce an invalid UTF-8 sequence. + +#### utf8::unchecked::next + +Available in version 1.0 and later. + +Given the iterator to the beginning of a UTF-8 sequence, it returns the code point and moves the iterator to the next position. + +
template <typename octet_iterator>
+uint32_t next(octet_iterator& it);
+
+
+ +`it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the beginning of the next code point. + Return value: the 32 bit representation of the processed UTF-8 code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = unchecked::next(w);
+assert (cp == 0x65e5);
+assert (w == twochars + 3);
+
+ +This is a faster but less safe version of `utf8::next`. It does not check for validity of the supplied UTF-8 sequence. + +#### utf8::unchecked::peek_next + +Available in version 2.1 and later. + +Given the iterator to the beginning of a UTF-8 sequence, it returns the code point. + +
template <typename octet_iterator>
+uint32_t peek_next(octet_iterator it);
+
+
+ +`it`: an iterator pointing to the beginning of an UTF-8 encoded code point. + Return value: the 32 bit representation of the processed UTF-8 code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = unchecked::peek_next(w);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +This is a faster but less safe version of `utf8::peek_next`. It does not check for validity of the supplied UTF-8 sequence. + +#### utf8::unchecked::prior + +Available in version 1.02 and later. + +Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. + +
template <typename octet_iterator>
+uint32_t prior(octet_iterator& it);
+
+
+ +`it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. + Return value: the 32 bit representation of the previous code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars + 3;
+int cp = unchecked::prior (w);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +This is a faster but less safe version of `utf8::prior`. It does not check for validity of the supplied UTF-8 sequence and offers no boundary checking. + +#### utf8::unchecked::previous (deprecated, see utf8::unchecked::prior) + +Deprecated in version 1.02 and later. + +Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. + +
template <typename octet_iterator>
+uint32_t previous(octet_iterator& it);
+
+
+ +`it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. + Return value: the 32 bit representation of the previous code point. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars + 3;
+int cp = unchecked::previous (w);
+assert (cp == 0x65e5);
+assert (w == twochars);
+
+ +The reason this function is deprecated is just the consistency with the "checked" versions, where `prior` should be used instead of `previous`. In fact, `unchecked::previous` behaves exactly the same as `unchecked::prior` + +This is a faster but less safe version of `utf8::previous`. It does not check for validity of the supplied UTF-8 sequence and offers no boundary checking. + +#### utf8::unchecked::advance + +Available in version 1.0 and later. + +Advances an iterator by the specified number of code points within an UTF-8 sequence. + +
template <typename octet_iterator, typename distance_type>
+void advance (octet_iterator& it, distance_type n);
+
+
+ +`it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the nth following code point. + `n`: a positive integer that shows how many code points we want to advance. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+unchecked::advance (w, 2);
+assert (w == twochars + 5);
+
+ +This function works only "forward". In case of a negative `n`, there is no effect. + +This is a faster but less safe version of `utf8::advance`. It does not check for validity of the supplied UTF-8 sequence and offers no boundary checking. + +#### utf8::unchecked::distance + +Available in version 1.0 and later. + +Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. + +
template <typename octet_iterator>
+typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last);
+
+ +`first`: an iterator to a beginning of a UTF-8 encoded code point. + `last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. + Return value the distance between the iterators, in code points. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+size_t dist = utf8::unchecked::distance(twochars, twochars + 5);
+assert (dist == 2);
+
+ +This is a faster but less safe version of `utf8::distance`. It does not check for validity of the supplied UTF-8 sequence. + +#### utf8::unchecked::utf16to8 + +Available in version 1.0 and later. + +Converts a UTF-16 encoded string to UTF-8. + +
template <typename u16bit_iterator, typename octet_iterator>
+octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
+
+
+ +`start`: an iterator pointing to the beginning of the UTF-16 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. + `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-8 string. + +Example of use: + +
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
+vector<unsigned char> utf8result;
+unchecked::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
+assert (utf8result.size() == 10);    
+
+ +This is a faster but less safe version of `utf8::utf16to8`. It does not check for validity of the supplied UTF-16 sequence. + +#### utf8::unchecked::utf8to16 + +Available in version 1.0 and later. + +Converts an UTF-8 encoded string to UTF-16 + +
template <typename u16bit_iterator, typename octet_iterator>
+u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
+
+
+ +`start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. < br /> `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. + `result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-16 string. + +Example of use: + +
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
+vector <unsigned short> utf16result;
+unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result));
+assert (utf16result.size() == 4);
+assert (utf16result[2] == 0xd834);
+assert (utf16result[3] == 0xdd1e);
+
+ +This is a faster but less safe version of `utf8::utf8to16`. It does not check for validity of the supplied UTF-8 sequence. + +#### utf8::unchecked::utf32to8 + +Available in version 1.0 and later. + +Converts a UTF-32 encoded string to UTF-8. + +
template <typename octet_iterator, typename u32bit_iterator>
+octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
+
+
+ +`start`: an iterator pointing to the beginning of the UTF-32 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. + `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-8 string. + +Example of use: + +
int utf32string[] = {0x448, 0x65e5, 0x10346, 0};
+vector<unsigned char> utf8result;
+utf32to8(utf32string, utf32string + 3, back_inserter(utf8result));
+assert (utf8result.size() == 9);
+
+ +This is a faster but less safe version of `utf8::utf32to8`. It does not check for validity of the supplied UTF-32 sequence. + +#### utf8::unchecked::utf8to32 + +Available in version 1.0 and later. + +Converts a UTF-8 encoded string to UTF-32. + +
template <typename octet_iterator, typename u32bit_iterator>
+u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
+
+
+ +`start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. + `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. + `result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. + Return value: An iterator pointing to the place after the appended UTF-32 string. + +Example of use: + +
char* twochars = "\xe6\x97\xa5\xd1\x88";
+vector<int> utf32result;
+unchecked::utf8to32(twochars, twochars + 5, back_inserter(utf32result));
+assert (utf32result.size() == 2);
+
+ +This is a faster but less safe version of `utf8::utf8to32`. It does not check for validity of the supplied UTF-8 sequence. + +### Types From utf8::unchecked Namespace + +#### utf8::iterator + +Available in version 2.0 and later. + +Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. + +
template <typename octet_iterator>
+class iterator;
+
+ +##### Member functions + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +Example of use: + +
char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
+utf8::unchecked::iterator<char*> un_it(threechars);
+utf8::unchecked::iterator<char*> un_it2 = un_it;
+assert (un_it2 == un_it);
+assert (*un_it == 0x10346);
+assert (*(++un_it) == 0x65e5);
+assert ((*un_it++) == 0x65e5);
+assert (*un_it == 0x0448);
+assert (un_it != un_it2);
+utf8::::unchecked::iterator<char*> un_endit (threechars + 9);  
+assert (++un_it == un_endit);
+assert (*(--un_it) == 0x0448);
+assert ((*un_it--) == 0x0448);
+assert (*un_it == 0x65e5);
+assert (--un_it == utf8::unchecked::iterator<char*>(threechars));
+assert (*un_it == 0x10346);
+
+ +This is an unchecked version of `utf8::iterator`. It is faster in many cases, but offers no validity or range checks. + +## Points of interest + +#### Design goals and decisions + +The library was designed to be: + +1. Generic: for better or worse, there are many C++ string classes out there, and the library should work with as many of them as possible. +2. Portable: the library should be portable both accross different platforms and compilers. The only non-portable code is a small section that declares unsigned integers of different sizes: three typedefs. They can be changed by the users of the library if they don't match their platform. The default setting should work for Windows (both 32 and 64 bit), and most 32 bit and 64 bit Unix derivatives. +3. Lightweight: follow the "pay only for what you use" guideline. +4. Unintrusive: avoid forcing any particular design or even programming style on the user. This is a library, not a framework. + +#### Alternatives + +In case you want to look into other means of working with UTF-8 strings from C++, here is the list of solutions I am aware of: + +1. [ICU Library](http://icu.sourceforge.net/). It is very powerful, complete, feature-rich, mature, and widely used. Also big, intrusive, non-generic, and doesn't play well with the Standard Library. I definitelly recommend looking at ICU even if you don't plan to use it. +2. C++11 language and library features. Still far from complete, and not widely supported by compiler vendors. +3. [Glib::ustring](http://www.gtkmm.org/gtkmm2/docs/tutorial/html/ch03s04.html). A class specifically made to work with UTF-8 strings, and also feel like `std::string`. If you prefer to have yet another string class in your code, it may be worth a look. Be aware of the licensing issues, though. +4. Platform dependent solutions: Windows and POSIX have functions to convert strings from one encoding to another. That is only a subset of what my library offers, but if that is all you need it may be good enough. + +## Links + +1. [The Unicode Consortium](http://www.unicode.org/). +2. [ICU Library](http://icu.sourceforge.net/). +3. [UTF-8 at Wikipedia](http://en.wikipedia.org/wiki/UTF-8) +4. [UTF-8 and Unicode FAQ for Unix/Linux](http://www.cl.cam.ac.uk/~mgk25/unicode.html) \ No newline at end of file diff --git a/buildrelease.pl b/buildrelease.pl new file mode 100644 index 000000000..ed3a17bbe --- /dev/null +++ b/buildrelease.pl @@ -0,0 +1,18 @@ +#! /usr/bin/perl + +$release_files = 'source/utf8.h source/utf8/core.h source/utf8/checked.h source/utf8/unchecked.h doc/utf8cpp.html doc/ReleaseNotes'; + +# First get the latest version +`svn update`; + +# Then construct the name of the zip file +$argc = @ARGV; +if ($argc > 0) { + $zip_name = $ARGV[0]; +} +else { + $zip_name = "utf8"; +} + +# Zip the files to an archive +`zip $zip_name $release_files`; diff --git a/samples/Makefile b/samples/Makefile new file mode 100644 index 000000000..6cdd3c859 --- /dev/null +++ b/samples/Makefile @@ -0,0 +1,5 @@ +CC = g++ +CFLAGS = -g -Wall -pedantic + +docsample: docsample.cpp ../source/utf8.h + $(CC) $(CFLAGS) docsample.cpp -odocsample diff --git a/samples/docsample.cpp b/samples/docsample.cpp new file mode 100644 index 000000000..6f8953b99 --- /dev/null +++ b/samples/docsample.cpp @@ -0,0 +1,52 @@ +#include "../source/utf8.h" +#include +#include +#include +#include + + +using namespace std; + +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "\nUsage: docsample filename\n"; + return 0; + } + const char* test_file_path = argv[1]; + // Open the test file (must be UTF-8 encoded) + ifstream fs8(test_file_path); + if (!fs8.is_open()) { + cout << "Could not open " << test_file_path << endl; + return 0; + } + + unsigned line_count = 1; + string line; + // Play with all the lines in the file + while (getline(fs8, line)) { + // check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function) + string::iterator end_it = utf8::find_invalid(line.begin(), line.end()); + if (end_it != line.end()) { + cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n"; + cout << "This part is fine: " << string(line.begin(), end_it) << "\n"; + } + // Get the line length (at least for the valid part) + int length = utf8::distance(line.begin(), end_it); + cout << "Length of line " << line_count << " is " << length << "\n"; + + // Convert it to utf-16 + vector utf16line; + utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line)); + // And back to utf-8; + string utf8line; + utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line)); + // Confirm that the conversion went OK: + if (utf8line != string(line.begin(), end_it)) + cout << "Error in UTF-16 conversion at line: " << line_count << "\n"; + + line_count++; + } + + return 0; +} diff --git a/source/utf8.h b/source/utf8.h new file mode 100644 index 000000000..82b13f59f --- /dev/null +++ b/source/utf8.h @@ -0,0 +1,34 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "utf8/checked.h" +#include "utf8/unchecked.h" + +#endif // header guard diff --git a/source/utf8/checked.h b/source/utf8/checked.h new file mode 100644 index 000000000..cc1ec4777 --- /dev/null +++ b/source/utf8/checked.h @@ -0,0 +1,327 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "core.h" +#include + +namespace utf8 +{ + // Base for the exceptions that may be thrown from the library + class exception : public ::std::exception { + }; + + // Exceptions that may be thrown from the library functions. + class invalid_code_point : public exception { + uint32_t cp; + public: + invalid_code_point(uint32_t cp) : cp(cp) {} + virtual const char* what() const throw() { return "Invalid code point"; } + uint32_t code_point() const {return cp;} + }; + + class invalid_utf8 : public exception { + uint8_t u8; + public: + invalid_utf8 (uint8_t u) : u8(u) {} + virtual const char* what() const throw() { return "Invalid UTF-8"; } + uint8_t utf8_octet() const {return u8;} + }; + + class invalid_utf16 : public exception { + uint16_t u16; + public: + invalid_utf16 (uint16_t u) : u16(u) {} + virtual const char* what() const throw() { return "Invalid UTF-16"; } + uint16_t utf16_word() const {return u16;} + }; + + class not_enough_room : public exception { + public: + virtual const char* what() const throw() { return "Not enough space"; } + }; + + /// The library API - functions intended to be called by the users + + template + octet_iterator append(uint32_t cp, octet_iterator result) + { + if (!utf8::internal::is_code_point_valid(cp)) + throw invalid_code_point(cp); + + if (cp < 0x80) // one octet + *(result++) = static_cast(cp); + else if (cp < 0x800) { // two octets + *(result++) = static_cast((cp >> 6) | 0xc0); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else if (cp < 0x10000) { // three octets + *(result++) = static_cast((cp >> 12) | 0xe0); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else { // four octets + *(result++) = static_cast((cp >> 18) | 0xf0); + *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + return result; + } + + template + output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) + { + while (start != end) { + octet_iterator sequence_start = start; + internal::utf_error err_code = utf8::internal::validate_next(start, end); + switch (err_code) { + case internal::UTF8_OK : + for (octet_iterator it = sequence_start; it != start; ++it) + *out++ = *it; + break; + case internal::NOT_ENOUGH_ROOM: + throw not_enough_room(); + case internal::INVALID_LEAD: + out = utf8::append (replacement, out); + ++start; + break; + case internal::INCOMPLETE_SEQUENCE: + case internal::OVERLONG_SEQUENCE: + case internal::INVALID_CODE_POINT: + out = utf8::append (replacement, out); + ++start; + // just one replacement mark for the sequence + while (start != end && utf8::internal::is_trail(*start)) + ++start; + break; + } + } + return out; + } + + template + inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) + { + static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); + return utf8::replace_invalid(start, end, out, replacement_marker); + } + + template + uint32_t next(octet_iterator& it, octet_iterator end) + { + uint32_t cp = 0; + internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); + switch (err_code) { + case internal::UTF8_OK : + break; + case internal::NOT_ENOUGH_ROOM : + throw not_enough_room(); + case internal::INVALID_LEAD : + case internal::INCOMPLETE_SEQUENCE : + case internal::OVERLONG_SEQUENCE : + throw invalid_utf8(*it); + case internal::INVALID_CODE_POINT : + throw invalid_code_point(cp); + } + return cp; + } + + template + uint32_t peek_next(octet_iterator it, octet_iterator end) + { + return utf8::next(it, end); + } + + template + uint32_t prior(octet_iterator& it, octet_iterator start) + { + // can't do much if it == start + if (it == start) + throw not_enough_room(); + + octet_iterator end = it; + // Go back until we hit either a lead octet or start + while (utf8::internal::is_trail(*(--it))) + if (it == start) + throw invalid_utf8(*it); // error - no lead byte in the sequence + return utf8::peek_next(it, end); + } + + /// Deprecated in versions that include "prior" + template + uint32_t previous(octet_iterator& it, octet_iterator pass_start) + { + octet_iterator end = it; + while (utf8::internal::is_trail(*(--it))) + if (it == pass_start) + throw invalid_utf8(*it); // error - no lead byte in the sequence + octet_iterator temp = it; + return utf8::next(temp, end); + } + + template + void advance (octet_iterator& it, distance_type n, octet_iterator end) + { + for (distance_type i = 0; i < n; ++i) + utf8::next(it, end); + } + + template + typename std::iterator_traits::difference_type + distance (octet_iterator first, octet_iterator last) + { + typename std::iterator_traits::difference_type dist; + for (dist = 0; first < last; ++dist) + utf8::next(first, last); + return dist; + } + + template + octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) + { + while (start != end) { + uint32_t cp = utf8::internal::mask16(*start++); + // Take care of surrogate pairs first + if (utf8::internal::is_lead_surrogate(cp)) { + if (start != end) { + uint32_t trail_surrogate = utf8::internal::mask16(*start++); + if (utf8::internal::is_trail_surrogate(trail_surrogate)) + cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; + else + throw invalid_utf16(static_cast(trail_surrogate)); + } + else + throw invalid_utf16(static_cast(cp)); + + } + // Lone trail surrogate + else if (utf8::internal::is_trail_surrogate(cp)) + throw invalid_utf16(static_cast(cp)); + + result = utf8::append(cp, result); + } + return result; + } + + template + u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) + { + while (start < end) { + uint32_t cp = utf8::next(start, end); + if (cp > 0xffff) { //make a surrogate pair + *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); + *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); + } + else + *result++ = static_cast(cp); + } + return result; + } + + template + octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) + { + while (start != end) + result = utf8::append(*(start++), result); + + return result; + } + + template + u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) + { + while (start < end) + (*result++) = utf8::next(start, end); + + return result; + } + + // The iterator class + template + class iterator : public std::iterator { + octet_iterator it; + octet_iterator range_start; + octet_iterator range_end; + public: + iterator () {} + explicit iterator (const octet_iterator& octet_it, + const octet_iterator& range_start, + const octet_iterator& range_end) : + it(octet_it), range_start(range_start), range_end(range_end) + { + if (it < range_start || it > range_end) + throw std::out_of_range("Invalid utf-8 iterator position"); + } + // the default "big three" are OK + octet_iterator base () const { return it; } + uint32_t operator * () const + { + octet_iterator temp = it; + return utf8::next(temp, range_end); + } + bool operator == (const iterator& rhs) const + { + if (range_start != rhs.range_start || range_end != rhs.range_end) + throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); + return (it == rhs.it); + } + bool operator != (const iterator& rhs) const + { + return !(operator == (rhs)); + } + iterator& operator ++ () + { + utf8::next(it, range_end); + return *this; + } + iterator operator ++ (int) + { + iterator temp = *this; + utf8::next(it, range_end); + return temp; + } + iterator& operator -- () + { + utf8::prior(it, range_start); + return *this; + } + iterator operator -- (int) + { + iterator temp = *this; + utf8::prior(it, range_start); + return temp; + } + }; // class iterator + +} // namespace utf8 + +#endif //header guard + + diff --git a/source/utf8/core.h b/source/utf8/core.h new file mode 100644 index 000000000..693d388c0 --- /dev/null +++ b/source/utf8/core.h @@ -0,0 +1,329 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include + +namespace utf8 +{ + // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers + // You may need to change them to match your system. + // These typedefs have the same names as ones from cstdint, or boost/cstdint + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + +// Helper code - not intended to be directly called by the library users. May be changed at any time +namespace internal +{ + // Unicode constants + // Leading (high) surrogates: 0xd800 - 0xdbff + // Trailing (low) surrogates: 0xdc00 - 0xdfff + const uint16_t LEAD_SURROGATE_MIN = 0xd800u; + const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; + const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; + const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; + const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); + const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; + + // Maximum valid value for a Unicode code point + const uint32_t CODE_POINT_MAX = 0x0010ffffu; + + template + inline uint8_t mask8(octet_type oc) + { + return static_cast(0xff & oc); + } + template + inline uint16_t mask16(u16_type oc) + { + return static_cast(0xffff & oc); + } + template + inline bool is_trail(octet_type oc) + { + return ((utf8::internal::mask8(oc) >> 6) == 0x2); + } + + template + inline bool is_lead_surrogate(u16 cp) + { + return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); + } + + template + inline bool is_trail_surrogate(u16 cp) + { + return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); + } + + template + inline bool is_surrogate(u16 cp) + { + return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); + } + + template + inline bool is_code_point_valid(u32 cp) + { + return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); + } + + template + inline typename std::iterator_traits::difference_type + sequence_length(octet_iterator lead_it) + { + uint8_t lead = utf8::internal::mask8(*lead_it); + if (lead < 0x80) + return 1; + else if ((lead >> 5) == 0x6) + return 2; + else if ((lead >> 4) == 0xe) + return 3; + else if ((lead >> 3) == 0x1e) + return 4; + else + return 0; + } + + template + inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) + { + if (cp < 0x80) { + if (length != 1) + return true; + } + else if (cp < 0x800) { + if (length != 2) + return true; + } + else if (cp < 0x10000) { + if (length != 3) + return true; + } + + return false; + } + + enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; + + /// Helper for get_sequence_x + template + utf_error increase_safely(octet_iterator& it, octet_iterator end) + { + if (++it == end) + return NOT_ENOUGH_ROOM; + + if (!utf8::internal::is_trail(*it)) + return INCOMPLETE_SEQUENCE; + + return UTF8_OK; + } + + #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} + + /// get_sequence_x functions decode utf-8 sequences of the length x + template + utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + return UTF8_OK; + } + + template + utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); + + return UTF8_OK; + } + + template + utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (*it) & 0x3f; + + return UTF8_OK; + } + + template + utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (*it) & 0x3f; + + return UTF8_OK; + } + + #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR + + template + utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + // Save the original value of it so we can go back in case of failure + // Of course, it does not make much sense with i.e. stream iterators + octet_iterator original_it = it; + + uint32_t cp = 0; + // Determine the sequence length based on the lead octet + typedef typename std::iterator_traits::difference_type octet_difference_type; + const octet_difference_type length = utf8::internal::sequence_length(it); + + // Get trail octets and calculate the code point + utf_error err = UTF8_OK; + switch (length) { + case 0: + return INVALID_LEAD; + case 1: + err = utf8::internal::get_sequence_1(it, end, cp); + break; + case 2: + err = utf8::internal::get_sequence_2(it, end, cp); + break; + case 3: + err = utf8::internal::get_sequence_3(it, end, cp); + break; + case 4: + err = utf8::internal::get_sequence_4(it, end, cp); + break; + } + + if (err == UTF8_OK) { + // Decoding succeeded. Now, security checks... + if (utf8::internal::is_code_point_valid(cp)) { + if (!utf8::internal::is_overlong_sequence(cp, length)){ + // Passed! Return here. + code_point = cp; + ++it; + return UTF8_OK; + } + else + err = OVERLONG_SEQUENCE; + } + else + err = INVALID_CODE_POINT; + } + + // Failure branch - restore the original value of the iterator + it = original_it; + return err; + } + + template + inline utf_error validate_next(octet_iterator& it, octet_iterator end) { + uint32_t ignored; + return utf8::internal::validate_next(it, end, ignored); + } + +} // namespace internal + + /// The library API - functions intended to be called by the users + + // Byte order mark + const uint8_t bom[] = {0xef, 0xbb, 0xbf}; + + template + octet_iterator find_invalid(octet_iterator start, octet_iterator end) + { + octet_iterator result = start; + while (result != end) { + utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); + if (err_code != internal::UTF8_OK) + return result; + } + return result; + } + + template + inline bool is_valid(octet_iterator start, octet_iterator end) + { + return (utf8::find_invalid(start, end) == end); + } + + template + inline bool starts_with_bom (octet_iterator it, octet_iterator end) + { + return ( + ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && + ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && + ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) + ); + } + + //Deprecated in release 2.3 + template + inline bool is_bom (octet_iterator it) + { + return ( + (utf8::internal::mask8(*it++)) == bom[0] && + (utf8::internal::mask8(*it++)) == bom[1] && + (utf8::internal::mask8(*it)) == bom[2] + ); + } +} // namespace utf8 + +#endif // header guard + + diff --git a/source/utf8/unchecked.h b/source/utf8/unchecked.h new file mode 100644 index 000000000..cb2427166 --- /dev/null +++ b/source/utf8/unchecked.h @@ -0,0 +1,228 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "core.h" + +namespace utf8 +{ + namespace unchecked + { + template + octet_iterator append(uint32_t cp, octet_iterator result) + { + if (cp < 0x80) // one octet + *(result++) = static_cast(cp); + else if (cp < 0x800) { // two octets + *(result++) = static_cast((cp >> 6) | 0xc0); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else if (cp < 0x10000) { // three octets + *(result++) = static_cast((cp >> 12) | 0xe0); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else { // four octets + *(result++) = static_cast((cp >> 18) | 0xf0); + *(result++) = static_cast(((cp >> 12) & 0x3f)| 0x80); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + return result; + } + + template + uint32_t next(octet_iterator& it) + { + uint32_t cp = utf8::internal::mask8(*it); + typename std::iterator_traits::difference_type length = utf8::internal::sequence_length(it); + switch (length) { + case 1: + break; + case 2: + it++; + cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); + break; + case 3: + ++it; + cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); + ++it; + cp += (*it) & 0x3f; + break; + case 4: + ++it; + cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); + ++it; + cp += (utf8::internal::mask8(*it) << 6) & 0xfff; + ++it; + cp += (*it) & 0x3f; + break; + } + ++it; + return cp; + } + + template + uint32_t peek_next(octet_iterator it) + { + return utf8::unchecked::next(it); + } + + template + uint32_t prior(octet_iterator& it) + { + while (utf8::internal::is_trail(*(--it))) ; + octet_iterator temp = it; + return utf8::unchecked::next(temp); + } + + // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) + template + inline uint32_t previous(octet_iterator& it) + { + return utf8::unchecked::prior(it); + } + + template + void advance (octet_iterator& it, distance_type n) + { + for (distance_type i = 0; i < n; ++i) + utf8::unchecked::next(it); + } + + template + typename std::iterator_traits::difference_type + distance (octet_iterator first, octet_iterator last) + { + typename std::iterator_traits::difference_type dist; + for (dist = 0; first < last; ++dist) + utf8::unchecked::next(first); + return dist; + } + + template + octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) + { + while (start != end) { + uint32_t cp = utf8::internal::mask16(*start++); + // Take care of surrogate pairs first + if (utf8::internal::is_lead_surrogate(cp)) { + uint32_t trail_surrogate = utf8::internal::mask16(*start++); + cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; + } + result = utf8::unchecked::append(cp, result); + } + return result; + } + + template + u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) + { + while (start < end) { + uint32_t cp = utf8::unchecked::next(start); + if (cp > 0xffff) { //make a surrogate pair + *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); + *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); + } + else + *result++ = static_cast(cp); + } + return result; + } + + template + octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) + { + while (start != end) + result = utf8::unchecked::append(*(start++), result); + + return result; + } + + template + u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) + { + while (start < end) + (*result++) = utf8::unchecked::next(start); + + return result; + } + + // The iterator class + template + class iterator : public std::iterator { + octet_iterator it; + public: + iterator () {} + explicit iterator (const octet_iterator& octet_it): it(octet_it) {} + // the default "big three" are OK + octet_iterator base () const { return it; } + uint32_t operator * () const + { + octet_iterator temp = it; + return utf8::unchecked::next(temp); + } + bool operator == (const iterator& rhs) const + { + return (it == rhs.it); + } + bool operator != (const iterator& rhs) const + { + return !(operator == (rhs)); + } + iterator& operator ++ () + { + ::std::advance(it, utf8::internal::sequence_length(it)); + return *this; + } + iterator operator ++ (int) + { + iterator temp = *this; + ::std::advance(it, utf8::internal::sequence_length(it)); + return temp; + } + iterator& operator -- () + { + utf8::unchecked::prior(it); + return *this; + } + iterator operator -- (int) + { + iterator temp = *this; + utf8::unchecked::prior(it); + return temp; + } + }; // class iterator + + } // namespace utf8::unchecked +} // namespace utf8 + + +#endif // header guard + diff --git a/test_data/negative/utf8_invalid.txt b/test_data/negative/utf8_invalid.txt new file mode 100644 index 0000000000000000000000000000000000000000..ae83159328313d3ba57b4f51ccb96db3dbfd79f1 GIT binary patch literal 20010 zcmdU1X_MU6bovBN~mKh6fF_0QAgsswpbL0B%%C@w9FK+vZcy8Zq1!0g4#f{pMW{IDslKE-otkk?5=P@_gAEfdHgKi|B z)6KH}<@4tc4-cDO*!0|9)AgEz{qtYa+uL8iaQ^dTMb=kWH&#~HSJo~$&h>6!#*Dho@!}-$y=+-} zZrF*Fp5I=UIFUH(`pIFC`VvH$4^Fcn+B29=>OVE`BhOEpq9iFbAT5eB>G^JyNft}X z7Z>0WFvZeHX99kq@03yXYq|L;(&dH9ts7p$uh^(gsw*RC$vY zY4j=~Y%hh*Ls*{|AHZ86gsAN%L)t()AWLb*#wIOE+*A(zFyznNBEzA8Rd`-IH)U&f zl+BGO;P3Eo+jsggj1)FaA*9fC*p>*2haGtyviXSFv1s@(Ed6 zy|{UCW$iNDZgp8wql;8_np>*S_2!1R46wF;5O}@=$MJ&$>lhf@1q;MT1j1~2xe?_7i8soFiY{eZsL0IJi`?X4n~y*;FwnIw&Q*V!K8y$>Sqno<}~ap zxg=aT3*GE6pk2;*FQ*rt3UdfN7l;l#mjeu74-IJ{(n-mr;kqdg$y0+MqwIUVID($= zG|Z_F+i|@vz?=zlqf5pBQa1vz!!p=R=vIe>T=mJGk5FQ{lBF9D?(XjHoLiQ|Zh&#Z zINqnIT992B>@!+mY^a@lK-LIZ@S`3Au0}Lh(x4YGx}?KiD-Jal^@6=_W@6P|9Jd7m zcInaw0X+|_wF8ZOgCOl6AX-Hh}9Dt0Fw9I6j?$C z5B8!sq4kz*6%4`L5@!&Vq**nj3a^Cc(Ve=r!$Ua%e4yv<`%c?$AbGI*hz-5=X%o z8|Vz8O-)9Upx1NveCQaw6r)v~%Vz3oqE6jmDvj%pT$QVj?=;{s%0$RSz$lKW7fYa7 z3Yw-Fr9Mr_h1xW86_brufYKN> z;4w#@-$#xF6?{KCM6^Ska10Ua&9&y5s&>7J`+^nFo4Ft`ildc2{3TOgedx)DuU#WA zSrUh-bK^l|j8%P^w_CfQC>NqpECww2Q+izRdgQlP4udwRqpL3?6To&!X_aRyNh2#6 z^rX*u#$Yt>g1N#?ePjUypS+y3i4X6kg`2faZaK;KU>}di8oiL! zQ5GOvxFH-Wf*Tw_cP3FGfYRSU-}Hc*mr$K0Fly#kV1zJkSKwG3q;@)uM}ts>F43pK znHGF$kPXz`Qmr5>RpL235Ds)ukYMADkZHW$Mm^AG(bgJ*c92zxS=Jqk#5yC(S+g-w z#aIod8u0PGA@H554=&S+Bg6s?mKx6Ks<{cNg+PkVBP^S>o>rrWF{GE})Yr&4^{X>q z964(uPqNA`Y|eysR_ZffxW|`^r|*j}zskMP#6n*_Kk@y2IYjX&5A4Tj&wrqhXye5X zeC&nyfAr}WKltMN8h0mk@l>vhT$!r5jq5Y#r+24i)^E;$KEzhpk36BL&U20S4A_Q zBIX>R_iNDO?^8R_%@e2}X0GgvKYi~{XJOtOG;b4RcOXFdT*2hzQb$@H+&1pKr?&8v zeC3!1ZV;~`-Vo83?N$B*;>YVpn+hVNXb_>`9U>}$tu_%~zWG93cc~!4!il)HN|OOh zXH&Kfs51WQyXu>bAnriXO<1@>YAP_0my~V8`Kxne1VY~19_D#s1sz-&Iak1}D&0RJ&LiOnofNn*|25_z`kt zh0AWmHJUNiV?7sOMK(T+n#FTHQyls)KlknU--~m9x*=l;`OniQyr|GV*xGAuxndg8yp|J#-}r(kMW+X%Ny%vLo`pj zu#+YH!-;o#PqjL;l==)vyJ^6k41NlSwBl%A*3;9d=EBR}AN$MA>i{}^iM+>BW*Dg-#cVmWred^bLQ|tG(d`$jE{#O1@ z{$Bn;{!#u({#pJ-{#E`>?#RdG<^Okmpx&T9wkOrGIYS*Cs-v?t+uh3i@fq!JugJg4 zf5?BztMXs+-|~q$Rsw%Dji*%r4Nt#XuqlT@w$9!0lJ`0&O#rERz;Cstl`FjfI~CY-KH*wC zeKZsnDcZTEO)c2G!zLd#6pON@Iz!i<1UoIyw^U1lXU)$|kAZIJ7f9UM(qU@j)0uHx1rmJ~9yQ0b-8TMMd{5G(Jh5B!z z(yQoME5JgvXe+90Pc&{#RyLf!X~jEHS=7Y4eLNcwCODBBYXZJ9z3ym8M980r?llo# zo3U|XAQ81D0#r@N*Jo|U7);F6Yiq`A!I?dU#!IsWiJ5wB%_tt%Nik)`a_ekBOx0^^ zh6}I6Q$TDb%tplIy0&IkR?7{A26qx>L&D2yYi6agpU}{aglSCcjtjY=reTf`qtgd# zhwRueJsJTTIwvAoT4%t;#|Xw)hAhajh^ZQG;p<$c$;oCn78)+9F%mD7ohAkCBiq`+ zUMD6DyI5LlPFUa+KNrt0kQ=vdA0v3s+toc^dif?SmL@jSCJI{W{#-oGx)E`$XZKT0 zPOMAMg+KZ2n_2nV}G!joR1Q@B8RBMcT8Cp+yH^rfrww6fT}V$d7rj<8yQA zjY*#$AN}5+=+hTC@9yZn(x(@LhcpQK_^*=#zwySWPldgB`5}Tmfi^d7IxK_4y(KmK ziN(`5Zhs|(MdNoFr_knB_PI0cp_pWED(W_Sjo5x@`|8)52#gsUh?90x9*Gax@TdJ| zXqrPi8HEA>yn@C^w85t-d;Qr$S6m}!((Fx7G(5r_6>-_4h?O+7(V^M3J>VIUuHR#S zc_VdU5~dHV#LK%B8$~!y{I{W=)R#;{vvz@(T$d8jhEMos^%|kK)=hCN;j(rP<6sKU zacHNyHZHTFJ!Drrau<=ot>$Wrtu61d-eN87CrI zzG;lr?odNO4hVh3lJ@nSjGoCzalixP<$ateuTe$MuusSmEr=yuC4JTQN!z$Mn=EbV z^zl1kbK6WPDEz!z*3Ji-vWsuW zu93qdH9RWB6Bc=iShUfz(G*bvf?axa_Z%AU^o$2&1BxI(ZQ_UdRRKrZ)r(|4-~pzb zDtL=7w&{y71wu&S^lG=au6bfaBYn_mr0Tnmn{qgt`r zqN6s1HE0f?bB$fV3;I48gD}kT0Zfku3D1}5ffjn_LEs-Q7t%xN1a0L<(D2Ji|0wO9 zr?5=7D_s`qn3TWz@LMQ{w{Wkg@WU$8^pCQc9xNIRlj4xn$WY=U3Q&?<(c9{v%{<1T zopb;*RfDcFjChc8L!4|C&C?Zzmf5XqG*k8dT#h*7rF>KXNuT<^^~>=i0We6Im^mtf zIW0~?Q4?xVEYSQTob13P)n1E_&zsD?S8*^8bN6B{Z;74Ih$Z8$H;bq53%T$C(Uh?^ zm$qr3hn}e8vcl=G@7gjjNod7h%9uicNlsI&wRB~valV0GYI9l(c4w3c-zqNpFAw!p z%I$FlFROx!paECb<4_qoxAm+d{h16F7xU4~Lmsx}noA%Mhmxm9*-Y`@j`g$)&IIz; z_Cn1+CAiPFzn%YP@%n}R!2-FwvChUI562TK`5qLaEWGu6?K*Dc5OBQ&^tC6biV48m z$MYg?l!%?8%gBNP5p$M#AvY_K+j+|tdY23;AUOw`7xO{|(9XU1<6)dtytL7|qe~z<}U$s32$R=i>DNdtrhy?T9?G#2A70_o*21 z;i)yKDeCZr8X!$D2h4jgSMwfB`wC-3y=F{9 z_BRqyArT|C$hi3jRK|#R%vgN0TvTohrspnSyn0(!qipS^{CX0Q;*gDV)62We$}1LK}1dW$W7G?26$^~H=_DL^As2yz}wTi5ml7xy+Ncq7l=09TTmb(-OouR-PuA`(!D_iB-8zzm~>~0IiBtT z3rtP-bAVPQasT%t2LxWrj}_}5Lcl7i`6~;j0$;p2j=S?j!YdrHmMfE?$^v_J&BPz( zf9S!6Gcl_!_B?tS&XC>9)hSK}3{AyEU8@dr98^!h_OSQMWd)q~%@?Q2*}3@}8EHk* z2oIc{o4+H1B@tVjOfX(Ib}U{WTnc{DZ0wRIG)`ffp2T}tpQtiY;pwE?GojCfuN@p{ zgM)FEMP~!>wL8z$b~H;gJjAqV-*|B6iq2-Ol8zj)jXQ;QB+WkTG76{TR+c*vAF17y5@tu1s zUU@e8zQDA~DKV{W0`uOAGMKr?zz4_ZR976M^VyrV>CAn`V3u@ROiL#)>(XhwhMqk} zr<(d0ozK;mr}3K{v!v5vS~`JQmrmn3j2B~cD%2RA&)1hHdL96lW0rJUOiL#)>(F`M VE;t6T_-vE^`IE6xPXA%#{2v5ASmOWy literal 0 HcmV?d00001 diff --git a/test_data/utf8samples/UTF-8-demo.txt b/test_data/utf8samples/UTF-8-demo.txt new file mode 100644 index 000000000..4363f27bd --- /dev/null +++ b/test_data/utf8samples/UTF-8-demo.txt @@ -0,0 +1,212 @@ + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkʊs kuːn] — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ + 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn + Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] + +APL: + + ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ + +Nicer typography in plain text files: + + ╔══════════════════════════════════════════╗ + ║ ║ + ║ • ‘single’ and “double” quotes ║ + ║ ║ + ║ • Curly apostrophes: “We’ve been here” ║ + ║ ║ + ║ • Latin-1 apostrophe and accents: '´` ║ + ║ ║ + ║ • ‚deutsche‘ „Anführungszeichen“ ║ + ║ ║ + ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║ + ║ ║ + ║ • ASCII safety test: 1lI|, 0OD, 8B ║ + ║ ╭─────────╮ ║ + ║ • the euro symbol: │ 14.95 € │ ║ + ║ ╰─────────╯ ║ + ╚══════════════════════════════════════════╝ + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωρίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν τρομερή, + σὲ γνωρίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετράει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱερά + καὶ σὰν πρῶτα ἀνδρειωμένη + χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! + + From a speech of Demosthenes in the 4th century BC: + + Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ + τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ + εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ + πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, + οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν + ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι + γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους + σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ + τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ + τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς + τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო + კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, + ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს + ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, + ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება + ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, + ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + Зарегистрируйтесь сейчас на Десятую Международную Конференцию по + Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. + Конференция соберет широкий круг экспертов по вопросам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных системах и программных + приложениях, шрифтах, верстке и многоязычных компьютерных системах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ + สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา + โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ + เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ + ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስ። + ብላ ካለኝ እንደአባቴ በቆመጠኝ። + ጌጥ ያለቤቱ ቁምጥና ነው። + ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። + የአፍ ወለምታ በቅቤ አይታሽም። + አይጥ በበላ ዳዋ ተመታ። + ሲተረጉሙ ይደረግሙ። + ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። + ድር ቢያብር አንበሳ ያስር። + ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። + እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። + የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። + ሥራ ከመፍታት ልጄን ላፋታት። + ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። + የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። + ተንጋሎ ቢተፉ ተመልሶ ባፉ። + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። + እግርህን በፍራሽህ ልክ ዘርጋ። + +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ + + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ + ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ + ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ + ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ + ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ + + ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ + ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ + ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ + ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ + ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ + ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ + ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд + ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა + +Greetings in various languages: + + Hello world, Καλημέρα κόσμε, コンニチハ + +Box drawing alignment tests: █ + ▉ + ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ + ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ + ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ + ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ + ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ + ▝▀▘▙▄▟ diff --git a/test_data/utf8samples/Unicode_transcriptions.html b/test_data/utf8samples/Unicode_transcriptions.html new file mode 100644 index 000000000..69b29ffa5 --- /dev/null +++ b/test_data/utf8samples/Unicode_transcriptions.html @@ -0,0 +1,167 @@ +? *Unicode Transcriptions* Notes <#Notes> + +Glyphs | Samples + | Charts + | UTF + | Forms + | +Home . + + +Name Text Image +Arabic (Arabic) يونِكود ? +Arabic (Persian) یونی‌کُد / ?/ +Armenian Յունիկօդ +Bengali য়ূনিকোড +Bopomofo ㄊㄨㄥ˅ ㄧˋ ㄇㄚ˅ +ㄨㄢˋ ㄍㄨㄛˊ ㄇㄚ˅ +Braille +Buhid +Canadian Aboriginal ᔫᗂᑰᑦ +Cherokee ᏳᏂᎪᏛ +Cypriot +Cyrillic (Russian) Юникод ? +Deseret (English) ??????? +Devanagari (Hindi) यूनिकोड ? +Ethiopic ዩኒኮድ +Georgian უნიკოდი ? +Gothic +Greek Γιούνικοντ +Gujarati યૂનિકોડ +Gurmukhi ਯੂਨਿਕੋਡ +Han (Chinese) 统一码 ? +統一碼 ? +万国码 ? +萬國碼 ? +Hangul 유니코드 +Hanunoo +Hebrew יוניקוד +Hebrew (pointed) יוּנִיקוׁד +Hebrew (Yiddish) יוניקאָד ? +Hiragana (Japanese) ゆにこおど +Katakana (Japanese) ユニコード ? +Kannada ಯೂನಿಕೋಡ್ +Khmer យូនីគោដ +Lao +Latin Unicode Unicode +Latin (IPA <#English_Pronunciation>) ˈjunɪˌkoːd ? +Latin (Am. Dict. <#American_Dictionary>) Ūnĭcōde̽ ? +Limbu +Linear B +Malayalam യൂനികോഡ് +Mongolian +Myanmar +Ogham ᚔᚒᚅᚔᚉᚑᚇ / / +Old Italic +Oriya ୟୂନିକୋଡ +Osmanya +Runic (Anglo-Saxon) ᛡᚢᚾᛁᚳᚩᛞ +Shavian +Sinhala යණනිකෞද් +Syriac ܝܘܢܝܩܘܕ +Tagbanwa +Tagalog +Tai Le +Tamil யூனிகோட் +Telugu యూనికోడ్ +Thaana +Thai ยูนืโคด +Tibetan (Dzongkha) ཨུ་ནི་ཀོཌྲ། +Ugaritic +Yi + + + Notes: + +There are different ways to transcribe the word “Unicode”, depending on +the language and script. In some cases there is only one language that +customarily uses a given script; in others there are many languages. The +goal here is at a minimum to collect at least one transcription for each +script in a language customarily written in that script, with more +languages if possible. If the transcription is the same for multiple +languages in a script, then a single representative language is used. + +Still missing are transcriptions for the items above in RED (in at least +one language). I would appreciate any other transcriptions, or +corrections for the ones listed here. Send to mark3@macchiato.com +, using the directions below: + + * *Supplying Missing Items* + o Most Latin-script languages will follow the spelling, and + change the pronunciation. For any that would not, it would + be good to have the alternate spelling. + o For non-Latin scripts the goal is to match the English + pronunciation — /*not*/ spelling. Above is the IPA <#IPA> + (in phonemic transcription) that should be matched as + closely as possible (without sounding affected in the target + language) + o Text would be best in either the UTF-8 text, or the code + points in hex HTML. E.g. either of the following: + + "Юникод" + + "Юникод" + + Note: for / supplementary characters/ + , + there should be one hex number per code point, not two + surrogates + : + # 𐀀 /*not*/ �&xDC00; + o If you have a good font, I'd also appreciate a GIF. It + should be *96 x 24* bits, with the text centered, in black + on white (plus grays if smoothed). + * *Other Comments* + o Because some browsers won't handle the text, both text and + GIF image are supplied. If you can’t read the text columns, + see Display Problems + . + o The Chinese versions (inc. Bopomofo) are translations, not + transcriptions, since "transcription in Chinese is pretty + lame" [J. Becker]. + o There are other "translations" of Unicode that may be in + use, such as the Vietnamese "Thống Nhất Mã". + o For sample pages in different languages on the Unicode site, + see What is Unicode? + + o Americans are not generally used to IPA, and find a variety + of different systems in their dictionaries. This one leaves + the base letters as they are, and uses diacritics for + pronunciation. + * *Etymology of /Unicode/* + o Coined by J. Becker. Not related to previous usages, such as: + + A telegraphic code in which one word or set of letters + represents a sentence or phrase; a telegram or message + in this. (late 19th century, OED) + o According to my references, the prefix "uni" is directly + from Latin while the word "code" is through French. + o The original Indo-European apparently would have been + *oino-kau-do ("one strike give"): *kau apparently being + related to such English words as: hew, haggle, hoe, hag, + hay, hack, caudad, caudal, caudate, caudex, coda, codex, + codicil, coward, incus, and Kovač (personal name: "smith"). + + I will leave the exact derivations to the exegetes, + but I like the association with "haggle" myself. + * *Contributions* + o This draws on contributions or comments from: + + Dixon Au + + Joe Becker + + Maurice Bauhahn + + Abel Cheung + + Peter Constable + + Michael Everson + + Christopher John Fynn + + Michael Kaplan + + George Kiraz + + Abdul Malik + + Siva Nataraja + + Roozbeh Pournader + + Jonathan Rosenne + + Jungshik Shin + +------------------------------------------------------------------------ + + +Terms of Use . Last updated: +MED - 04/20/2003 15:30:33. + + + + diff --git a/test_data/utf8samples/quickbrown.txt b/test_data/utf8samples/quickbrown.txt new file mode 100644 index 000000000..5db944343 --- /dev/null +++ b/test_data/utf8samples/quickbrown.txt @@ -0,0 +1,126 @@ +Sentences that contain all letters commonly used in a language +-------------------------------------------------------------- + +Markus Kuhn -- 2001-09-02 + +This file is UTF-8 encoded. + + +Danish (da) +--------- + + Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen + Wolther spillede på xylofon. + (= Quiz contestants were eating strawbery with cream while Wolther + the circus clown played on xylophone.) + +German (de) +----------- + + Falsches Üben von Xylophonmusik quält jeden größeren Zwerg + (= Wrongful practicing of xylophone music tortures every larger dwarf) + + Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich + (= Twelve boxing fighters hunted Eva across the dike of Sylt) + + Heizölrückstoßabdämpfung + (= fuel oil recoil absorber) + (jqvwxy missing, but all non-ASCII letters in one word) + +English (en) +------------ + + The quick brown fox jumps over the lazy dog + +Spanish (es) +------------ + + El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y + frío, añoraba a su querido cachorro. + (Contains every letter and every accent, but not every combination + of vowel + acute.) + +French (fr) +----------- + + Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à + côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce + qui lui permet de penser à la cænogenèse de l'être dont il est question + dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, + pense-t-il, diminue çà et là la qualité de son œuvre. + + l'île exiguë + Où l'obèse jury mûr + Fête l'haï volapük, + Âne ex aéquo au whist, + Ôtez ce vœu déçu. + + Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en + canoë au delà des îles, près du mälström où brûlent les novæ. + +Irish Gaelic (ga) +----------------- + + D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh + +Hungarian (hu) +-------------- + + Árvíztűrő tükörfúrógép + (= flood-proof mirror-drilling machine, only all non-ASCII letters) + +Icelandic (is) +-------------- + + Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa + + Sævör grét áðan því úlpan var ónýt + (some ASCII letters missing) + +Japanese (jp) +------------- + + Hiragana: (Iroha) + + いろはにほへとちりぬるを + わかよたれそつねならむ + うゐのおくやまけふこえて + あさきゆめみしゑひもせす + + Katakana: + + イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム + ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン + +Hebrew (iw) +----------- + + ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה + +Polish (pl) +----------- + + Pchnąć w tę łódź jeża lub ośm skrzyń fig + (= To push a hedgehog or eight bins of figs in this boat) + +Russian (ru) +------------ + + В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! + (= Would a citrus live in the bushes of south? Yes, but only a fake one!) + +Thai (th) +--------- + + [--------------------------|------------------------] + ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน + จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร + ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย + ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ + + [The copyright for the Thai example is owned by The Computer + Association of Thailand under the Royal Patronage of His Majesty the + King.] + +Please let me know if you find others! Special thanks to the people +from all over the world who contributed these sentences. diff --git a/test_drivers/Makefile b/test_drivers/Makefile new file mode 100644 index 000000000..a2cbe4c2e --- /dev/null +++ b/test_drivers/Makefile @@ -0,0 +1,19 @@ +CC = g++ +CFLAGS = -g + +all: smoketest regressiontest negativetest utf8readertest + +smoketest: + cd smoke_test && $(MAKE) $@ + +regressiontest: + cd regression_tests && $(MAKE) $@ + +negativetest: + cd negative && $(MAKE) $@ + +utf8readertest: + cd utf8reader && $(MAKE) $@ + +clean: + rm smoke_test/smoketest regression_tests/regressiontest negative/negative utf8reader/utf8reader diff --git a/test_drivers/negative/Makefile b/test_drivers/negative/Makefile new file mode 100644 index 000000000..00f4a7d31 --- /dev/null +++ b/test_drivers/negative/Makefile @@ -0,0 +1,5 @@ +CC = g++ +CFLAGS = -g -Wall -pedantic + +negativetest: negative.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h + $(CC) $(CFLAGS) negative.cpp -onegative diff --git a/test_drivers/negative/negative.cpp b/test_drivers/negative/negative.cpp new file mode 100644 index 000000000..0f1015d0e --- /dev/null +++ b/test_drivers/negative/negative.cpp @@ -0,0 +1,53 @@ +#include "../../source/utf8.h" +using namespace utf8; + +#include +#include +#include +#include +using namespace std; + +const unsigned INVALID_LINES[] = { 75, 76, 83, 84, 85, 93, 102, 103, 105, 106, 107, 108, 109, 110, 114, 115, 116, 117, 124, 125, 130, 135, 140, 145, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 169, 175, 176, 177, 207, 208, 209, 210, 211, 220, 221, 222, 223, 224, 232, 233, 234, 235, 236, 247, 248, 249, 250, 251, 252, 253, 257, 258, 259, 260, 261, 262, 263, 264}; +const unsigned* INVALID_LINES_END = INVALID_LINES + sizeof(INVALID_LINES)/sizeof(unsigned); + +int main(int argc, char** argv) +{ + string test_file_path; + if (argc == 2) + test_file_path = argv[1]; + else { + cout << "Wrong number of arguments" << endl; + exit(0); + } + // Open the test file + ifstream fs8(test_file_path.c_str()); + if (!fs8.is_open()) { + cout << "Could not open " << test_file_path << endl; + return 0; + } + + // Read it line by line + unsigned int line_count = 0; + char byte; + while (!fs8.eof()) { + string line; + while ((byte = static_cast(fs8.get())) != '\n' && !fs8.eof()) + line.push_back(byte); + + line_count++; + bool expected_valid = (find(INVALID_LINES, INVALID_LINES_END, line_count) == INVALID_LINES_END); + // Print out lines that contain unexpected invalid UTF-8 + if (!is_valid(line.begin(), line.end())) { + if (expected_valid) + cout << "Unexpected invalid utf-8 at line " << line_count << '\n'; + + // try fixing it: + string fixed_line; + replace_invalid(line.begin(), line.end(), back_inserter(fixed_line)); + if (!is_valid(fixed_line.begin(), fixed_line.end())) + cout << "replace_invalid() resulted in an invalid utf-8 at line " << line_count << '\n'; + } + else if (!expected_valid) + cout << "Invalid utf-8 NOT detected at line " << line_count << '\n'; + } +} diff --git a/test_drivers/performance/Makefile b/test_drivers/performance/Makefile new file mode 100644 index 000000000..b38544506 --- /dev/null +++ b/test_drivers/performance/Makefile @@ -0,0 +1,5 @@ +CC = g++ +CFLAGS = -O3 + +iconvtest: iconvtest.cpp ../../source/utf8.h timer.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h + $(CC) $(CFLAGS) iconvtest.cpp -oiconvtest diff --git a/test_drivers/performance/iconvtest.cpp b/test_drivers/performance/iconvtest.cpp new file mode 100644 index 000000000..95e73e747 --- /dev/null +++ b/test_drivers/performance/iconvtest.cpp @@ -0,0 +1,132 @@ +#include +#include +#include "../../source/utf8.h" +#include "timer.h" +#include +#include +#include +using namespace std; + +using namespace utf8; + +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "\nUsage: iconvtest filename\n"; + return 0; + } + const char* test_file_path = argv[1]; + // Open the test file (UTF-8 encoded text) + ifstream fs8(test_file_path, ios::binary); + if (!fs8.is_open()) { + cout << "Could not open " << test_file_path << endl; + return 0; + } + // get length + fs8.seekg(0, ios::end); + int length = fs8.tellg(); + fs8.seekg(0, ios::beg); + + // allocate the buffer (no vector - we are benchmarking conversions, not STL + char* buf = new char[length]; + char* end_buf = buf + length; + // fill the data + fs8.read(buf, length); + fs8.close(); + // the UTF-16 result will not be larger than this (I hope :) ) + vector temputf16; + utf8::utf8to16(buf, end_buf, back_inserter(temputf16)); + int wlength = temputf16.size(); + unsigned short* utf16buf = new unsigned short[wlength]; + + cout << "UTF8 to UTF-16\n"; + { + memset (utf16buf, 0 , wlength * sizeof(unsigned short)); + // utf-8 cpp: + cout << "utf8::utf8to16: "; + timer t(cout); + utf8::utf8to16(buf, buf + length, utf16buf); + t.print_time(); + } + + { + memset (utf16buf, 0 , wlength * sizeof(unsigned short)); + // utf-8 cpp: + cout << "unchecked::utf8to16: "; + timer t(cout); + utf8::unchecked::utf8to16(buf, buf + length, utf16buf); + t.print_time(); + } + + // the UTF-16 result will not be larger than this (I hope :) ) + unsigned short* utf16iconvbuf = new unsigned short[wlength]; + { + memset (utf16iconvbuf, 0 , wlength * sizeof(unsigned short)); + // iconv + cout << "iconv: "; + + iconv_t cd = iconv_open("UTF-16LE", "UTF-8"); + if (cd == iconv_t(-1)) { + cout << "Error openning the iconv stream"; + return 0; + } + char* inbuf = buf; + size_t in_bytes_left = length; + char* outbuf = (char*)utf16iconvbuf; + size_t out_bytes_left = wlength * sizeof (unsigned short); + { + timer t(cout); + iconv(cd, &inbuf, &in_bytes_left, &outbuf, &out_bytes_left); + t.print_time(); + } + iconv_close(cd); + } + + // just check the correctness while we are here: + if (!equal(utf16buf, utf16buf + wlength, utf16iconvbuf)) + cout << "Different result!!!\n"; + + // the other way around + cout << "UTF16 to UTF-8\n"; + { + //iconv + memset(buf, 0, length); + cout<< "iconv: "; + + iconv_t cd = iconv_open("UTF-8", "UTF-16LE"); + if (cd == iconv_t(-1)) { + cout << "Error openning the iconv stream"; + return 0; + } + char* inbuf = (char*)utf16buf; + size_t in_bytes_left = wlength * sizeof(unsigned short); + char* outbuf =buf; + size_t out_bytes_left = length; + { + timer t(cout); + iconv(cd, &inbuf, &in_bytes_left, &outbuf, &out_bytes_left); + t.print_time(); + } + iconv_close(cd); + } + + { + memset (buf, 0 , length); + // utf-8 cpp: + cout << "unchecked::utf16to8: "; + timer t(cout); + utf8::unchecked::utf16to8(utf16buf, utf16buf + wlength, buf); + t.print_time(); + } + + { + memset (buf, 0 , length); + cout << "utf16to8: "; + timer t(cout); + utf8::utf16to8(utf16buf, utf16buf + wlength, buf); + t.print_time(); + } + + delete [] buf; + delete [] utf16buf; +} diff --git a/test_drivers/performance/timer.h b/test_drivers/performance/timer.h new file mode 100644 index 000000000..807752317 --- /dev/null +++ b/test_drivers/performance/timer.h @@ -0,0 +1,22 @@ +#include +#include +struct timer { + timer(std::ostream& report) : report(report) + {start = std::clock();} + + void print_time() + { + using namespace std; + clock_t now = clock(); + unsigned milliseconds = (now - start)*1000 / CLOCKS_PER_SEC; + report << "Spent " << milliseconds << "ms here\n"; + } + + std::clock_t start; + std::ostream& report; + +private: + // just to surpress a VC++ 8.0 warning + timer& operator = (const timer&); + timer(const timer&); +}; diff --git a/test_drivers/performance/win32.cpp b/test_drivers/performance/win32.cpp new file mode 100644 index 000000000..3ec861a26 --- /dev/null +++ b/test_drivers/performance/win32.cpp @@ -0,0 +1,110 @@ +#include +#include "../../source/utf8.h" +#include "timer.h" +#include +#include +#include +using namespace std; + +using namespace utf8; + +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "\nUsage: win32test filename\n"; + return 0; + } + const char* test_file_path = argv[1]; + // Open the test file (UTF-8 encoded text) + ifstream fs8(test_file_path, ios::binary); + if (!fs8.is_open()) { + cout << "Could not open " << test_file_path << endl; + return 0; + } + // get length + fs8.seekg(0, ios::end); + int length = fs8.tellg(); + fs8.seekg(0, ios::beg); + + // allocate the buffer (no vector - we are benchmarking conversions, not STL + char* buf = new char[length]; + // fill the data + fs8.read(buf, length); + fs8.close(); + cout << "UTF8 > UTF16\n"; + // the UTF-16 result will not be larger than this (I hope :) ) + vector temputf16; + utf8::utf8to16(buf, buf + length, back_inserter(temputf16)); + vector::size_type wlength = temputf16.size(); + wchar_t* utf16buf = new wchar_t[wlength]; + + { + memset (utf16buf, 0 , wlength * sizeof(wchar_t)); + // utf-8 cpp: + cout << "utf8::utf8to16: "; + timer t(cout); + utf8::utf8to16(buf, buf + length, utf16buf); + t.print_time(); + } + + { + memset (utf16buf, 0 , wlength * sizeof(wchar_t)); + // utf-8 cpp: + cout << "unchecked::utf8to16: "; + timer t(cout); + utf8::unchecked::utf8to16(buf, buf + length, utf16buf); + t.print_time(); + } + // the UTF-16 result will not be larger than this (I hope :) ) + wchar_t* utf16iconvbuf = new wchar_t[wlength]; + { + memset (utf16iconvbuf, 0 , wlength * sizeof(wchar_t)); + // win32 + cout << "win32: "; + + { + timer t(cout); + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buf, length, utf16iconvbuf, int(wlength)); + t.print_time(); + } + + } + + // just check the correctness while we are here: + if (!equal(utf16buf, utf16buf + wlength, utf16iconvbuf)) + cout << "Different result!!!"; + + // the other way around + cout << "UTF16 to UTF-8\n"; + { + //win32 + memset(buf, 0, length); + cout<< "win32: "; + + { + timer t(cout); + WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16buf, int(wlength), buf, length, NULL, NULL); + t.print_time(); + } + } + + { + memset (buf, 0 , length); + // utf-8 cpp: + cout << "unchecked::utf16to8: "; + timer t(cout); + utf8::unchecked::utf16to8(utf16buf, utf16buf + wlength, buf); + t.print_time(); + } + + { + memset (buf, 0 , length); + cout << "utf16to8: "; + timer t(cout); + utf8::utf16to8(utf16buf, utf16buf + wlength, buf); + t.print_time(); + } + + delete [] buf; + delete [] utf16buf; +} diff --git a/test_drivers/runtests.pl b/test_drivers/runtests.pl new file mode 100644 index 000000000..7d63f1843 --- /dev/null +++ b/test_drivers/runtests.pl @@ -0,0 +1,50 @@ +#! /usr/bin/perl + +$report_name = './report.txt'; + +# Create the report file +die if !open(REPORT, ">$report_name"); + +# First, build everything +print REPORT "==================Make output==================\n"; +close($report_name); + +`make >> $report_name`; +die if !open(REPORT, ">>$report_name"); +print REPORT "==================End of Make output==================\n"; +print REPORT "\n"; +# Now, run individual tests and create the report +print REPORT "==================Smoke Test ==================\n"; +close($report_name); +chdir 'smoke_test'; +`./smoketest >> ../$report_name`; +chdir '..'; +die if !open(REPORT, ">>$report_name"); +print REPORT "==================End of smoke test==================\n"; +print REPORT "\n"; +print REPORT "==================Regression Test ==================\n"; +close($report_name); +chdir 'regression_tests'; +`./regressiontest >> ../$report_name`; +chdir '..'; +die if !open(REPORT, ">>$report_name"); +print REPORT "==================End of regression test==================\n"; +print REPORT "\n"; +print REPORT "==================Negative Test ==================\n"; +close($report_name); +chdir 'negative'; +`./negative ../../test_data/negative/utf8_invalid.txt >> ../$report_name`; +chdir '..'; +die if !open(REPORT, ">>$report_name"); +print REPORT "==================End of negative test==================\n"; +print REPORT "\n"; +print REPORT "==================utf8reader runs ==================\n"; +close($report_name); +chdir 'utf8reader'; +`./utf8reader ../../test_data/utf8samples/quickbrown.txt >> ../$report_name`; +`./utf8reader ../../test_data/utf8samples/Unicode_transcriptions.html >> ../$report_name`; +`./utf8reader ../../test_data/utf8samples/UTF-8-demo.txt >> ../$report_name`; +chdir '..'; +die if !open(REPORT, ">>$report_name"); +print REPORT "==================End of utf8reader runs==================\n"; +print REPORT "\n"; diff --git a/test_drivers/smoke_test/Makefile b/test_drivers/smoke_test/Makefile new file mode 100644 index 000000000..f66f3af95 --- /dev/null +++ b/test_drivers/smoke_test/Makefile @@ -0,0 +1,5 @@ +CC = g++ +CFLAGS = -g -Wall + +smoketest: test.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h + $(CC) $(CFLAGS) test.cpp -osmoketest diff --git a/test_drivers/smoke_test/test.cpp b/test_drivers/smoke_test/test.cpp new file mode 100644 index 000000000..70d6f15d3 --- /dev/null +++ b/test_drivers/smoke_test/test.cpp @@ -0,0 +1,297 @@ +#include +#include +#include +#include "../../source/utf8.h" +using namespace utf8; +using namespace std; + +int main() +{ + //append + unsigned char u[5] = {0,0,0,0,0}; + + append(0x0448, u); + assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); + + append(0x65e5, u); + assert (u[0] == 0xe6 && u[1] == 0x97 && u[2] == 0xa5 && u[3] == 0 && u[4] == 0); + + append(0x3044, u); + assert (u[0] == 0xe3 && u[1] == 0x81 && u[2] == 0x84 && u[3] == 0 && u[4] == 0); + + append(0x10346, u); + assert (u[0] == 0xf0 && u[1] == 0x90 && u[2] == 0x8d && u[3] == 0x86 && u[4] == 0); + + + //next + const char* twochars = "\xe6\x97\xa5\xd1\x88"; + const char* w = twochars; + int cp = next(w, twochars + 6); + assert (cp == 0x65e5); + assert (w == twochars + 3); + + const char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"; + w = threechars; + cp = next(w, threechars + 9); + assert (cp == 0x10346); + assert (w == threechars + 4); + cp = next(w, threechars + 9); + assert (cp == 0x65e5); + assert (w == threechars + 7); + cp = next(w, threechars + 9); + assert (cp == 0x0448); + assert (w == threechars + 9); + + //peek_next + const char* const cw = twochars; + cp = peek_next(cw, cw + 6); + assert (cp == 0x65e5); + assert (cw == twochars); + + //prior + w = twochars + 3; + cp = prior (w, twochars); + assert (cp == 0x65e5); + assert (w == twochars); + + w = threechars + 9; + cp = prior(w, threechars); + assert (cp == 0x0448); + assert (w == threechars + 7); + cp = prior(w, threechars); + assert (cp == 0x65e5); + assert (w == threechars + 4); + cp = prior(w, threechars); + assert (cp == 0x10346); + assert (w == threechars); + + //previous (deprecated) + w = twochars + 3; + cp = previous (w, twochars - 1); + assert (cp == 0x65e5); + assert (w == twochars); + + w = threechars + 9; + cp = previous(w, threechars - 1); + assert (cp == 0x0448); + assert (w == threechars + 7); + cp = previous(w, threechars -1); + assert (cp == 0x65e5); + assert (w == threechars + 4); + cp = previous(w, threechars - 1); + assert (cp == 0x10346); + assert (w == threechars); + + // advance + w = twochars; + advance (w, 2, twochars + 6); + assert (w == twochars + 5); + + // distance + size_t dist = utf8::distance(twochars, twochars + 5); + assert (dist == 2); + + // utf32to8 + int utf32string[] = {0x448, 0x65E5, 0x10346, 0}; + vector utf8result; + utf32to8(utf32string, utf32string + 3, back_inserter(utf8result)); + assert (utf8result.size() == 9); + // try it with the return value; + char* utf8_end = utf32to8(utf32string, utf32string + 3, &utf8result[0]); + assert (utf8_end == &utf8result[0] + 9); + + //utf8to32 + vector utf32result; + utf8to32(twochars, twochars + 5, back_inserter(utf32result)); + assert (utf32result.size() == 2); + // try it with the return value; + int* utf32_end = utf8to32(twochars, twochars + 5, &utf32result[0]); + assert (utf32_end == &utf32result[0] + 2); + + //utf16to8 + unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; + utf8result.clear(); + utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); + assert (utf8result.size() == 10); + // try it with the return value; + utf8_end = utf16to8 (utf16string, utf16string + 5, &utf8result[0]); + assert (utf8_end == &utf8result[0] + 10); + + //utf8to16 + char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"; + vector utf16result; + utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); + assert (utf16result.size() == 4); + assert (utf16result[2] == 0xd834); + assert (utf16result[3] == 0xdd1e); + // try it with the return value; + unsigned short* utf16_end = utf8to16 (utf8_with_surrogates, utf8_with_surrogates + 9, &utf16result[0]); + assert (utf16_end == &utf16result[0] + 4); + + //find_invalid + char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa"; + char* invalid = find_invalid(utf_invalid, utf_invalid + 6); + assert (invalid == utf_invalid + 5); + + //is_valid + bool bvalid = is_valid(utf_invalid, utf_invalid + 6); + assert (bvalid == false); + bvalid = is_valid(utf8_with_surrogates, utf8_with_surrogates + 9); + assert (bvalid == true); + + //starts_with_bom + unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf}; + bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark)); + assert (bbom == true); + bool no_bbom = starts_with_bom(threechars, threechars + sizeof(threechars)); + assert (no_bbom == false); + + //is_bom + bool unsafe_bbom = is_bom(byte_order_mark); + assert (unsafe_bbom == true); + + + //replace_invalid + char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"; + vector replace_invalid_result(50); + replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), replace_invalid_result.begin(), '?'); + bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end()); + assert (bvalid); + const char* fixed_invalid_sequence = "a????z"; + assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.begin() + sizeof(fixed_invalid_sequence), fixed_invalid_sequence)); + + // iterator + utf8::iterator it(threechars, threechars, threechars + 9); + utf8::iterator it2 = it; + assert (it2 == it); + assert (*it == 0x10346); + assert (*(++it) == 0x65e5); + assert ((*it++) == 0x65e5); + assert (*it == 0x0448); + assert (it != it2); + utf8::iterator endit (threechars + 9, threechars, threechars + 9); + assert (++it == endit); + assert (*(--it) == 0x0448); + assert ((*it--) == 0x0448); + assert (*it == 0x65e5); + assert (--it == utf8::iterator(threechars, threechars, threechars + 9)); + assert (*it == 0x10346); + + ////////////////////////////////////////////////////////// + //// Unchecked variants + ////////////////////////////////////////////////////////// + + //append + memset(u, 0, 5); + append(0x0448, u); + assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); + + append(0x65e5, u); + assert (u[0] == 0xe6 && u[1] == 0x97 && u[2] == 0xa5 && u[3] == 0 && u[4] == 0); + + append(0x10346, u); + assert (u[0] == 0xf0 && u[1] == 0x90 && u[2] == 0x8d && u[3] == 0x86 && u[4] == 0); + + //next + w = twochars; + cp = unchecked::next(w); + assert (cp == 0x65e5); + assert (w == twochars + 3); + + w = threechars; + cp = unchecked::next(w); + assert (cp == 0x10346); + assert (w == threechars + 4); + cp = unchecked::next(w); + assert (cp == 0x65e5); + assert (w == threechars + 7); + cp = unchecked::next(w); + assert (cp == 0x0448); + assert (w == threechars + 9); + + //peek_next + cp = unchecked::peek_next(cw); + assert (cp == 0x65e5); + assert (cw == twochars); + + + //previous (calls prior internally) + + w = twochars + 3; + cp = unchecked::previous (w); + assert (cp == 0x65e5); + assert (w == twochars); + + w = threechars + 9; + cp = unchecked::previous(w); + assert (cp == 0x0448); + assert (w == threechars + 7); + cp = unchecked::previous(w); + assert (cp == 0x65e5); + assert (w == threechars + 4); + cp = unchecked::previous(w); + assert (cp == 0x10346); + assert (w == threechars); + + // advance + w = twochars; + unchecked::advance (w, 2); + assert (w == twochars + 5); + + // distance + dist = unchecked::distance(twochars, twochars + 5); + assert (dist == 2); + + // utf32to8 + utf8result.clear(); + unchecked::utf32to8(utf32string, utf32string + 3, back_inserter(utf8result)); + assert (utf8result.size() == 9); + // try it with the return value; + utf8_end = utf32to8(utf32string, utf32string + 3, &utf8result[0]); + assert(utf8_end == &utf8result[0] + 9); + + //utf8to32 + utf32result.clear(); + unchecked::utf8to32(twochars, twochars + 5, back_inserter(utf32result)); + assert (utf32result.size() == 2); + // try it with the return value; + utf32_end = utf8to32(twochars, twochars + 5, &utf32result[0]); + assert (utf32_end == &utf32result[0] + 2); + + //utf16to8 + utf8result.clear(); + unchecked::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); + assert (utf8result.size() == 10); + // try it with the return value; + utf8_end = utf16to8 (utf16string, utf16string + 5, &utf8result[0]); + assert (utf8_end == &utf8result[0] + 10); + + //utf8to16 + utf16result.clear(); + unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); + assert (utf16result.size() == 4); + assert (utf16result[2] == 0xd834); + assert (utf16result[3] == 0xdd1e); + // try it with the return value; + utf16_end = utf8to16 (utf8_with_surrogates, utf8_with_surrogates + 9, &utf16result[0]); + assert (utf16_end == &utf16result[0] + 4); + + // iterator + utf8::unchecked::iterator un_it(threechars); + utf8::unchecked::iterator un_it2 = un_it; + assert (un_it2 == un_it); + assert (*un_it == 0x10346); + assert (*(++un_it) == 0x65e5); + assert ((*un_it++) == 0x65e5); + assert (un_it != un_it2); + assert (*un_it == 0x0448); + utf8::unchecked::iterator un_endit (threechars + 9); + assert (++un_it == un_endit); + assert (*(--un_it) == 0x0448); + assert ((*un_it--) == 0x0448); + assert (*un_it == 0x65e5); + assert (--un_it == utf8::unchecked::iterator(threechars)); + assert (*un_it == 0x10346); +} + + diff --git a/test_drivers/utf8reader/Makefile b/test_drivers/utf8reader/Makefile new file mode 100644 index 000000000..29a9aa886 --- /dev/null +++ b/test_drivers/utf8reader/Makefile @@ -0,0 +1,5 @@ +CC = g++ +CFLAGS = -g -Wall -pedantic + +utf8readertest: utf8reader.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h + $(CC) $(CFLAGS) utf8reader.cpp -o utf8reader diff --git a/test_drivers/utf8reader/utf8reader.cpp b/test_drivers/utf8reader/utf8reader.cpp new file mode 100644 index 000000000..c88a5ee1b --- /dev/null +++ b/test_drivers/utf8reader/utf8reader.cpp @@ -0,0 +1,160 @@ +#include "../../source/utf8.h" +using namespace utf8; + +#include +#include +#include +#include +using namespace std; + +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "\nUsage: utfreader filename\n"; + return 0; + } + const char* TEST_FILE_PATH = argv[1]; + // Open the test file + ifstream fs8(TEST_FILE_PATH); + if (!fs8.is_open()) { + cout << "Could not open " << TEST_FILE_PATH << endl; + return 0; + } + + // Read it line by line + unsigned int line_count = 0; + char byte; + while (!fs8.eof()) { + string line; + while ((byte = static_cast(fs8.get())) != '\n' && !fs8.eof()) + line.push_back(byte); + + line_count++; + // Play around with each line and convert it to utf16 + string::iterator line_start = line.begin(); + string::iterator line_end = line.end(); + line_end = find_invalid(line_start, line_end); + if (line_end != line.end()) + cout << "Line " << line_count << ": Invalid utf-8 at byte " << int(line.end() - line_end) << '\n'; + + // Convert it to utf-16 and write to the file + vector utf16_line; + utf8to16(line_start, line_end, back_inserter(utf16_line)); + + // Back to utf-8 and compare it to the original line. + string back_to_utf8; + utf16to8(utf16_line.begin(), utf16_line.end(), back_inserter(back_to_utf8)); + if (back_to_utf8.compare(string(line_start, line_end)) != 0) + cout << "Line " << line_count << ": Conversion to UTF-16 and back failed" << '\n'; + + // Now, convert it to utf-32, back to utf-8 and compare + vector utf32_line; + utf8to32(line_start, line_end, back_inserter(utf32_line)); + back_to_utf8.clear(); + utf32to8(utf32_line.begin(), utf32_line.end(), back_inserter(back_to_utf8)); + if (back_to_utf8.compare(string(line_start, line_end)) != 0) + cout << "Line " << line_count << ": Conversion to UTF-32 and back failed" << '\n'; + + // Now, iterate and back + unsigned char_count = 0; + string::iterator it = line_start; + while (it != line_end) { + unsigned int next_cp = peek_next(it, line_end); + if (next(it, line_end) != next_cp) + cout << "Line " << line_count << ": Error: peek_next gave a different result than next" << '\n'; + char_count++; + } + if (char_count != utf32_line.size()) + cout << "Line " << line_count << ": Error in iterating with next - wrong number of characters" << '\n'; + + string::iterator adv_it = line_start; + utf8::advance(adv_it, char_count, line_end); + if (adv_it != line_end) + cout << "Line " << line_count << ": Error in advance function" << '\n'; + + if (string::size_type(utf8::distance(line_start, line_end)) != char_count) + cout << "Line " << line_count << ": Error in distance function" << '\n'; + + while (it != line_start) { + previous(it, line.rend().base()); + char_count--; + } + if (char_count != 0) + cout << "Line " << line_count << ": Error in iterating with previous - wrong number of characters" << '\n'; + + // Try utf8::iterator + utf8::iterator u8it(line_start, line_start, line_end); + if (!utf32_line.empty() && *u8it != utf32_line.at(0)) + cout << "Line " << line_count << ": Error in utf::iterator * operator" << '\n'; + if (std::distance(u8it, utf8::iterator(line_end, line_start, line_end)) != static_cast(utf32_line.size())) + cout << "Line " << line_count << ": Error in using utf::iterator with std::distance - wrong number of characters" << '\n'; + + std::advance(u8it, utf32_line.size()); + if (u8it != utf8::iterator(line_end, line_start, line_end)) + cout << "Line " << line_count << ": Error in using utf::iterator with std::advance" << '\n'; + + + //======================== Now, the unchecked versions ====================== + // Convert it to utf-16 and compare to the checked version + vector utf16_line_unchecked; + unchecked::utf8to16(line_start, line_end, back_inserter(utf16_line_unchecked)); + + if (utf16_line != utf16_line_unchecked) + cout << "Line " << line_count << ": Error in unchecked::utf8to16" << '\n'; + + // Back to utf-8 and compare it to the original line. + back_to_utf8.clear(); + unchecked::utf16to8(utf16_line_unchecked.begin(), utf16_line_unchecked.end(), back_inserter(back_to_utf8)); + if (back_to_utf8.compare(string(line_start, line_end)) != 0) + cout << "Line " << line_count << ": Unchecked conversion to UTF-16 and back failed" << '\n'; + + // Now, convert it to utf-32, back to utf-8 and compare + vector utf32_line_unchecked; + unchecked::utf8to32(line_start, line_end, back_inserter(utf32_line_unchecked)); + if (utf32_line != utf32_line_unchecked) + cout << "Line " << line_count << ": Error in unchecked::utf8to32" << '\n'; + + back_to_utf8.clear(); + unchecked::utf32to8(utf32_line.begin(), utf32_line.end(), back_inserter(back_to_utf8)); + if (back_to_utf8.compare(string(line_start, line_end)) != 0) + cout << "Line " << line_count << ": Unchecked conversion to UTF-32 and back failed" << '\n'; + + // Now, iterate and back + char_count = 0; + it = line_start; + while (it != line_end) { + unsigned int next_cp = unchecked::peek_next(it); + if (unchecked::next(it) != next_cp) + cout << "Line " << line_count << ": Error: unchecked::peek_next gave a different result than unchecked::next" << '\n';; + char_count++; + } + if (char_count != utf32_line.size()) + cout << "Line " << line_count << ": Error in iterating with unchecked::next - wrong number of characters" << '\n'; + + adv_it = line_start; + utf8::unchecked::advance(adv_it, char_count); + if (adv_it != line_end) + cout << "Line " << line_count << ": Error in unchecked::advance function" << '\n'; + + if (string::size_type(utf8::unchecked::distance(line_start, line_end)) != char_count) + cout << "Line " << line_count << ": Error in unchecked::distance function" << '\n'; + + while (it != line_start) { + unchecked::previous(it); + char_count--; + } + if (char_count != 0) + cout << "Line " << line_count << ": Error in iterating with unchecked::previous - wrong number of characters" << '\n'; + + // Try utf8::unchecked::iterator + utf8::unchecked::iterator un_u8it(line_start); + if (!utf32_line.empty() && *un_u8it != utf32_line.at(0)) + cout << "Line " << line_count << ": Error in utf::unchecked::iterator * operator" << '\n'; + if (std::distance(un_u8it, utf8::unchecked::iterator(line_end)) != static_cast(utf32_line.size())) + cout << "Line " << line_count << ": Error in using utf::unchecked::iterator with std::distance - wrong number of characters" << '\n'; + + std::advance(un_u8it, utf32_line.size()); + if (un_u8it != utf8::unchecked::iterator(line_end)) + cout << "Line " << line_count << ": Error in using utf::unchecked::iterator with std::advance" << '\n'; + } +} From 735b8b73738054e234177c534d92b6c6f32c5a1e Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 12 Sep 2015 20:41:43 -0400 Subject: [PATCH 0003/1162] Fixing Readme.md --- README.md | 961 ++++++++++++++++++++++++++---------------------------- 1 file changed, 460 insertions(+), 501 deletions(-) diff --git a/README.md b/README.md index 9585b2fe0..108216080 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,5 @@ # UTF8-CPP: UTF-8 with C++ in a Portable Way -[The Sourceforge project page](https://sourceforge.net/projects/utfcpp) - -
- -## Table of Contents - -* [Introduction](#introduction) -* [Examples of Use](#examples) - * [Introductionary Sample](#introsample) - * [Checking if a file contains valid UTF-8 text](#validfile) - * [Ensure that a string contains valid UTF-8 text](#fixinvalid) -* [Reference](#reference) - * [Functions From utf8 Namespace](#funutf8) - * [Types From utf8 Namespace](#typesutf8) - * [Functions From utf8::unchecked Namespace](#fununchecked) - * [Types From utf8::unchecked Namespace](#typesunchecked) -* [Points of Interest](#points) -* [Links](#links) - -
## Introduction @@ -35,59 +15,60 @@ The purpose of this article is not to offer an introduction to Unicode in genera To illustrate the use of the library, let's start with a small but complete program that opens a file containing UTF-8 encoded text, reads it line by line, checks each line for invalid UTF-8 byte sequences, and converts it to UTF-16 encoding and back to UTF-8: -
#include 
-#include 
-#include 
-#include 
-#include "utf8.h"
-using namespace std;
-int main(int argc, char** argv)
+```
+#include 
+#include 
+#include 
+#include 
+#include "utf8.h"
+using namespace std;
+int main(int argc, char** argv)
 {
-    if (argc != 2) {
-        cout << "\nUsage: docsample filename\n";
-        return 0;
+    if (argc != 2) {
+        cout << "\nUsage: docsample filename\n";
+        return 0;
     }
 
-    const char* test_file_path = argv[1];
-    // Open the test file (contains UTF-8 encoded text)
+    const char* test_file_path = argv[1];
+    // Open the test file (contains UTF-8 encoded text)
     ifstream fs8(test_file_path);
-    if (!fs8.is_open()) {
-    cout << "Could not open " << test_file_path << endl;
-    return 0;
+    if (!fs8.is_open()) {
+    cout << "Could not open " << test_file_path << endl;
+    return 0;
     }
 
-    unsigned line_count = 1;
+    unsigned line_count = 1;
     string line;
-    // Play with all the lines in the file
-    while (getline(fs8, line)) {
-       // check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)
+    // Play with all the lines in the file
+    while (getline(fs8, line)) {
+       // check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)
         string::iterator end_it = utf8::find_invalid(line.begin(), line.end());
-        if (end_it != line.end()) {
-            cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n";
-            cout << "This part is fine: " << string(line.begin(), end_it) << "\n";
+        if (end_it != line.end()) {
+            cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n";
+            cout << "This part is fine: " << string(line.begin(), end_it) << "\n";
         }
 
-        // Get the line length (at least for the valid part)
-        int length = utf8::distance(line.begin(), end_it);
-        cout << "Length of line " << line_count << " is " << length <<  "\n";
+        // Get the line length (at least for the valid part)
+        int length = utf8::distance(line.begin(), end_it);
+        cout << "Length of line " << line_count << " is " << length <<  "\n";
 
-        // Convert it to utf-16
+        // Convert it to utf-16
         vector utf16line;
         utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line));
 
-        // And back to utf-8
+        // And back to utf-8
         string utf8line; 
         utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line));
 
-        // Confirm that the conversion went OK:
-        if (utf8line != string(line.begin(), end_it))
-            cout << "Error in UTF-16 conversion at line: " << line_count << "\n";        
+        // Confirm that the conversion went OK:
+        if (utf8line != string(line.begin(), end_it))
+            cout << "Error in UTF-16 conversion at line: " << line_count << "\n";        
 
         line_count++;
     }
-    return 0;
+    return 0;
 }
-
+``` In the previous code sample, for each line we performed a detection of invalid UTF-8 sequences with `find_invalid`; the number of characters (more precisely - the number of Unicode code points, including the end of line and even BOM if there is one) in each line was determined with a use of `utf8::distance`; finally, we have converted each line to UTF-16 encoding with `utf8to16` and back to UTF-8 with `utf16to8`. @@ -95,38 +76,40 @@ In the previous code sample, for each line we performed a detection of invalid U Here is a function that checks whether the content of a file is valid UTF-8 encoded text without reading the content into the memory: -
    
-bool valid_utf8_file(iconst char* file_name)
+```
+bool valid_utf8_file(const char* file_name)
 {
     ifstream ifs(file_name);
-    if (!ifs)
-        return false; // even better, throw here
+    if (!ifs)
+        return false; // even better, throw here
 
-    istreambuf_iterator<char> it(ifs.rdbuf());
-    istreambuf_iterator<char> eos;
+    istreambuf_iterator it(ifs.rdbuf());
+    istreambuf_iterator eos;
 
-    return utf8::is_valid(it, eos);
+    return utf8::is_valid(it, eos);
 }
-
+``` Because the function `utf8::is_valid()` works with input iterators, we were able to pass an `istreambuf_iterator` to it and read the content of the file directly without loading it to the memory first. Note that other functions that take input iterator arguments can be used in a similar way. For instance, to read the content of a UTF-8 encoded text file and convert the text to UTF-16, just do something like: -
    utf8::utf8to16(it, eos, back_inserter(u16string));
-
+``` + utf8::utf8to16(it, eos, back_inserter(u16string)); +``` ### Ensure that a string contains valid UTF-8 text If we have some text that "probably" contains UTF-8 encoded text and we want to replace any invalid UTF-8 sequence with a replacement character, something like the following function may be used: -
void fix_utf8_string(std::string& str)
+```
+void fix_utf8_string(std::string& str)
 {
     std::string temp;
     utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
     str = temp;
 }
-
+``` The function will replace any invalid UTF-8 sequence with a Unicode replacement character. There is an overloaded function that enables the caller to supply their own replacement character. @@ -140,22 +123,23 @@ Available in version 1.0 and later. Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. -
template <typename octet_iterator>
+```
+template 
 octet_iterator append(uint32_t cp, octet_iterator result);
-
-
+``` `octet_iterator`: an output iterator. - `cp`: a 32 bit integer representing a code point to append to the sequence. - `result`: an output iterator to the place in the sequence where to append the code point. - Return value: an iterator pointing to the place after the newly appended sequence. +`cp`: a 32 bit integer representing a code point to append to the sequence. +`result`: an output iterator to the place in the sequence where to append the code point. +Return value: an iterator pointing to the place after the newly appended sequence. Example of use: -
unsigned char u[5] = {0,0,0,0,0};
-unsigned char* end = append(0x0448, u);
-assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0);
-
+``` +unsigned char u[5] = {0,0,0,0,0}; +unsigned char* end = append(0x0448, u); +assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); +``` Note that `append` does not allocate any memory - it is the burden of the caller to make sure there is enough memory allocated for the operation. To make things more interesting, `append` can add anywhere between 1 and 4 octets to the sequence. In practice, you would most often want to use `std::back_inserter` to ensure that the necessary memory is allocated. @@ -167,24 +151,25 @@ Available in version 1.0 and later. Given the iterator to the beginning of the UTF-8 sequence, it returns the code point and moves the iterator to the next position. -
template <typename octet_iterator> 
+```
+template  
 uint32_t next(octet_iterator& it, octet_iterator end);
-
-
+``` `octet_iterator`: an input iterator. - `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the beginning of the next code point. - `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. - Return value: the 32 bit representation of the processed UTF-8 code point. +`it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the beginning of the next code point. +`end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. +Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars;
-int cp = next(w, twochars + 6);
-assert (cp == 0x65e5);
-assert (w == twochars + 3);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +char* w = twochars; +int cp = next(w, twochars + 6); +assert (cp == 0x65e5); +assert (w == twochars + 3); +``` This function is typically used to iterate through a UTF-8 encoded string. @@ -196,24 +181,26 @@ Available in version 2.1 and later. Given the iterator to the beginning of the UTF-8 sequence, it returns the code point for the following sequence without changing the value of the iterator. -
template <typename octet_iterator> 
+```
+template  
 uint32_t peek_next(octet_iterator it, octet_iterator end);
+```
 
-
`octet_iterator`: an input iterator. - `it`: an iterator pointing to the beginning of an UTF-8 encoded code point. - `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. - Return value: the 32 bit representation of the processed UTF-8 code point. +`it`: an iterator pointing to the beginning of an UTF-8 encoded code point. +`end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. +Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars;
-int cp = peek_next(w, twochars + 6);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = peek_next(w, twochars + 6);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. @@ -223,24 +210,25 @@ Available in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 sequence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -
template <typename octet_iterator> 
+```
+template  
 uint32_t prior(octet_iterator& it, octet_iterator start);
-
-
+``` `octet_iterator`: a bidirectional iterator. - `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. - `start`: an iterator to the beginning of the sequence where the search for the beginning of a code point is performed. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. - Return value: the 32 bit representation of the previous code point. +`it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. +`start`: an iterator to the beginning of the sequence where the search for the beginning of a code point is performed. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. + Return value: the 32 bit representation of the previous code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-unsigned char* w = twochars + 3;
-int cp = prior (w, twochars);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+unsigned char* w = twochars + 3;
+int cp = prior (w, twochars);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` This function has two purposes: one is two iterate backwards through a UTF-8 encoded string. Note that it is usually a better idea to iterate forward instead, since `utf8::next` is faster. The second purpose is to find a beginning of a UTF-8 sequence if we have a random position within a string. Note that in that case `utf8::prior` may not detect an invalid UTF-8 sequence in some scenarios: for instance if there are superfluous trail octets, it will just skip them. @@ -256,24 +244,26 @@ Deprecated in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -
template <typename octet_iterator> 
+```
+template  
 uint32_t previous(octet_iterator& it, octet_iterator pass_start);
-
-
+``` `octet_iterator`: a random access iterator. - `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. - `pass_start`: an iterator to the point in the sequence where the search for the beginning of a code point is aborted if no result was reached. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. - Return value: the 32 bit representation of the previous code point. +`it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. +`pass_start`: an iterator to the point in the sequence where the search for the beginning of a code point is aborted if no result was reached. It is a safety measure to prevent passing the beginning of the string in the search for a UTF-8 lead octet. +Return value: the 32 bit representation of the previous code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-unsigned char* w = twochars + 3;
-int cp = previous (w, twochars - 1);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+unsigned char* w = twochars + 3;
+int cp = previous (w, twochars - 1);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` + `utf8::previous` is deprecated, and `utf8::prior` should be used instead, although the existing code can continue using this function. The problem is the parameter `pass_start` that points to the position just before the beginning of the sequence. Standard containers don't have the concept of "pass start" and the function can not be used with their iterators. @@ -282,29 +272,29 @@ assert (w == twochars); In case `pass_start` is reached before a UTF-8 lead octet is hit, or if an invalid UTF-8 sequence is started by the lead octet, an `invalid_utf8` exception is thrown #### utf8::advance - Available in version 1.0 and later. Advances an iterator by the specified number of code points within an UTF-8 sequence. -
template <typename octet_iterator, typename distance_type> 
-void advance (octet_iterator& it, distance_type n, octet_iterator end);
-
-
+``` +template +void advance (octet_iterator& it, distance_type n, octet_iterator end); +``` `octet_iterator`: an input iterator. - `distance_type`: an integral type convertible to `octet_iterator`'s difference type. - `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the nth following code point. - `n`: a positive integer that shows how many code points we want to advance. - `end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. +`distance_type`: an integral type convertible to `octet_iterator`'s difference type. +`it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the nth following code point. +`n`: a positive integer that shows how many code points we want to advance. +`end`: end of the UTF-8 sequence to be processed. If `it` gets equal to `end` during the extraction of a code point, an `utf8::not_enough_room` exception is thrown. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-unsigned char* w = twochars;
-advance (w, 2, twochars + 6);
-assert (w == twochars + 5);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +unsigned char* w = twochars; +advance (w, 2, twochars + 6); +assert (w == twochars + 5); +``` This function works only "forward". In case of a negative `n`, there is no effect. @@ -316,22 +306,23 @@ Available in version 1.0 and later. Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. -
template <typename octet_iterator> 
-typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last);
-
-
+``` +template +typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last); +``` `octet_iterator`: an input iterator. - `first`: an iterator to a beginning of a UTF-8 encoded code point. - `last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. - Return value the distance between the iterators, in code points. +`first`: an iterator to a beginning of a UTF-8 encoded code point. +`last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. + Return value the distance between the iterators, in code points. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-size_t dist = utf8::distance(twochars, twochars + 5);
-assert (dist == 2);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +size_t dist = utf8::distance(twochars, twochars + 5); +assert (dist == 2); +``` This function is used to find the length (in code points) of a UTF-8 encoded string. The reason it is called _distance_, rather than, say, _length_ is mainly because developers are used that _length_ is an O(1) function. Computing the length of an UTF-8 string is a linear operation, and it looked better to model it after `std::distance` algorithm. @@ -343,25 +334,26 @@ Available in version 1.0 and later. Converts a UTF-16 encoded string to UTF-8. -
template <typename u16bit_iterator, typename octet_iterator>
+```
+template 
 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
-
-
+``` `u16bit_iterator`: an input iterator. - `octet_iterator`: an output iterator. - `start`: an iterator pointing to the beginning of the UTF-16 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. - `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-8 string. +`octet_iterator`: an output iterator. +`start`: an iterator pointing to the beginning of the UTF-16 encoded string to convert. +`end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. +`result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
-vector<unsigned char> utf8result;
-utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
-assert (utf8result.size() == 10);    
-
+``` +unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; +vector utf8result; +utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); +assert (utf8result.size() == 10); +``` In case of invalid UTF-16 sequence, a `utf8::invalid_utf16` exception is thrown. @@ -371,26 +363,27 @@ Available in version 1.0 and later. Converts an UTF-8 encoded string to UTF-16 -
template <typename u16bit_iterator, typename octet_iterator>
+```
+template 
 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
-
-
+``` `octet_iterator`: an input iterator. - `u16bit_iterator`: an output iterator. - `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. < br /> `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. - `result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-16 string. +`u16bit_iterator`: an output iterator. +`start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. < br /> `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. +`result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-16 string. Example of use: -
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
-vector <unsigned short> utf16result;
-utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result));
-assert (utf16result.size() == 4);
-assert (utf16result[2] == 0xd834);
-assert (utf16result[3] == 0xdd1e);
-
+``` +char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"; +vector utf16result; +utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); +assert (utf16result.size() == 4); +assert (utf16result[2] == 0xd834); +assert (utf16result[3] == 0xdd1e); +``` In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. If `end` does not point to the past-of-end of a UTF-8 seqence, a `utf8::not_enough_room` exception is thrown. @@ -400,25 +393,26 @@ Available in version 1.0 and later. Converts a UTF-32 encoded string to UTF-8. -
template <typename octet_iterator, typename u32bit_iterator>
+```
+template 
 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
-
-
+``` `octet_iterator`: an output iterator. - `u32bit_iterator`: an input iterator. - `start`: an iterator pointing to the beginning of the UTF-32 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. - `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-8 string. +`u32bit_iterator`: an input iterator. +`start`: an iterator pointing to the beginning of the UTF-32 encoded string to convert. +`end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. +`result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -
int utf32string[] = {0x448, 0x65E5, 0x10346, 0};
-vector<unsigned char> utf8result;
-utf32to8(utf32string, utf32string + 3, back_inserter(utf8result));
-assert (utf8result.size() == 9);
-
+``` +int utf32string[] = {0x448, 0x65E5, 0x10346, 0}; +vector utf8result; +utf32to8(utf32string, utf32string + 3, back_inserter(utf8result)); +assert (utf8result.size() == 9); +``` In case of invalid UTF-32 string, a `utf8::invalid_code_point` exception is thrown. @@ -428,25 +422,26 @@ Available in version 1.0 and later. Converts a UTF-8 encoded string to UTF-32. -
template <typename octet_iterator, typename u32bit_iterator>
+```
+template 
 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
-
-
+``` `octet_iterator`: an input iterator. - `u32bit_iterator`: an output iterator. - `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. - `result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-32 string. +`u32bit_iterator`: an output iterator. +`start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. +`end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. +`result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-32 string. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-vector<int> utf32result;
-utf8to32(twochars, twochars + 5, back_inserter(utf32result));
-assert (utf32result.size() == 2);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +vector utf32result; +utf8to32(twochars, twochars + 5, back_inserter(utf32result)); +assert (utf32result.size() == 2); +``` In case of an invalid UTF-8 seqence, a `utf8::invalid_utf8` exception is thrown. If `end` does not point to the past-of-end of a UTF-8 seqence, a `utf8::not_enough_room` exception is thrown. @@ -456,21 +451,23 @@ Available in version 1.0 and later. Detects an invalid sequence within a UTF-8 string. -
template <typename octet_iterator> 
+```
+template  
 octet_iterator find_invalid(octet_iterator start, octet_iterator end);
-
+``` `octet_iterator`: an input iterator. - `start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. - `end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. - Return value: an iterator pointing to the first invalid octet in the UTF-8 string. In case none were found, equals `end`. +`start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. +`end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. +Return value: an iterator pointing to the first invalid octet in the UTF-8 string. In case none were found, equals `end`. Example of use: -
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
-char* invalid = find_invalid(utf_invalid, utf_invalid + 6);
-assert (invalid == utf_invalid + 5);
-
+``` +char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa"; +char* invalid = find_invalid(utf_invalid, utf_invalid + 6); +assert (invalid == utf_invalid + 5); +``` This function is typically used to make sure a UTF-8 string is valid before processing it with other functions. It is especially important to call it if before doing any of the _unchecked_ operations on it. @@ -480,22 +477,23 @@ Available in version 1.0 and later. Checks whether a sequence of octets is a valid UTF-8 string. -
template <typename octet_iterator> 
-bool is_valid(octet_iterator start, octet_iterator end);
-
-
+``` +template +bool is_valid(octet_iterator start, octet_iterator end); +``` `octet_iterator`: an input iterator. - `start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. - `end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. - Return value: `true` if the sequence is a valid UTF-8 string; `false` if not. +`start`: an iterator pointing to the beginning of the UTF-8 string to test for validity. +`end`: an iterator pointing to pass-the-end of the UTF-8 string to test for validity. +Return value: `true` if the sequence is a valid UTF-8 string; `false` if not. Example of use: -
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
-bool bvalid = is_valid(utf_invalid, utf_invalid + 6);
+```
+char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
+bool bvalid = is_valid(utf_invalid, utf_invalid + 6);
 assert (bvalid == false);
-
+``` `is_valid` is a shorthand for `find_invalid(start, end) == end;`. You may want to use it to make sure that a byte seqence is a valid UTF-8 string without the need to know where it fails if it is not valid. @@ -505,31 +503,32 @@ Available in version 2.0 and later. Replaces all invalid UTF-8 sequences within a string with a replacement marker. -
template <typename octet_iterator, typename output_iterator>
+```
+template 
 output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement);
-template <typename octet_iterator, typename output_iterator>
+template 
 output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out);
-
-
+``` `octet_iterator`: an input iterator. - `output_iterator`: an output iterator. - `start`: an iterator pointing to the beginning of the UTF-8 string to look for invalid UTF-8 sequences. - `end`: an iterator pointing to pass-the-end of the UTF-8 string to look for invalid UTF-8 sequences. - `out`: An output iterator to the range where the result of replacement is stored. - `replacement`: A Unicode code point for the replacement marker. The version without this parameter assumes the value `0xfffd` - Return value: An iterator pointing to the place after the UTF-8 string with replaced invalid sequences. +`output_iterator`: an output iterator. +`start`: an iterator pointing to the beginning of the UTF-8 string to look for invalid UTF-8 sequences. +`end`: an iterator pointing to pass-the-end of the UTF-8 string to look for invalid UTF-8 sequences. +`out`: An output iterator to the range where the result of replacement is stored. +`replacement`: A Unicode code point for the replacement marker. The version without this parameter assumes the value `0xfffd` +Return value: An iterator pointing to the place after the UTF-8 string with replaced invalid sequences. Example of use: -
char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z";
-vector<char> replace_invalid_result;
-replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), '?');
+```
+char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z";
+vector replace_invalid_result;
+replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), '?');
 bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
 assert (bvalid);
-char* fixed_invalid_sequence = "a????z";
+char* fixed_invalid_sequence = "a????z";
 assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence));
-
+``` `replace_invalid` does not perform in-place replacement of invalid sequences. Rather, it produces a copy of the original string with the invalid sequences replaced with a replacement marker. Therefore, `out` must not be in the `[start, end]` range. @@ -541,21 +540,23 @@ Available in version 2.3 and later. Relaces deprecated `is_bom()` function. Checks whether an octet sequence starts with a UTF-8 byte order mark (BOM) -
template <typename octet_iterator> 
-bool starts_with_bom (octet_iterator it, octet_iterator end);
-
+``` +template +bool starts_with_bom (octet_iterator it, octet_iterator end); +``` `octet_iterator`: an input iterator. - `it`: beginning of the octet sequence to check - `end`: pass-end of the sequence to check - Return value: `true` if the sequence starts with a UTF-8 byte order mark; `false` if not. +`it`: beginning of the octet sequence to check +`end`: pass-end of the sequence to check +Return value: `true` if the sequence starts with a UTF-8 byte order mark; `false` if not. Example of use: -
unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf};
-bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark));
-assert (bbom == true);
-
+``` +unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf}; +bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark)); +assert (bbom == true); +``` The typical use of this function is to check the first three bytes of a file. If they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 encoded text. @@ -565,20 +566,22 @@ Available in version 1.0 and later. Deprecated in version 2.3\. `starts_with_bom Checks whether a sequence of three octets is a UTF-8 byte order mark (BOM) -
template <typename octet_iterator> 
-bool is_bom (octet_iterator it);  // Deprecated
-
+``` +template +bool is_bom (octet_iterator it); // Deprecated +``` `octet_iterator`: an input iterator. - `it`: beginning of the 3-octet sequence to check - Return value: `true` if the sequence is UTF-8 byte order mark; `false` if not. +`it`: beginning of the 3-octet sequence to check +Return value: `true` if the sequence is UTF-8 byte order mark; `false` if not. Example of use: -
unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf};
-bool bbom = is_bom(byte_order_mark);
-assert (bbom == true);
-
+``` +unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf}; +bool bbom = is_bom(byte_order_mark); +assert (bbom == true); +``` The typical use of this function is to check the first three bytes of a file. If they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 encoded text. @@ -592,18 +595,20 @@ Available in version 2.3 and later. Base class for the exceptions thrown by UTF CPP library functions. -
class exception : public std::exception {};
-
+``` +class exception : public std::exception {}; +``` Example of use: -
try {
+```
+try {
   code_that_uses_utf_cpp_library();
 }
-catch(const utf8::exception& utfcpp_ex) {
+catch(const utf8::exception& utfcpp_ex) {
   cerr << utfcpp_ex.what();
 }
-
+``` #### utf8::invalid_code_point @@ -611,12 +616,12 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `advance` and `next` if an UTF-8 sequence represents and invalid code point. -
class invalid_code_point : public exception {
-public: 
-    uint32_t code_point() const;
+```
+class invalid_code_point : public exception {
+public: 
+    uint32_t code_point() const;
 };
-
-
+``` Member function `code_point()` can be used to determine the invalid code point that caused the exception to be thrown. @@ -626,11 +631,12 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `next` and `prior` if an invalid UTF-8 sequence is detected during decoding. -
class invalid_utf8 : public exception {
-public: 
-    uint8_t utf8_octet() const;
+```
+class invalid_utf8 : public exception {
+public: 
+    uint8_t utf8_octet() const;
 };
-
+``` Member function `utf8_octet()` can be used to determine the beginning of the byte sequence that caused the exception to be thrown. @@ -640,11 +646,12 @@ Available in version 1.0 and later. Thrown by UTF8 CPP function `utf16to8` if an invalid UTF-16 sequence is detected during decoding. -
class invalid_utf16 : public exception {
-public: 
-    uint16_t utf16_word() const;
+```
+class invalid_utf16 : public exception {
+public: 
+    uint16_t utf16_word() const;
 };
-
+``` Member function `utf16_word()` can be used to determine the UTF-16 code unit that caused the exception to be thrown. @@ -654,8 +661,9 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `next` if the end of the decoded UTF-8 sequence was reached before the code point was decoded. -
class not_enough_room : public exception {};
-
+``` +class not_enough_room : public exception {}; +``` #### utf8::iterator @@ -663,83 +671,53 @@ Available in version 2.0 and later. Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. -
template <typename octet_iterator>
-class iterator;
-
+``` +template +class iterator; +``` ##### Member functions -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
+`iterator();` the deafult constructor; the underlying octet_iterator is constructed with its default constructor. +`explicit iterator (const octet_iterator& octet_it, const octet_iterator& range_start, const octet_iterator& range_end);` a constructor that initializes the underlying octet_iterator with octet_it and sets the range in which the iterator is considered valid. +`octet_iterator base () const;` returns the underlying octet_iterator. +`uint32_t operator * () const;` decodes the utf-8 sequence the underlying octet_iterator is pointing to and returns the code point. +`bool operator == (const iterator& rhs) const;` returns `true` if the two underlaying iterators are equal. +`bool operator != (const iterator& rhs) const;` returns `true` if the two underlaying iterators are not equal. +`iterator& operator ++ ();` the prefix increment - moves the iterator to the next UTF-8 encoded code point. +`iterator operator ++ (int);` the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one. +`iterator& operator -- ();` the prefix decrement - moves the iterator to the previous UTF-8 encoded code point. +`iterator operator -- (int);` the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one. Example of use: -
char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
-utf8::iterator<char*> it(threechars, threechars, threechars + 9);
-utf8::iterator<char*> it2 = it;
+```
+char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
+utf8::iterator it(threechars, threechars, threechars + 9);
+utf8::iterator it2 = it;
 assert (it2 == it);
-assert (*it == 0x10346);
-assert (*(++it) == 0x65e5);
-assert ((*it++) == 0x65e5);
-assert (*it == 0x0448);
+assert (*it == 0x10346);
+assert (*(++it) == 0x65e5);
+assert ((*it++) == 0x65e5);
+assert (*it == 0x0448);
 assert (it != it2);
-utf8::iterator<char*> endit (threechars + 9, threechars, threechars + 9);  
+utf8::iterator endit (threechars + 9, threechars, threechars + 9);  
 assert (++it == endit);
-assert (*(--it) == 0x0448);
-assert ((*it--) == 0x0448);
-assert (*it == 0x65e5);
-assert (--it == utf8::iterator<char*>(threechars, threechars, threechars + 9));
-assert (*it == 0x10346);
-
+assert (*(--it) == 0x0448); +assert ((*it--) == 0x0448); +assert (*it == 0x65e5); +assert (--it == utf8::iterator(threechars, threechars, threechars + 9)); +assert (*it == 0x10346); +``` The purpose of `utf8::iterator` adapter is to enable easy iteration as well as the use of STL algorithms with UTF-8 encoded strings. Increment and decrement operators are implemented in terms of `utf8::next()` and `utf8::prior()` functions. Note that `utf8::iterator` adapter is a checked iterator. It operates on the range specified in the constructor; any attempt to go out of that range will result in an exception. Even the comparison operators require both iterator object to be constructed against the same range - otherwise an exception is thrown. Typically, the range will be determined by sequence container functions `begin` and `end`, i.e.: -
std::string s = "example";
+```
+std::string s = "example";
 utf8::iterator i (s.begin(), s.begin(), s.end());
-
+``` ### Functions From utf8::unchecked Namespace @@ -749,21 +727,22 @@ Available in version 1.0 and later. Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. -
template <typename octet_iterator>
+```
+template 
 octet_iterator append(uint32_t cp, octet_iterator result);
-
-
+``` `cp`: A 32 bit integer representing a code point to append to the sequence. - `result`: An output iterator to the place in the sequence where to append the code point. - Return value: An iterator pointing to the place after the newly appended sequence. +`result`: An output iterator to the place in the sequence where to append the code point. +Return value: An iterator pointing to the place after the newly appended sequence. Example of use: -
unsigned char u[5] = {0,0,0,0,0};
-unsigned char* end = unchecked::append(0x0448, u);
-assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0);
-
+``` +unsigned char u[5] = {0,0,0,0,0}; +unsigned char* end = unchecked::append(0x0448, u); +assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); +``` This is a faster but less safe version of `utf8::append`. It does not check for validity of the supplied code point, and may produce an invalid UTF-8 sequence. @@ -773,22 +752,23 @@ Available in version 1.0 and later. Given the iterator to the beginning of a UTF-8 sequence, it returns the code point and moves the iterator to the next position. -
template <typename octet_iterator>
+```
+template 
 uint32_t next(octet_iterator& it);
-
-
+``` `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the beginning of the next code point. - Return value: the 32 bit representation of the processed UTF-8 code point. + Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars;
-int cp = unchecked::next(w);
-assert (cp == 0x65e5);
-assert (w == twochars + 3);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +char* w = twochars; +int cp = unchecked::next(w); +assert (cp == 0x65e5); +assert (w == twochars + 3); +``` This is a faster but less safe version of `utf8::next`. It does not check for validity of the supplied UTF-8 sequence. @@ -798,22 +778,23 @@ Available in version 2.1 and later. Given the iterator to the beginning of a UTF-8 sequence, it returns the code point. -
template <typename octet_iterator>
+```
+template 
 uint32_t peek_next(octet_iterator it);
-
-
+``` `it`: an iterator pointing to the beginning of an UTF-8 encoded code point. - Return value: the 32 bit representation of the processed UTF-8 code point. +Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars;
-int cp = unchecked::peek_next(w);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars;
+int cp = unchecked::peek_next(w);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` This is a faster but less safe version of `utf8::peek_next`. It does not check for validity of the supplied UTF-8 sequence. @@ -823,22 +804,23 @@ Available in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -
template <typename octet_iterator>
+```
+template 
 uint32_t prior(octet_iterator& it);
-
-
+``` `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. - Return value: the 32 bit representation of the previous code point. + Return value: the 32 bit representation of the previous code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars + 3;
-int cp = unchecked::prior (w);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars + 3;
+int cp = unchecked::prior (w);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` This is a faster but less safe version of `utf8::prior`. It does not check for validity of the supplied UTF-8 sequence and offers no boundary checking. @@ -848,22 +830,23 @@ Deprecated in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -
template <typename octet_iterator>
+```
+template 
 uint32_t previous(octet_iterator& it);
-
-
+``` `it`: a reference pointing to an octet within a UTF-8 encoded string. After the function returns, it is decremented to point to the beginning of the previous code point. - Return value: the 32 bit representation of the previous code point. +Return value: the 32 bit representation of the previous code point. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars + 3;
-int cp = unchecked::previous (w);
-assert (cp == 0x65e5);
+```
+char* twochars = "\xe6\x97\xa5\xd1\x88";
+char* w = twochars + 3;
+int cp = unchecked::previous (w);
+assert (cp == 0x65e5);
 assert (w == twochars);
-
+``` The reason this function is deprecated is just the consistency with the "checked" versions, where `prior` should be used instead of `previous`. In fact, `unchecked::previous` behaves exactly the same as `unchecked::prior` @@ -875,21 +858,22 @@ Available in version 1.0 and later. Advances an iterator by the specified number of code points within an UTF-8 sequence. -
template <typename octet_iterator, typename distance_type>
-void advance (octet_iterator& it, distance_type n);
-
-
+``` +template +void advance (octet_iterator& it, distance_type n); +``` `it`: a reference to an iterator pointing to the beginning of an UTF-8 encoded code point. After the function returns, it is incremented to point to the nth following code point. - `n`: a positive integer that shows how many code points we want to advance. +`n`: a positive integer that shows how many code points we want to advance. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-char* w = twochars;
-unchecked::advance (w, 2);
-assert (w == twochars + 5);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +char* w = twochars; +unchecked::advance (w, 2); +assert (w == twochars + 5); +``` This function works only "forward". In case of a negative `n`, there is no effect. @@ -901,20 +885,22 @@ Available in version 1.0 and later. Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. -
template <typename octet_iterator>
-typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last);
-
+``` +template +typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last); +``` `first`: an iterator to a beginning of a UTF-8 encoded code point. - `last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. - Return value the distance between the iterators, in code points. +`last`: an iterator to a "post-end" of the last UTF-8 encoded code point in the sequence we are trying to determine the length. It can be the beginning of a new code point, or not. +Return value: the distance between the iterators, in code points. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-size_t dist = utf8::unchecked::distance(twochars, twochars + 5);
-assert (dist == 2);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +size_t dist = utf8::unchecked::distance(twochars, twochars + 5); +assert (dist == 2); +``` This is a faster but less safe version of `utf8::distance`. It does not check for validity of the supplied UTF-8 sequence. @@ -924,23 +910,24 @@ Available in version 1.0 and later. Converts a UTF-16 encoded string to UTF-8. -
template <typename u16bit_iterator, typename octet_iterator>
+```
+template 
 octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result);
-
-
+``` `start`: an iterator pointing to the beginning of the UTF-16 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. - `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-8 string. +`end`: an iterator pointing to pass-the-end of the UTF-16 encoded string to convert. +`result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
-vector<unsigned char> utf8result;
-unchecked::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
-assert (utf8result.size() == 10);    
-
+``` +unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; +vector utf8result; +unchecked::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); +assert (utf8result.size() == 10); +``` This is a faster but less safe version of `utf8::utf16to8`. It does not check for validity of the supplied UTF-16 sequence. @@ -950,24 +937,25 @@ Available in version 1.0 and later. Converts an UTF-8 encoded string to UTF-16 -
template <typename u16bit_iterator, typename octet_iterator>
+```
+template 
 u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result);
-
-
+``` `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. < br /> `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. - `result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-16 string. +`result`: an output iterator to the place in the UTF-16 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-16 string. Example of use: -
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
-vector <unsigned short> utf16result;
-unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result));
-assert (utf16result.size() == 4);
-assert (utf16result[2] == 0xd834);
-assert (utf16result[3] == 0xdd1e);
-
+``` +char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"; +vector utf16result; +unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); +assert (utf16result.size() == 4); +assert (utf16result[2] == 0xd834); +assert (utf16result[3] == 0xdd1e); +``` This is a faster but less safe version of `utf8::utf8to16`. It does not check for validity of the supplied UTF-8 sequence. @@ -977,23 +965,24 @@ Available in version 1.0 and later. Converts a UTF-32 encoded string to UTF-8. -
template <typename octet_iterator, typename u32bit_iterator>
+```
+template 
 octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result);
-
-
+``` `start`: an iterator pointing to the beginning of the UTF-32 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. - `result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-8 string. +`end`: an iterator pointing to pass-the-end of the UTF-32 encoded string to convert. +`result`: an output iterator to the place in the UTF-8 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -
int utf32string[] = {0x448, 0x65e5, 0x10346, 0};
-vector<unsigned char> utf8result;
-utf32to8(utf32string, utf32string + 3, back_inserter(utf8result));
-assert (utf8result.size() == 9);
-
+``` +int utf32string[] = {0x448, 0x65e5, 0x10346, 0}; +vector utf8result; +utf32to8(utf32string, utf32string + 3, back_inserter(utf8result)); +assert (utf8result.size() == 9); +``` This is a faster but less safe version of `utf8::utf32to8`. It does not check for validity of the supplied UTF-32 sequence. @@ -1003,23 +992,24 @@ Available in version 1.0 and later. Converts a UTF-8 encoded string to UTF-32. -
template <typename octet_iterator, typename u32bit_iterator>
+```
+template 
 u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result);
-
-
+``` `start`: an iterator pointing to the beginning of the UTF-8 encoded string to convert. - `end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. - `result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. - Return value: An iterator pointing to the place after the appended UTF-32 string. +`end`: an iterator pointing to pass-the-end of the UTF-8 encoded string to convert. +`result`: an output iterator to the place in the UTF-32 string where to append the result of conversion. +Return value: An iterator pointing to the place after the appended UTF-32 string. Example of use: -
char* twochars = "\xe6\x97\xa5\xd1\x88";
-vector<int> utf32result;
-unchecked::utf8to32(twochars, twochars + 5, back_inserter(utf32result));
-assert (utf32result.size() == 2);
-
+``` +char* twochars = "\xe6\x97\xa5\xd1\x88"; +vector utf32result; +unchecked::utf8to32(twochars, twochars + 5, back_inserter(utf32result)); +assert (utf32result.size() == 2); +``` This is a faster but less safe version of `utf8::utf8to32`. It does not check for validity of the supplied UTF-8 sequence. @@ -1031,75 +1021,44 @@ Available in version 2.0 and later. Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. -
template <typename octet_iterator>
-class iterator;
-
+``` +template +class iterator; +``` ##### Member functions -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
+`iterator();` the deafult constructor; the underlying octet_iterator is constructed with its default constructor. +`explicit iterator (const octet_iterator& octet_it);` a constructor that initializes the underlying octet_iterator with `octet_it` +`octet_iterator base () const;` returns the underlying octet_iterator. +`uint32_t operator * () const;` decodes the utf-8 sequence the underlying octet_iterator is pointing to and returns the code point. +`bool operator == (const iterator& rhs) const;` returns `true` if the two underlaying iterators are equal. +`bool operator != (const iterator& rhs) const;` returns `true` if the two underlaying iterators are not equal. +`iterator& operator ++ ();` the prefix increment - moves the iterator to the next UTF-8 encoded code point. +`iterator operator ++ (int);` the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one. +`iterator& operator -- ();` the prefix decrement - moves the iterator to the previous UTF-8 encoded code point. +`iterator operator -- (int);` the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one. Example of use: -
char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
-utf8::unchecked::iterator<char*> un_it(threechars);
-utf8::unchecked::iterator<char*> un_it2 = un_it;
+```
+char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
+utf8::unchecked::iterator un_it(threechars);
+utf8::unchecked::iterator un_it2 = un_it;
 assert (un_it2 == un_it);
-assert (*un_it == 0x10346);
-assert (*(++un_it) == 0x65e5);
-assert ((*un_it++) == 0x65e5);
-assert (*un_it == 0x0448);
+assert (*un_it == 0x10346);
+assert (*(++un_it) == 0x65e5);
+assert ((*un_it++) == 0x65e5);
+assert (*un_it == 0x0448);
 assert (un_it != un_it2);
-utf8::::unchecked::iterator<char*> un_endit (threechars + 9);  
+utf8::::unchecked::iterator un_endit (threechars + 9);  
 assert (++un_it == un_endit);
-assert (*(--un_it) == 0x0448);
-assert ((*un_it--) == 0x0448);
-assert (*un_it == 0x65e5);
-assert (--un_it == utf8::unchecked::iterator<char*>(threechars));
-assert (*un_it == 0x10346);
-
+assert (*(--un_it) == 0x0448); +assert ((*un_it--) == 0x0448); +assert (*un_it == 0x65e5); +assert (--un_it == utf8::unchecked::iterator(threechars)); +assert (*un_it == 0x10346); +``` This is an unchecked version of `utf8::iterator`. It is faster in many cases, but offers no validity or range checks. From 1cbc1877be5a005d9b6bc71e3693b8c9a754ff12 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Fri, 2 Oct 2015 18:56:06 -0400 Subject: [PATCH 0004/1162] Removing various infrastructure files --- buildrelease.pl | 18 ---- test_drivers/performance/Makefile | 5 - test_drivers/performance/iconvtest.cpp | 132 ------------------------- test_drivers/performance/timer.h | 22 ----- test_drivers/performance/win32.cpp | 110 --------------------- test_drivers/runtests.pl | 50 ---------- 6 files changed, 337 deletions(-) delete mode 100644 buildrelease.pl delete mode 100644 test_drivers/performance/Makefile delete mode 100644 test_drivers/performance/iconvtest.cpp delete mode 100644 test_drivers/performance/timer.h delete mode 100644 test_drivers/performance/win32.cpp delete mode 100644 test_drivers/runtests.pl diff --git a/buildrelease.pl b/buildrelease.pl deleted file mode 100644 index ed3a17bbe..000000000 --- a/buildrelease.pl +++ /dev/null @@ -1,18 +0,0 @@ -#! /usr/bin/perl - -$release_files = 'source/utf8.h source/utf8/core.h source/utf8/checked.h source/utf8/unchecked.h doc/utf8cpp.html doc/ReleaseNotes'; - -# First get the latest version -`svn update`; - -# Then construct the name of the zip file -$argc = @ARGV; -if ($argc > 0) { - $zip_name = $ARGV[0]; -} -else { - $zip_name = "utf8"; -} - -# Zip the files to an archive -`zip $zip_name $release_files`; diff --git a/test_drivers/performance/Makefile b/test_drivers/performance/Makefile deleted file mode 100644 index b38544506..000000000 --- a/test_drivers/performance/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = g++ -CFLAGS = -O3 - -iconvtest: iconvtest.cpp ../../source/utf8.h timer.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h - $(CC) $(CFLAGS) iconvtest.cpp -oiconvtest diff --git a/test_drivers/performance/iconvtest.cpp b/test_drivers/performance/iconvtest.cpp deleted file mode 100644 index 95e73e747..000000000 --- a/test_drivers/performance/iconvtest.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include -#include -#include "../../source/utf8.h" -#include "timer.h" -#include -#include -#include -using namespace std; - -using namespace utf8; - -int main(int argc, char** argv) -{ - if (argc != 2) { - cout << "\nUsage: iconvtest filename\n"; - return 0; - } - const char* test_file_path = argv[1]; - // Open the test file (UTF-8 encoded text) - ifstream fs8(test_file_path, ios::binary); - if (!fs8.is_open()) { - cout << "Could not open " << test_file_path << endl; - return 0; - } - // get length - fs8.seekg(0, ios::end); - int length = fs8.tellg(); - fs8.seekg(0, ios::beg); - - // allocate the buffer (no vector - we are benchmarking conversions, not STL - char* buf = new char[length]; - char* end_buf = buf + length; - // fill the data - fs8.read(buf, length); - fs8.close(); - // the UTF-16 result will not be larger than this (I hope :) ) - vector temputf16; - utf8::utf8to16(buf, end_buf, back_inserter(temputf16)); - int wlength = temputf16.size(); - unsigned short* utf16buf = new unsigned short[wlength]; - - cout << "UTF8 to UTF-16\n"; - { - memset (utf16buf, 0 , wlength * sizeof(unsigned short)); - // utf-8 cpp: - cout << "utf8::utf8to16: "; - timer t(cout); - utf8::utf8to16(buf, buf + length, utf16buf); - t.print_time(); - } - - { - memset (utf16buf, 0 , wlength * sizeof(unsigned short)); - // utf-8 cpp: - cout << "unchecked::utf8to16: "; - timer t(cout); - utf8::unchecked::utf8to16(buf, buf + length, utf16buf); - t.print_time(); - } - - // the UTF-16 result will not be larger than this (I hope :) ) - unsigned short* utf16iconvbuf = new unsigned short[wlength]; - { - memset (utf16iconvbuf, 0 , wlength * sizeof(unsigned short)); - // iconv - cout << "iconv: "; - - iconv_t cd = iconv_open("UTF-16LE", "UTF-8"); - if (cd == iconv_t(-1)) { - cout << "Error openning the iconv stream"; - return 0; - } - char* inbuf = buf; - size_t in_bytes_left = length; - char* outbuf = (char*)utf16iconvbuf; - size_t out_bytes_left = wlength * sizeof (unsigned short); - { - timer t(cout); - iconv(cd, &inbuf, &in_bytes_left, &outbuf, &out_bytes_left); - t.print_time(); - } - iconv_close(cd); - } - - // just check the correctness while we are here: - if (!equal(utf16buf, utf16buf + wlength, utf16iconvbuf)) - cout << "Different result!!!\n"; - - // the other way around - cout << "UTF16 to UTF-8\n"; - { - //iconv - memset(buf, 0, length); - cout<< "iconv: "; - - iconv_t cd = iconv_open("UTF-8", "UTF-16LE"); - if (cd == iconv_t(-1)) { - cout << "Error openning the iconv stream"; - return 0; - } - char* inbuf = (char*)utf16buf; - size_t in_bytes_left = wlength * sizeof(unsigned short); - char* outbuf =buf; - size_t out_bytes_left = length; - { - timer t(cout); - iconv(cd, &inbuf, &in_bytes_left, &outbuf, &out_bytes_left); - t.print_time(); - } - iconv_close(cd); - } - - { - memset (buf, 0 , length); - // utf-8 cpp: - cout << "unchecked::utf16to8: "; - timer t(cout); - utf8::unchecked::utf16to8(utf16buf, utf16buf + wlength, buf); - t.print_time(); - } - - { - memset (buf, 0 , length); - cout << "utf16to8: "; - timer t(cout); - utf8::utf16to8(utf16buf, utf16buf + wlength, buf); - t.print_time(); - } - - delete [] buf; - delete [] utf16buf; -} diff --git a/test_drivers/performance/timer.h b/test_drivers/performance/timer.h deleted file mode 100644 index 807752317..000000000 --- a/test_drivers/performance/timer.h +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -struct timer { - timer(std::ostream& report) : report(report) - {start = std::clock();} - - void print_time() - { - using namespace std; - clock_t now = clock(); - unsigned milliseconds = (now - start)*1000 / CLOCKS_PER_SEC; - report << "Spent " << milliseconds << "ms here\n"; - } - - std::clock_t start; - std::ostream& report; - -private: - // just to surpress a VC++ 8.0 warning - timer& operator = (const timer&); - timer(const timer&); -}; diff --git a/test_drivers/performance/win32.cpp b/test_drivers/performance/win32.cpp deleted file mode 100644 index 3ec861a26..000000000 --- a/test_drivers/performance/win32.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include -#include "../../source/utf8.h" -#include "timer.h" -#include -#include -#include -using namespace std; - -using namespace utf8; - -int main(int argc, char** argv) -{ - if (argc != 2) { - cout << "\nUsage: win32test filename\n"; - return 0; - } - const char* test_file_path = argv[1]; - // Open the test file (UTF-8 encoded text) - ifstream fs8(test_file_path, ios::binary); - if (!fs8.is_open()) { - cout << "Could not open " << test_file_path << endl; - return 0; - } - // get length - fs8.seekg(0, ios::end); - int length = fs8.tellg(); - fs8.seekg(0, ios::beg); - - // allocate the buffer (no vector - we are benchmarking conversions, not STL - char* buf = new char[length]; - // fill the data - fs8.read(buf, length); - fs8.close(); - cout << "UTF8 > UTF16\n"; - // the UTF-16 result will not be larger than this (I hope :) ) - vector temputf16; - utf8::utf8to16(buf, buf + length, back_inserter(temputf16)); - vector::size_type wlength = temputf16.size(); - wchar_t* utf16buf = new wchar_t[wlength]; - - { - memset (utf16buf, 0 , wlength * sizeof(wchar_t)); - // utf-8 cpp: - cout << "utf8::utf8to16: "; - timer t(cout); - utf8::utf8to16(buf, buf + length, utf16buf); - t.print_time(); - } - - { - memset (utf16buf, 0 , wlength * sizeof(wchar_t)); - // utf-8 cpp: - cout << "unchecked::utf8to16: "; - timer t(cout); - utf8::unchecked::utf8to16(buf, buf + length, utf16buf); - t.print_time(); - } - // the UTF-16 result will not be larger than this (I hope :) ) - wchar_t* utf16iconvbuf = new wchar_t[wlength]; - { - memset (utf16iconvbuf, 0 , wlength * sizeof(wchar_t)); - // win32 - cout << "win32: "; - - { - timer t(cout); - MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buf, length, utf16iconvbuf, int(wlength)); - t.print_time(); - } - - } - - // just check the correctness while we are here: - if (!equal(utf16buf, utf16buf + wlength, utf16iconvbuf)) - cout << "Different result!!!"; - - // the other way around - cout << "UTF16 to UTF-8\n"; - { - //win32 - memset(buf, 0, length); - cout<< "win32: "; - - { - timer t(cout); - WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16buf, int(wlength), buf, length, NULL, NULL); - t.print_time(); - } - } - - { - memset (buf, 0 , length); - // utf-8 cpp: - cout << "unchecked::utf16to8: "; - timer t(cout); - utf8::unchecked::utf16to8(utf16buf, utf16buf + wlength, buf); - t.print_time(); - } - - { - memset (buf, 0 , length); - cout << "utf16to8: "; - timer t(cout); - utf8::utf16to8(utf16buf, utf16buf + wlength, buf); - t.print_time(); - } - - delete [] buf; - delete [] utf16buf; -} diff --git a/test_drivers/runtests.pl b/test_drivers/runtests.pl deleted file mode 100644 index 7d63f1843..000000000 --- a/test_drivers/runtests.pl +++ /dev/null @@ -1,50 +0,0 @@ -#! /usr/bin/perl - -$report_name = './report.txt'; - -# Create the report file -die if !open(REPORT, ">$report_name"); - -# First, build everything -print REPORT "==================Make output==================\n"; -close($report_name); - -`make >> $report_name`; -die if !open(REPORT, ">>$report_name"); -print REPORT "==================End of Make output==================\n"; -print REPORT "\n"; -# Now, run individual tests and create the report -print REPORT "==================Smoke Test ==================\n"; -close($report_name); -chdir 'smoke_test'; -`./smoketest >> ../$report_name`; -chdir '..'; -die if !open(REPORT, ">>$report_name"); -print REPORT "==================End of smoke test==================\n"; -print REPORT "\n"; -print REPORT "==================Regression Test ==================\n"; -close($report_name); -chdir 'regression_tests'; -`./regressiontest >> ../$report_name`; -chdir '..'; -die if !open(REPORT, ">>$report_name"); -print REPORT "==================End of regression test==================\n"; -print REPORT "\n"; -print REPORT "==================Negative Test ==================\n"; -close($report_name); -chdir 'negative'; -`./negative ../../test_data/negative/utf8_invalid.txt >> ../$report_name`; -chdir '..'; -die if !open(REPORT, ">>$report_name"); -print REPORT "==================End of negative test==================\n"; -print REPORT "\n"; -print REPORT "==================utf8reader runs ==================\n"; -close($report_name); -chdir 'utf8reader'; -`./utf8reader ../../test_data/utf8samples/quickbrown.txt >> ../$report_name`; -`./utf8reader ../../test_data/utf8samples/Unicode_transcriptions.html >> ../$report_name`; -`./utf8reader ../../test_data/utf8samples/UTF-8-demo.txt >> ../$report_name`; -chdir '..'; -die if !open(REPORT, ">>$report_name"); -print REPORT "==================End of utf8reader runs==================\n"; -print REPORT "\n"; From 2620091238a08f6e59456d030a606cb296dd7141 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 17 Oct 2015 20:16:06 -0400 Subject: [PATCH 0005/1162] Initial CMake files --- CMakeLists.txt | 5 +++++ samples/CMakeLists.txt | 1 + 2 files changed, 6 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 samples/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..4a23de7a6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 2.6) +project (utf8cpp) + +include_directories ("${PROJECT_SOURCE_DIR}/source") +add_subdirectory (samples) diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt new file mode 100644 index 000000000..255e01cd4 --- /dev/null +++ b/samples/CMakeLists.txt @@ -0,0 +1 @@ +add_executable (sample docsample.cpp) From f029fcc2fbc7cd979925f198f7e6ca8170d45000 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 17 Oct 2015 20:41:24 -0400 Subject: [PATCH 0006/1162] CMake for negative test --- CMakeLists.txt | 3 ++- test_drivers/CMakeLists.txt | 1 + test_drivers/negative/CMakeLists.txt | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 test_drivers/CMakeLists.txt create mode 100644 test_drivers/negative/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a23de7a6..49c9fade2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,4 +2,5 @@ cmake_minimum_required (VERSION 2.6) project (utf8cpp) include_directories ("${PROJECT_SOURCE_DIR}/source") -add_subdirectory (samples) +add_subdirectory (samples) +add_subdirectory (test_drivers) diff --git a/test_drivers/CMakeLists.txt b/test_drivers/CMakeLists.txt new file mode 100644 index 000000000..78822a140 --- /dev/null +++ b/test_drivers/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory (negative) diff --git a/test_drivers/negative/CMakeLists.txt b/test_drivers/negative/CMakeLists.txt new file mode 100644 index 000000000..f0d5e1565 --- /dev/null +++ b/test_drivers/negative/CMakeLists.txt @@ -0,0 +1 @@ +add_executable (negative negative.cpp) \ No newline at end of file From 4ddacd67dc588001a34b6f065a6bfb0c36d03d37 Mon Sep 17 00:00:00 2001 From: Muhammad Mominul Huque Date: Tue, 29 Dec 2015 03:18:50 +0600 Subject: [PATCH 0007/1162] Syntax Highlighting --- README.md | 138 +++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 108216080..e8f915533 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The purpose of this article is not to offer an introduction to Unicode in genera To illustrate the use of the library, let's start with a small but complete program that opens a file containing UTF-8 encoded text, reads it line by line, checks each line for invalid UTF-8 byte sequences, and converts it to UTF-16 encoding and back to UTF-8: -``` +```cpp #include #include #include @@ -76,7 +76,7 @@ In the previous code sample, for each line we performed a detection of invalid U Here is a function that checks whether the content of a file is valid UTF-8 encoded text without reading the content into the memory: -``` +```cpp bool valid_utf8_file(const char* file_name) { ifstream ifs(file_name); @@ -94,7 +94,7 @@ Because the function `utf8::is_valid()` works with input iterators, we were able Note that other functions that take input iterator arguments can be used in a similar way. For instance, to read the content of a UTF-8 encoded text file and convert the text to UTF-16, just do something like: -``` +```cpp utf8::utf8to16(it, eos, back_inserter(u16string)); ``` @@ -102,7 +102,7 @@ Note that other functions that take input iterator arguments can be used in a si If we have some text that "probably" contains UTF-8 encoded text and we want to replace any invalid UTF-8 sequence with a replacement character, something like the following function may be used: -``` +```cpp void fix_utf8_string(std::string& str) { std::string temp; @@ -123,7 +123,7 @@ Available in version 1.0 and later. Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. -``` +```cpp template octet_iterator append(uint32_t cp, octet_iterator result); ``` @@ -135,7 +135,7 @@ Return value: an iterator pointing to the place after the newly appended sequenc Example of use: -``` +```cpp unsigned char u[5] = {0,0,0,0,0}; unsigned char* end = append(0x0448, u); assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); @@ -151,7 +151,7 @@ Available in version 1.0 and later. Given the iterator to the beginning of the UTF-8 sequence, it returns the code point and moves the iterator to the next position. -``` +```cpp template uint32_t next(octet_iterator& it, octet_iterator end); ``` @@ -163,7 +163,7 @@ Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars; int cp = next(w, twochars + 6); @@ -181,7 +181,7 @@ Available in version 2.1 and later. Given the iterator to the beginning of the UTF-8 sequence, it returns the code point for the following sequence without changing the value of the iterator. -``` +```cpp template uint32_t peek_next(octet_iterator it, octet_iterator end); ``` @@ -194,7 +194,7 @@ Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars; int cp = peek_next(w, twochars + 6); @@ -210,7 +210,7 @@ Available in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 sequence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -``` +```cpp template uint32_t prior(octet_iterator& it, octet_iterator start); ``` @@ -222,7 +222,7 @@ uint32_t prior(octet_iterator& it, octet_iterator start); Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; unsigned char* w = twochars + 3; int cp = prior (w, twochars); @@ -244,7 +244,7 @@ Deprecated in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -``` +```cpp template uint32_t previous(octet_iterator& it, octet_iterator pass_start); ``` @@ -256,7 +256,7 @@ Return value: the 32 bit representation of the previous code point. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; unsigned char* w = twochars + 3; int cp = previous (w, twochars - 1); @@ -276,7 +276,7 @@ Available in version 1.0 and later. Advances an iterator by the specified number of code points within an UTF-8 sequence. -``` +```cpp template void advance (octet_iterator& it, distance_type n, octet_iterator end); ``` @@ -289,7 +289,7 @@ void advance (octet_iterator& it, distance_type n, octet_iterator end); Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; unsigned char* w = twochars; advance (w, 2, twochars + 6); @@ -306,7 +306,7 @@ Available in version 1.0 and later. Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. -``` +```cpp template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last); ``` @@ -318,7 +318,7 @@ typename std::iterator_traits::difference_type distance (octet_i Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; size_t dist = utf8::distance(twochars, twochars + 5); assert (dist == 2); @@ -334,7 +334,7 @@ Available in version 1.0 and later. Converts a UTF-16 encoded string to UTF-8. -``` +```cpp template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); ``` @@ -348,7 +348,7 @@ Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -``` +```cpp unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; vector utf8result; utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); @@ -363,7 +363,7 @@ Available in version 1.0 and later. Converts an UTF-8 encoded string to UTF-16 -``` +```cpp template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); ``` @@ -376,7 +376,7 @@ Return value: An iterator pointing to the place after the appended UTF-16 string Example of use: -``` +```cpp char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"; vector utf16result; utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); @@ -393,7 +393,7 @@ Available in version 1.0 and later. Converts a UTF-32 encoded string to UTF-8. -``` +```cpp template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); ``` @@ -422,7 +422,7 @@ Available in version 1.0 and later. Converts a UTF-8 encoded string to UTF-32. -``` +```cpp template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); ``` @@ -436,7 +436,7 @@ Return value: An iterator pointing to the place after the appended UTF-32 string Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; vector utf32result; utf8to32(twochars, twochars + 5, back_inserter(utf32result)); @@ -451,7 +451,7 @@ Available in version 1.0 and later. Detects an invalid sequence within a UTF-8 string. -``` +```cpp template octet_iterator find_invalid(octet_iterator start, octet_iterator end); ``` @@ -463,7 +463,7 @@ Return value: an iterator pointing to the first invalid octet in the UTF-8 strin Example of use: -``` +```cpp char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa"; char* invalid = find_invalid(utf_invalid, utf_invalid + 6); assert (invalid == utf_invalid + 5); @@ -477,7 +477,7 @@ Available in version 1.0 and later. Checks whether a sequence of octets is a valid UTF-8 string. -``` +```cpp template bool is_valid(octet_iterator start, octet_iterator end); ``` @@ -489,7 +489,7 @@ Return value: `true` if the sequence is a valid UTF-8 string; `false` if not. Example of use: -``` +```cpp char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa"; bool bvalid = is_valid(utf_invalid, utf_invalid + 6); assert (bvalid == false); @@ -503,7 +503,7 @@ Available in version 2.0 and later. Replaces all invalid UTF-8 sequences within a string with a replacement marker. -``` +```cpp template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement); template @@ -520,7 +520,7 @@ Return value: An iterator pointing to the place after the UTF-8 string with repl Example of use: -``` +```cpp char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"; vector replace_invalid_result; replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), '?'); @@ -540,7 +540,7 @@ Available in version 2.3 and later. Relaces deprecated `is_bom()` function. Checks whether an octet sequence starts with a UTF-8 byte order mark (BOM) -``` +```cpp template bool starts_with_bom (octet_iterator it, octet_iterator end); ``` @@ -552,7 +552,7 @@ Return value: `true` if the sequence starts with a UTF-8 byte order mark; `false Example of use: -``` +```cpp unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf}; bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark)); assert (bbom == true); @@ -566,7 +566,7 @@ Available in version 1.0 and later. Deprecated in version 2.3\. `starts_with_bom Checks whether a sequence of three octets is a UTF-8 byte order mark (BOM) -``` +```cpp template bool is_bom (octet_iterator it); // Deprecated ``` @@ -577,7 +577,7 @@ Return value: `true` if the sequence is UTF-8 byte order mark; `false` if not. Example of use: -``` +```cpp unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf}; bool bbom = is_bom(byte_order_mark); assert (bbom == true); @@ -595,13 +595,13 @@ Available in version 2.3 and later. Base class for the exceptions thrown by UTF CPP library functions. -``` +```cpp class exception : public std::exception {}; ``` Example of use: -``` +```cpp try { code_that_uses_utf_cpp_library(); } @@ -616,7 +616,7 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `advance` and `next` if an UTF-8 sequence represents and invalid code point. -``` +```cpp class invalid_code_point : public exception { public: uint32_t code_point() const; @@ -631,7 +631,7 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `next` and `prior` if an invalid UTF-8 sequence is detected during decoding. -``` +```cpp class invalid_utf8 : public exception { public: uint8_t utf8_octet() const; @@ -646,7 +646,7 @@ Available in version 1.0 and later. Thrown by UTF8 CPP function `utf16to8` if an invalid UTF-16 sequence is detected during decoding. -``` +```cpp class invalid_utf16 : public exception { public: uint16_t utf16_word() const; @@ -661,7 +661,7 @@ Available in version 1.0 and later. Thrown by UTF8 CPP functions such as `next` if the end of the decoded UTF-8 sequence was reached before the code point was decoded. -``` +```cpp class not_enough_room : public exception {}; ``` @@ -671,7 +671,7 @@ Available in version 2.0 and later. Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. -``` +```cpp template class iterator; ``` @@ -691,7 +691,7 @@ class iterator; Example of use: -``` +```cpp char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"; utf8::iterator it(threechars, threechars, threechars + 9); utf8::iterator it2 = it; @@ -714,7 +714,7 @@ The purpose of `utf8::iterator` adapter is to enable easy iteration as well as t Note that `utf8::iterator` adapter is a checked iterator. It operates on the range specified in the constructor; any attempt to go out of that range will result in an exception. Even the comparison operators require both iterator object to be constructed against the same range - otherwise an exception is thrown. Typically, the range will be determined by sequence container functions `begin` and `end`, i.e.: -``` +```cpp std::string s = "example"; utf8::iterator i (s.begin(), s.begin(), s.end()); ``` @@ -727,7 +727,7 @@ Available in version 1.0 and later. Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence to a UTF-8 string. -``` +```cpp template octet_iterator append(uint32_t cp, octet_iterator result); ``` @@ -738,7 +738,7 @@ Return value: An iterator pointing to the place after the newly appended sequenc Example of use: -``` +```cpp unsigned char u[5] = {0,0,0,0,0}; unsigned char* end = unchecked::append(0x0448, u); assert (u[0] == 0xd1 && u[1] == 0x88 && u[2] == 0 && u[3] == 0 && u[4] == 0); @@ -752,7 +752,7 @@ Available in version 1.0 and later. Given the iterator to the beginning of a UTF-8 sequence, it returns the code point and moves the iterator to the next position. -``` +```cpp template uint32_t next(octet_iterator& it); ``` @@ -762,7 +762,7 @@ uint32_t next(octet_iterator& it); Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars; int cp = unchecked::next(w); @@ -778,7 +778,7 @@ Available in version 2.1 and later. Given the iterator to the beginning of a UTF-8 sequence, it returns the code point. -``` +```cpp template uint32_t peek_next(octet_iterator it); ``` @@ -788,7 +788,7 @@ Return value: the 32 bit representation of the processed UTF-8 code point. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars; int cp = unchecked::peek_next(w); @@ -804,7 +804,7 @@ Available in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -``` +```cpp template uint32_t prior(octet_iterator& it); ``` @@ -814,7 +814,7 @@ uint32_t prior(octet_iterator& it); Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars + 3; int cp = unchecked::prior (w); @@ -830,7 +830,7 @@ Deprecated in version 1.02 and later. Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it decreases the iterator until it hits the beginning of the previous UTF-8 encoded code point and returns the 32 bits representation of the code point. -``` +```cpp template uint32_t previous(octet_iterator& it); ``` @@ -840,7 +840,7 @@ Return value: the 32 bit representation of the previous code point. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars + 3; int cp = unchecked::previous (w); @@ -858,7 +858,7 @@ Available in version 1.0 and later. Advances an iterator by the specified number of code points within an UTF-8 sequence. -``` +```cpp template void advance (octet_iterator& it, distance_type n); ``` @@ -868,7 +868,7 @@ void advance (octet_iterator& it, distance_type n); Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; char* w = twochars; unchecked::advance (w, 2); @@ -885,7 +885,7 @@ Available in version 1.0 and later. Given the iterators to two UTF-8 encoded code points in a seqence, returns the number of code points between them. -``` +```cpp template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last); ``` @@ -896,7 +896,7 @@ Return value: the distance between the iterators, in code points. Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; size_t dist = utf8::unchecked::distance(twochars, twochars + 5); assert (dist == 2); @@ -910,7 +910,7 @@ Available in version 1.0 and later. Converts a UTF-16 encoded string to UTF-8. -``` +```cpp template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); ``` @@ -922,7 +922,7 @@ Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -``` +```cpp unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e}; vector utf8result; unchecked::utf16to8(utf16string, utf16string + 5, back_inserter(utf8result)); @@ -937,7 +937,7 @@ Available in version 1.0 and later. Converts an UTF-8 encoded string to UTF-16 -``` +```cpp template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); ``` @@ -948,7 +948,7 @@ Return value: An iterator pointing to the place after the appended UTF-16 string Example of use: -``` +```cpp char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"; vector utf16result; unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result)); @@ -965,7 +965,7 @@ Available in version 1.0 and later. Converts a UTF-32 encoded string to UTF-8. -``` +```cpp template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); ``` @@ -977,7 +977,7 @@ Return value: An iterator pointing to the place after the appended UTF-8 string. Example of use: -``` +```cpp int utf32string[] = {0x448, 0x65e5, 0x10346, 0}; vector utf8result; utf32to8(utf32string, utf32string + 3, back_inserter(utf8result)); @@ -992,7 +992,7 @@ Available in version 1.0 and later. Converts a UTF-8 encoded string to UTF-32. -``` +```cpp template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); ``` @@ -1004,7 +1004,7 @@ Return value: An iterator pointing to the place after the appended UTF-32 string Example of use: -``` +```cpp char* twochars = "\xe6\x97\xa5\xd1\x88"; vector utf32result; unchecked::utf8to32(twochars, twochars + 5, back_inserter(utf32result)); @@ -1021,7 +1021,7 @@ Available in version 2.0 and later. Adapts the underlying octet iterator to iterate over the sequence of code points, rather than raw octets. -``` +```cpp template class iterator; ``` @@ -1041,7 +1041,7 @@ class iterator; Example of use: -``` +```cpp char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"; utf8::unchecked::iterator un_it(threechars); utf8::unchecked::iterator un_it2 = un_it; @@ -1087,4 +1087,4 @@ In case you want to look into other means of working with UTF-8 strings from C++ 1. [The Unicode Consortium](http://www.unicode.org/). 2. [ICU Library](http://icu.sourceforge.net/). 3. [UTF-8 at Wikipedia](http://en.wikipedia.org/wiki/UTF-8) -4. [UTF-8 and Unicode FAQ for Unix/Linux](http://www.cl.cam.ac.uk/~mgk25/unicode.html) \ No newline at end of file +4. [UTF-8 and Unicode FAQ for Unix/Linux](http://www.cl.cam.ac.uk/~mgk25/unicode.html) From 9d52bc19dc48523bb8c44fd4a86cefc70676379a Mon Sep 17 00:00:00 2001 From: Greg Hewgill Date: Wed, 28 Sep 2016 13:32:08 +1300 Subject: [PATCH 0008/1162] Check for end iterator before using iterator If it == end, then sequence_length(it) will be called which will attempt to dereference the it iterator. This is normally harmless, because the get_sequence_x() functions each check to see whether it == end. However, some runtime libraries (MSVC CRT debug build in particular) check the validity of every iterator dereference, and a runtime check will be triggered inside sequence_length() if it is at the end. --- source/utf8/core.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/utf8/core.h b/source/utf8/core.h index 693d388c0..ae0f367db 100644 --- a/source/utf8/core.h +++ b/source/utf8/core.h @@ -222,6 +222,9 @@ namespace internal template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) { + if (it == end) + return NOT_ENOUGH_ROOM; + // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; From 67036a031d131b5a929a525677e4356850fa4e37 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 5 Nov 2016 18:46:04 -0400 Subject: [PATCH 0009/1162] Consolidate CMakeLists.txt The build has only one CMakeLists.txt now. Added support for CTest --- CMakeLists.txt | 15 +++++++++++---- samples/CMakeLists.txt | 1 - samples/Makefile | 5 ----- test_drivers/CMakeLists.txt | 1 - test_drivers/Makefile | 19 ------------------- test_drivers/negative/CMakeLists.txt | 1 - test_drivers/negative/Makefile | 5 ----- test_drivers/smoke_test/Makefile | 5 ----- test_drivers/utf8reader/Makefile | 5 ----- 9 files changed, 11 insertions(+), 46 deletions(-) delete mode 100644 samples/CMakeLists.txt delete mode 100644 samples/Makefile delete mode 100644 test_drivers/CMakeLists.txt delete mode 100644 test_drivers/Makefile delete mode 100644 test_drivers/negative/CMakeLists.txt delete mode 100644 test_drivers/negative/Makefile delete mode 100644 test_drivers/smoke_test/Makefile delete mode 100644 test_drivers/utf8reader/Makefile diff --git a/CMakeLists.txt b/CMakeLists.txt index 49c9fade2..667d2881d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,13 @@ -cmake_minimum_required (VERSION 2.6) +cmake_minimum_required (VERSION 2.8.0) project (utf8cpp) - include_directories ("${PROJECT_SOURCE_DIR}/source") -add_subdirectory (samples) -add_subdirectory (test_drivers) + +add_executable(smoke ${PROJECT_SOURCE_DIR}/test_drivers/smoke_test/test.cpp) +add_executable(negative ${PROJECT_SOURCE_DIR}/test_drivers/negative/negative.cpp) +add_executable(utf8reader ${PROJECT_SOURCE_DIR}/test_drivers/utf8reader/utf8reader.cpp) + +add_executable(docsample ${PROJECT_SOURCE_DIR}/samples/docsample.cpp) + +enable_testing() +add_test(smoke_test smoke) +add_test(negative_test negative ${PROJECT_SOURCE_DIR}/test_data/negative/utf8_invalid.txt) diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt deleted file mode 100644 index 255e01cd4..000000000 --- a/samples/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_executable (sample docsample.cpp) diff --git a/samples/Makefile b/samples/Makefile deleted file mode 100644 index 6cdd3c859..000000000 --- a/samples/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = g++ -CFLAGS = -g -Wall -pedantic - -docsample: docsample.cpp ../source/utf8.h - $(CC) $(CFLAGS) docsample.cpp -odocsample diff --git a/test_drivers/CMakeLists.txt b/test_drivers/CMakeLists.txt deleted file mode 100644 index 78822a140..000000000 --- a/test_drivers/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory (negative) diff --git a/test_drivers/Makefile b/test_drivers/Makefile deleted file mode 100644 index a2cbe4c2e..000000000 --- a/test_drivers/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -CC = g++ -CFLAGS = -g - -all: smoketest regressiontest negativetest utf8readertest - -smoketest: - cd smoke_test && $(MAKE) $@ - -regressiontest: - cd regression_tests && $(MAKE) $@ - -negativetest: - cd negative && $(MAKE) $@ - -utf8readertest: - cd utf8reader && $(MAKE) $@ - -clean: - rm smoke_test/smoketest regression_tests/regressiontest negative/negative utf8reader/utf8reader diff --git a/test_drivers/negative/CMakeLists.txt b/test_drivers/negative/CMakeLists.txt deleted file mode 100644 index f0d5e1565..000000000 --- a/test_drivers/negative/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_executable (negative negative.cpp) \ No newline at end of file diff --git a/test_drivers/negative/Makefile b/test_drivers/negative/Makefile deleted file mode 100644 index 00f4a7d31..000000000 --- a/test_drivers/negative/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = g++ -CFLAGS = -g -Wall -pedantic - -negativetest: negative.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h - $(CC) $(CFLAGS) negative.cpp -onegative diff --git a/test_drivers/smoke_test/Makefile b/test_drivers/smoke_test/Makefile deleted file mode 100644 index f66f3af95..000000000 --- a/test_drivers/smoke_test/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = g++ -CFLAGS = -g -Wall - -smoketest: test.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h - $(CC) $(CFLAGS) test.cpp -osmoketest diff --git a/test_drivers/utf8reader/Makefile b/test_drivers/utf8reader/Makefile deleted file mode 100644 index 29a9aa886..000000000 --- a/test_drivers/utf8reader/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CC = g++ -CFLAGS = -g -Wall -pedantic - -utf8readertest: utf8reader.cpp ../../source/utf8.h ../../source/utf8/core.h ../../source/utf8/checked.h ../../source/utf8/unchecked.h - $(CC) $(CFLAGS) utf8reader.cpp -o utf8reader From 5408022bd69cb0a0a792ed13747743d1410f6e18 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 5 Nov 2016 18:58:26 -0400 Subject: [PATCH 0010/1162] Fix -Wshadow warnings Fix the GNU and CLang's -Wshadow warning by renaming the input parameters. --- source/utf8/checked.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/utf8/checked.h b/source/utf8/checked.h index cc1ec4777..2aef5838d 100644 --- a/source/utf8/checked.h +++ b/source/utf8/checked.h @@ -1,4 +1,4 @@ -// Copyright 2006 Nemanja Trifunovic +// Copyright 2006-2016 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization @@ -41,7 +41,7 @@ namespace utf8 class invalid_code_point : public exception { uint32_t cp; public: - invalid_code_point(uint32_t cp) : cp(cp) {} + invalid_code_point(uint32_t codepoint) : cp(codepoint) {} virtual const char* what() const throw() { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; @@ -272,9 +272,9 @@ namespace utf8 public: iterator () {} explicit iterator (const octet_iterator& octet_it, - const octet_iterator& range_start, - const octet_iterator& range_end) : - it(octet_it), range_start(range_start), range_end(range_end) + const octet_iterator& rangestart, + const octet_iterator& rangeend) : + it(octet_it), range_start(rangestart), range_end(rangeend) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); From 0232ab8188b16ae6f2293a5817f1d9b0030879a3 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 5 Nov 2016 19:34:38 -0400 Subject: [PATCH 0011/1162] Minor documentation update. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e8f915533..d4369e85d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Many C++ developers miss an easy and portable way of handling Unicode encoded strings. The original C++ Standard (known as C++98 or C++03) is Unicode agnostic. C++11 provides some support for Unicode on core language and library level: u8, u, and U character and string literals, char16_t and char32_t character types, u16string and u32string library classes, and codecvt support for conversions between Unicode encoding forms. In the meantime, developers use third party libraries like ICU, OS specific capabilities, or simply roll out their own solutions. -In order to easily handle UTF-8 encoded Unicode strings, I came up with a small generic library. For anybody used to work with STL algorithms and iterators, it should be easy and natural to use. The code is freely available for any purpose - check out the license at the beginning of the utf8.h file. If you run into bugs or performance issues, please let me know and I'll do my best to address them. +In order to easily handle UTF-8 encoded Unicode strings, I came up with a small, C++98 compatible generic library. For anybody used to work with STL algorithms and iterators, it should be easy and natural to use. The code is freely available for any purpose - check out the license at the beginning of the utf8.h file. The library has been used a lot in the past ten years both in commercial and open-source projects and is considered feature-complete now. If you run into bugs or performance issues, please let me know and I'll do my best to address them. The purpose of this article is not to offer an introduction to Unicode in general, and UTF-8 in particular. If you are not familiar with Unicode, be sure to check out [Unicode Home Page](http://www.unicode.org/) or some other source of information for Unicode. Also, it is not my aim to advocate the use of UTF-8 encoded strings in C++ programs; if you want to handle UTF-8 encoded strings from C++, I am sure you have good reasons for it. @@ -1069,7 +1069,7 @@ This is an unchecked version of `utf8::iterator`. It is faster in many cases, bu The library was designed to be: 1. Generic: for better or worse, there are many C++ string classes out there, and the library should work with as many of them as possible. -2. Portable: the library should be portable both accross different platforms and compilers. The only non-portable code is a small section that declares unsigned integers of different sizes: three typedefs. They can be changed by the users of the library if they don't match their platform. The default setting should work for Windows (both 32 and 64 bit), and most 32 bit and 64 bit Unix derivatives. +2. Portable: the library should be portable both accross different platforms and compilers. The only non-portable code is a small section that declares unsigned integers of different sizes: three typedefs. They can be changed by the users of the library if they don't match their platform. The default setting should work for Windows (both 32 and 64 bit), and most 32 bit and 64 bit Unix derivatives. At this point I don't plan to use any post C++03 features, so the library should work even with pretty old compilers. 3. Lightweight: follow the "pay only for what you use" guideline. 4. Unintrusive: avoid forcing any particular design or even programming style on the user. This is a library, not a framework. @@ -1078,7 +1078,7 @@ The library was designed to be: In case you want to look into other means of working with UTF-8 strings from C++, here is the list of solutions I am aware of: 1. [ICU Library](http://icu.sourceforge.net/). It is very powerful, complete, feature-rich, mature, and widely used. Also big, intrusive, non-generic, and doesn't play well with the Standard Library. I definitelly recommend looking at ICU even if you don't plan to use it. -2. C++11 language and library features. Still far from complete, and not widely supported by compiler vendors. +2. C++11 language and library features. Still far from complete, and not easy to use. 3. [Glib::ustring](http://www.gtkmm.org/gtkmm2/docs/tutorial/html/ch03s04.html). A class specifically made to work with UTF-8 strings, and also feel like `std::string`. If you prefer to have yet another string class in your code, it may be worth a look. Be aware of the licensing issues, though. 4. Platform dependent solutions: Windows and POSIX have functions to convert strings from one encoding to another. That is only a subset of what my library offers, but if that is all you need it may be good enough. From 17ca704d3a1ba5dc7da8fdfacdaea733acd2c340 Mon Sep 17 00:00:00 2001 From: Will Frey Date: Fri, 21 Jul 2017 23:07:07 -0400 Subject: [PATCH 0012/1162] Update test.cpp This test was failing for me when I compiled with clang. Must have a different initializer. I changed the test to match the example from the README and it passes when I build with both clang and gcc. --- test_drivers/smoke_test/test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_drivers/smoke_test/test.cpp b/test_drivers/smoke_test/test.cpp index 70d6f15d3..d7bc4268e 100644 --- a/test_drivers/smoke_test/test.cpp +++ b/test_drivers/smoke_test/test.cpp @@ -153,7 +153,7 @@ int main() //replace_invalid char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"; - vector replace_invalid_result(50); + vector replace_invalid_result; replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), replace_invalid_result.begin(), '?'); bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end()); assert (bvalid); From 3723b0cc6ebd5b3fdb6ebaed056e726d9be911c6 Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Wed, 7 Mar 2018 16:43:54 +0000 Subject: [PATCH 0013/1162] Fix smoke test on MSVC The MSVC-generated code in debug mode was (quite rightly) complaining about iterating past the start of an empty vector, and aborting the test. --- test_drivers/smoke_test/test.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test_drivers/smoke_test/test.cpp b/test_drivers/smoke_test/test.cpp index d7bc4268e..4f9fb0485 100644 --- a/test_drivers/smoke_test/test.cpp +++ b/test_drivers/smoke_test/test.cpp @@ -154,10 +154,11 @@ int main() //replace_invalid char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"; vector replace_invalid_result; - replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), replace_invalid_result.begin(), '?'); + replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), std::back_inserter(replace_invalid_result), '?'); bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end()); assert (bvalid); - const char* fixed_invalid_sequence = "a????z"; + const char fixed_invalid_sequence[] = "a????z"; + assert (sizeof(fixed_invalid_sequence) == replace_invalid_result.size()); assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.begin() + sizeof(fixed_invalid_sequence), fixed_invalid_sequence)); // iterator From 7e1d91c4565e9c862ae5701336befe914e4f8b66 Mon Sep 17 00:00:00 2001 From: akrus Date: Tue, 15 May 2018 11:38:36 +0300 Subject: [PATCH 0014/1162] Update lsi-raid parameters --- itl/plugins-contrib.d/raid-controller.conf | 84 ++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/itl/plugins-contrib.d/raid-controller.conf b/itl/plugins-contrib.d/raid-controller.conf index 7b3f738a2..b587715ae 100644 --- a/itl/plugins-contrib.d/raid-controller.conf +++ b/itl/plugins-contrib.d/raid-controller.conf @@ -31,16 +31,92 @@ object CheckCommand "lsi-raid" { arguments = { "-C" = { - required = true value = "$lsi_controller_number$" description = "Insert the controller number to be checked." } "-p" = { - required = true value = "$storcli_path$" description = "Insert the path to storcli (e.g. /usr/sbin/storcli)." } + "-EID" = { + value = "$lsi_enclosure_id$" + description = "Enclosure numbers to be checked, comma-separated." + } + "-LD" = { + value = "$lsi_ld_id$" + description = "Logical devices to be checked, comma-separated." + } + "-PD" = { + value = "$lsi_pd_id$" + description = "Physical devices to be checked, comma-separated." + } + "-Tw" = { + value = "$lsi_temp_warning$" + description = "RAID controller warning temperature." + } + "-Tc" = { + value = "$lsi_temp_critical$" + description = "RAID controller critical temperature." + } + "-PDTw" = { + value = "$lsi_pd_temp_warning$" + description = "Disk warning temperature." + } + "-PDTc" = { + value = "$lsi_pd_temp_critical$" + description = "Disk critical temperature." + } + "-BBUTw" = { + value = "$lsi_bbu_temp_warning$" + description = "Battery warning temperature." + } + "-BBUTc" = { + value = "$lsi_bbu_temp_critical$" + description = "Battery critical temperature." + } + "-CVTw" = { + value = "$lsi_cv_temp_warning$" + description = "CacheVault warning temperature." + } + "-CVTc" = { + value = "$lsi_cv_temp_critical$" + description = "CacheVault critical temperature." + } + "-Im" = { + value = "$lsi_ignored_media_errors$" + description = "Warning threshold for media errors." + } + "-Io" = { + value = "$lsi_ignored_other_errors$" + description = "Warning threshold for other errors." + } + "-Ip" = { + value = "$lsi_ignored_predictive_fails$" + description = "Warning threshold for predictive failures." + } + "-Is" = { + value = "$lsi_ignored_shield_counters$" + description = "Warning threshold for shield counter." + } + "-Ib" = { + value = "$lsi_ignored_bbm_counters$" + description = "Warning threshold for BBM counter." + } + "-b" = { + value = "$lsi_bbu$" + description = "Define if BBU is present and it's state should be checked." + } + "--noenclosures" = { + set_if = "$lsi_noenclosures$" + description = "Define if enclosures are present." + } + "--nosudo" = { + set_if = "$lsi_nosudo$" + description = "Do not use sudo when running storcli." + } + "--nocleanlogs" = { + set_if = "$lsi_nocleanlogs$" + description = "Do not clean up the log files after executing storcli checks." + } } - - vars.storcli_path = "/usr/sbin/storcli" } From 8e124e2abe3880d5b2aec1f367a608143b8562e6 Mon Sep 17 00:00:00 2001 From: Philipp Dallig Date: Wed, 16 May 2018 12:04:38 +0200 Subject: [PATCH 0015/1162] Do not add the old timeperiod segment, if we cut it in the middle --- lib/icinga/timeperiod.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/icinga/timeperiod.cpp b/lib/icinga/timeperiod.cpp index 97183223e..94a57c30b 100644 --- a/lib/icinga/timeperiod.cpp +++ b/lib/icinga/timeperiod.cpp @@ -142,12 +142,12 @@ void TimePeriod::RemoveSegment(double begin, double end) for (const Dictionary::Ptr& segment : segments) { /* Fully contained in the specified range? */ if (segment->Get("begin") >= begin && segment->Get("end") <= end) + // Don't add the old segment, because the segment is fully contained into our range continue; /* Not overlapping at all? */ if (segment->Get("end") < begin || segment->Get("begin") > end) { newSegments->Add(segment); - continue; } @@ -162,6 +162,8 @@ void TimePeriod::RemoveSegment(double begin, double end) { "begin", end }, { "end", segment->Get("end") } })); + // Don't add the old segment, because we have now two new segments and a gap between + continue; } /* Adjust the begin/end timestamps so as to not overlap with the specified range. */ From dd8a3fd0b52d220f8c15cfe9df50d5f731e43490 Mon Sep 17 00:00:00 2001 From: akrus Date: Thu, 17 May 2018 17:38:34 +0300 Subject: [PATCH 0016/1162] updated docs for lsi-raid --- doc/10-icinga-template-library.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 65446e5f4..0e3af177a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2546,8 +2546,29 @@ Custom attributes passed as [command parameters](03-monitoring-basics.md#command Name | Description --------------------------------|----------------------------------------------------------------------- -lsi_controller_number | **Required.** Controller number to monitor. -storcli_path | **Required.** Path to the `storcli` binary, e.g. "/usr/sbin/storcli". +lsi_controller_number | **Optional.** Controller number to monitor. +storcli_path | **Optional.** Path to the `storcli` binary, e.g. "/usr/sbin/storcli". +lsi_enclosure_id | **Optional.** Enclosure numbers to be checked, comma-separated. +lsi_ld_id | **Optional.** Logical devices to be checked, comma-separated. +lsi_pd_id | **Optional.** Physical devices to be checked, comma-separated. +lsi_temp_warning | **Optional.** RAID controller warning temperature. +lsi_temp_critical | **Optional.** RAID controller critical temperature. +lsi_pd_temp_warning | **Optional.** Disk warning temperature. +lsi_pd_temp_critical | **Optional.** Disk critical temperature. +lsi_bbu_temp_warning | **Optional.** Battery warning temperature. +lsi_bbu_temp_critical | **Optional.** Battery critical temperature. +lsi_cv_temp_warning | **Optional.** CacheVault warning temperature. +lsi_cv_temp_critical | **Optional.** CacheVault critical temperature. +lsi_ignored_media_errors | **Optional.** Warning threshold for media errors. +lsi_ignored_other_errors | **Optional.** Warning threshold for other errors. +lsi_ignored_predictive_fails | **Optional.** Warning threshold for predictive failures. +lsi_ignored_shield_counters | **Optional.** Warning threshold for shield counter. +lsi_ignored_bbm_counters | **Optional.** Warning threshold for BBM counter. +lsi_bbu | **Optional.** Define if BBU is present and it's state should be checked. +lsi_noenclosures | **Optional.** If set to true, does not check enclosures. +lsi_nosudo | **Optional.** If set to true, does not use sudo when running storcli. +lsi_nocleanlogs | **Optional.** If set to true, does not clean up the log files after executing storcli checks. + #### smart-attributes From d359d9e7c7456065ff277d916840827c395dd843 Mon Sep 17 00:00:00 2001 From: Carsten Koebke Date: Sun, 3 Jun 2018 20:25:24 +0200 Subject: [PATCH 0017/1162] Fix for catalogued locally databases. Fixes #6338 --- doc/10-icinga-template-library.md | 3 ++- itl/plugins-contrib.d/databases.conf | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 0da925058..d57d42352 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2181,7 +2181,7 @@ Custom attributes passed as [command parameters](03-monitoring-basics.md#command Name | Description ---------------------------------|------------------------------------------------------------------------------------------------------------------------------ -db2_health_database | **Required.** The name of the database. (If it was catalogued locally, this parameter is the only you need. Otherwise you must specify database, hostname and port) +db2_health_database | **Required.** The name of the database. (If it was catalogued locally, this parameter and `db2_health_not_cataloged = false` are the only you need. Otherwise you must specify database, hostname and port) db2_health_username | **Optional.** The username for the database connection. db2_health_password | **Optional.** The password for the database connection. db2_health_port | **Optional.** The port where DB2 is listening. @@ -2197,6 +2197,7 @@ db2_health_maxinactivity | **Optional.** Used for the maximum amount of tim db2_health_mitigation | **Optional.** Classifies the severity of an offline tablespace. db2_health_lookback | **Optional.** How many days in the past db2_health check should look back to calculate exitcode. db2_health_report | **Optional.** Report can be used to output only the bad news. Possible values are "short", "long", "html". Defaults to `short`. +db2_health_not_cataloged | **Optional.** Set this variable to false if you want to use a catalogued locally database. Defaults to `true`. db2_health_env_db2_home | **Required.** Specifies the location of the db2 client libraries as environment variable `DB2_HOME`. Defaults to "/opt/ibm/db2/V10.5". db2_health_env_db2_version | **Optional.** Specifies the DB2 version as environment variable `DB2_VERSION`. diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index 8b4c2ffd2..7e5a30e11 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -344,6 +344,7 @@ object CheckCommand "db2_health" { arguments = { "--hostname" = { value = "$db2_health_hostname$" + set_if = "$db2_health_not_cataloged$" description = "the host to connect" order = -2 } @@ -424,6 +425,7 @@ object CheckCommand "db2_health" { } vars.db2_health_regexp = false + vars.db2_health_not_cataloged = true vars.db2_health_hostname = "$check_address$" vars.db2_health_report = "short" From 9a5d464448b2b7fc92a582a7dfc581b5af29a5fe Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Tue, 12 Jun 2018 12:19:16 +0200 Subject: [PATCH 0018/1162] Revert "Fix Windows reload" This reverts commit 691e3cfd576e09d28f1da0df3f112d5c56980362. --- lib/base/application.cpp | 3 +-- lib/cli/daemoncommand.cpp | 39 --------------------------------------- 2 files changed, 1 insertion(+), 41 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 374285404..1ee51f88c 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -416,8 +416,7 @@ pid_t Application::StartReloadProcess() args.push_back("--reload-internal"); args.push_back(Convert::ToString(Utility::GetPid())); #else /* _WIN32 */ - args.push_back("--restart-service"); - args.push_back("icinga2"); + args.push_back("--validate"); #endif /* _WIN32 */ Process::Ptr process = new Process(Process::PrepareCommand(new Array(std::move(args)))); diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index d113dac11..f663d1046 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -162,9 +162,6 @@ void DaemonCommand::InitParameters(boost::program_options::options_description& #ifndef _WIN32 hiddenDesc.add_options() ("reload-internal", po::value(), "used internally to implement config reload: do not call manually, send SIGHUP instead"); -#else - hiddenDesc.add_options() - ("restart-service", po::value(), "tries to restart the Icinga 2 service"); #endif /* _WIN32 */ } @@ -214,42 +211,6 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector(); - - SC_HANDLE handleService = OpenService(handleManager, service.c_str(), SERVICE_START | SERVICE_STOP); - if (!handleService) { - Log(LogCritical, "cli") << "Failed to open service handle of '" << service << "'. Error code: " << GetLastError(); - return EXIT_FAILURE; - } - - SERVICE_STATUS serviceStatus; - if (!ControlService(handleService, SERVICE_CONTROL_STOP, &serviceStatus)) { - DWORD error = GetLastError(); - if (error = ERROR_SERVICE_NOT_ACTIVE) - Log(LogInformation, "cli") << "Service '" << service << "' is not running."; - else { - Log(LogCritical, "cli") << "Failed to stop service. Error code: " << GetLastError(); - return EXIT_FAILURE; - } - } - - if (!StartService(handleService, 0, NULL)) { - Log(LogCritical, "cli") << "Failed to start up service '" << service << "'. Error code: " << GetLastError(); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; - } -#endif /* _WIN32 */ - if (vm.count("validate")) { Log(LogInformation, "cli", "Finished validating the configuration file(s)."); return EXIT_SUCCESS; From e885cf71c6595eb27bff15b399809c8905e542ee Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Tue, 12 Jun 2018 19:02:48 +0200 Subject: [PATCH 0019/1162] Fix program option parsing This fixes the program option parsing. --- lib/cli/clicommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/clicommand.cpp b/lib/cli/clicommand.cpp index ece65d4e6..069597ad9 100644 --- a/lib/cli/clicommand.cpp +++ b/lib/cli/clicommand.cpp @@ -186,7 +186,7 @@ bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& vi std::vector::size_type i; int k; for (i = 0, k = 1; i < vname.size() && k < argc; i++, k++) { - if (strncmp(argv[k], "--", 2) == 0) { + if (strncmp(argv[k], "-", 1) == 0 || strncmp(argv[k], "--", 2) == 0) { i--; continue; } From 7741517df7630073f9162e6bfa2315501a5f7791 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 14 Jun 2018 15:03:04 +0200 Subject: [PATCH 0020/1162] ApiListener#NewClientHandlerInternal(): Explicitly close the TLS stream on any failure refs #6361 --- lib/remote/apilistener.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index d7e01da67..c1546710d 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -457,6 +457,7 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri } catch (const std::exception&) { Log(LogCritical, "ApiListener") << "Client TLS handshake failed (" << conninfo << ")"; + tlsStream->Close(); return; } @@ -471,6 +472,7 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri } catch (const std::exception&) { Log(LogCritical, "ApiListener") << "Cannot get certificate common name from cert path: '" << GetDefaultCertPath() << "'."; + tlsStream->Close(); return; } @@ -480,6 +482,7 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri Log(LogWarning, "ApiListener") << "Unexpected certificate common name while connecting to endpoint '" << hostname << "': got '" << identity << "'"; + tlsStream->Close(); return; } else if (!verify_ok) { Log(LogWarning, "ApiListener") @@ -529,6 +532,7 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri Log(LogWarning, "ApiListener") << "No data received on new API connection for identity '" << identity << "'. " << "Ensure that the remote endpoints are properly configured in a cluster setup."; + tlsStream->Close(); return; } From 0bcda04171b9ec955e0ea6dd8215d5496d875240 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Jun 2018 10:48:19 +0200 Subject: [PATCH 0021/1162] Remove the import of 'legacy-timeperiod' in the docs 2.6.0 introduced default template imports for config objects where this isn't necessary anymore. It also confuses the reader. --- doc/08-advanced-topics.md | 186 ++++++++++++++++++-------------------- doc/09-object-types.md | 4 - 2 files changed, 89 insertions(+), 101 deletions(-) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index c51a303d7..0e450a59d 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -206,14 +206,6 @@ the `check_period` attribute. Or a notification should be sent to users or not, filtered by the `period` and `notification_period` configuration attributes for `Notification` and `User` objects. -> **Note** -> -> If you are familiar with Icinga 1.x, these time period definitions -> are called `legacy timeperiods` in Icinga 2. -> -> An Icinga 2 legacy timeperiod requires the `ITL` provided template ->`legacy-timeperiod`. - The `TimePeriod` attribute `ranges` may contain multiple directives, including weekdays, days of the month, and calendar dates. These types may overlap/override other types in your ranges dictionary. @@ -231,78 +223,80 @@ If you don't set any `check_period` or `notification_period` attribute on your configuration objects, Icinga 2 assumes `24x7` as time period as shown below. - object TimePeriod "24x7" { - import "legacy-timeperiod" - - display_name = "Icinga 2 24x7 TimePeriod" - ranges = { - "monday" = "00:00-24:00" - "tuesday" = "00:00-24:00" - "wednesday" = "00:00-24:00" - "thursday" = "00:00-24:00" - "friday" = "00:00-24:00" - "saturday" = "00:00-24:00" - "sunday" = "00:00-24:00" - } - } +``` +object TimePeriod "24x7" { + display_name = "Icinga 2 24x7 TimePeriod" + ranges = { + "monday" = "00:00-24:00" + "tuesday" = "00:00-24:00" + "wednesday" = "00:00-24:00" + "thursday" = "00:00-24:00" + "friday" = "00:00-24:00" + "saturday" = "00:00-24:00" + "sunday" = "00:00-24:00" + } +} +``` If your operation staff should only be notified during workhours, create a new timeperiod named `workhours` defining a work day from 09:00 to 17:00. - object TimePeriod "workhours" { - import "legacy-timeperiod" +``` +object TimePeriod "workhours" { + display_name = "Icinga 2 8x5 TimePeriod" + ranges = { + "monday" = "09:00-17:00" + "tuesday" = "09:00-17:00" + "wednesday" = "09:00-17:00" + "thursday" = "09:00-17:00" + "friday" = "09:00-17:00" + } +} +``` - display_name = "Icinga 2 8x5 TimePeriod" - ranges = { - "monday" = "09:00-17:00" - "tuesday" = "09:00-17:00" - "wednesday" = "09:00-17:00" - "thursday" = "09:00-17:00" - "friday" = "09:00-17:00" - } - } - -Furthermore if you wish to specify a notification period across midnight, +If you want to specify a notification period across midnight, you can define it the following way: - object Timeperiod "across-midnight" { - import "legacy-timeperiod" - - display_name = "Nightly Notification" - ranges = { - "saturday" = "22:00-24:00" - "sunday" = "00:00-03:00" - } - } +``` +object Timeperiod "across-midnight" { + display_name = "Nightly Notification" + ranges = { + "saturday" = "22:00-24:00" + "sunday" = "00:00-03:00" + } +} +``` Below you can see another example for configuring timeperiods across several days, weeks or months. This can be useful when taking components offline for a distinct period of time. - object Timeperiod "standby" { - import "legacy-timeperiod" - - display_name = "Standby" - ranges = { - "2016-09-30 - 2016-10-30" = "00:00-24:00" - } - } +``` +object Timeperiod "standby" { + display_name = "Standby" + ranges = { + "2016-09-30 - 2016-10-30" = "00:00-24:00" + } +} +``` Please note that the spaces before and after the dash are mandatory. Once your time period is configured you can Use the `period` attribute to assign time periods to `Notification` and `Dependency` objects: - object Notification "mail" { - import "generic-notification" +``` +apply Notification "mail-icingaadmin" to Service { + import "mail-service-notification" + user_groups = host.vars.notification.mail.groups + users = host.vars.notification.mail.users - host_name = "localhost" + period = "workhours" - command = "mail-notification" - users = [ "icingaadmin" ] - period = "workhours" - } + assign where host.vars.notification.mail +} +``` ### Time Periods Inclusion and Exclusion @@ -319,51 +313,51 @@ preferred. The following example defines a time period called `holidays` where notifications should be suppressed: - object TimePeriod "holidays" { - import "legacy-timeperiod" - - ranges = { - "january 1" = "00:00-24:00" //new year's day - "july 4" = "00:00-24:00" //independence day - "december 25" = "00:00-24:00" //christmas - "december 31" = "18:00-24:00" //new year's eve (6pm+) - "2017-04-16" = "00:00-24:00" //easter 2017 - "monday -1 may" = "00:00-24:00" //memorial day (last monday in may) - "monday 1 september" = "00:00-24:00" //labor day (1st monday in september) - "thursday 4 november" = "00:00-24:00" //thanksgiving (4th thursday in november) - } - } +``` +object TimePeriod "holidays" { + ranges = { + "january 1" = "00:00-24:00" //new year's day + "july 4" = "00:00-24:00" //independence day + "december 25" = "00:00-24:00" //christmas + "december 31" = "18:00-24:00" //new year's eve (6pm+) + "2017-04-16" = "00:00-24:00" //easter 2017 + "monday -1 may" = "00:00-24:00" //memorial day (last monday in may) + "monday 1 september" = "00:00-24:00" //labor day (1st monday in september) + "thursday 4 november" = "00:00-24:00" //thanksgiving (4th thursday in november) + } +} +``` In addition to that the time period `weekends` defines an additional time window which should be excluded from notifications: - object TimePeriod "weekends-excluded" { - import "legacy-timeperiod" - - ranges = { - "saturday" = "00:00-09:00,18:00-24:00" - "sunday" = "00:00-09:00,18:00-24:00" - } - } +``` +object TimePeriod "weekends-excluded" { + ranges = { + "saturday" = "00:00-09:00,18:00-24:00" + "sunday" = "00:00-09:00,18:00-24:00" + } +} +``` The time period `prod-notification` defines the default time ranges and adds the excluded time period names as an array. - object TimePeriod "prod-notification" { - import "legacy-timeperiod" +``` +object TimePeriod "prod-notification" { + excludes = [ "holidays", "weekends-excluded" ] - excludes = [ "holidays", "weekends-excluded" ] - - ranges = { - "monday" = "00:00-24:00" - "tuesday" = "00:00-24:00" - "wednesday" = "00:00-24:00" - "thursday" = "00:00-24:00" - "friday" = "00:00-24:00" - "saturday" = "00:00-24:00" - "sunday" = "00:00-24:00" - } - } + ranges = { + "monday" = "00:00-24:00" + "tuesday" = "00:00-24:00" + "wednesday" = "00:00-24:00" + "thursday" = "00:00-24:00" + "friday" = "00:00-24:00" + "saturday" = "00:00-24:00" + "sunday" = "00:00-24:00" + } +} +``` ## External Check Results @@ -1077,8 +1071,6 @@ time of the day compared to the defined time period. ``` object TimePeriod "backup" { - import "legacy-timeperiod" - ranges = { monday = "02:00-03:00" tuesday = "02:00-03:00" diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 17b3444e1..0ba3ff05e 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1602,10 +1602,6 @@ Facility Constants: Time periods can be used to specify when hosts/services should be checked or to limit when notifications should be sent out. -> **Note** -> -> Icinga 2 versions < 2.6.0 require the import of the [legacy-timeperiod](10-icinga-template-library.md#itl-legacy-timeperiod) template. - Examples: ``` From e390962fb6b6298ccfadaa90de7758e5c2167bc9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Jun 2018 10:55:51 +0200 Subject: [PATCH 0022/1162] Drop command template imports for versions < 2.6 in the docs Such versions are out of support, so there's no need to keep track in the docs for 2.9. --- doc/09-object-types.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 0ba3ff05e..1c6436739 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -124,10 +124,6 @@ chapter. A check command definition. Additional default command custom attributes can be defined here. -> **Note** -> -> Icinga 2 versions < 2.6.0 require the import of the [plugin-check-command](10-icinga-template-library.md#itl-plugin-check-command) template. - Example: ``` @@ -563,10 +559,6 @@ Endpoint objects cannot currently be created with the API. An event command definition. -> **Note** -> -> Icinga 2 versions < 2.6.0 require the import of the [plugin-event-command](10-icinga-template-library.md#itl-plugin-event-command) template. - Example: ``` @@ -1184,10 +1176,6 @@ Runtime Attributes: A notification command definition. -> **Note** -> -> Icinga 2 versions < 2.6.0 require the import of the [plugin-notification-command](10-icinga-template-library.md#itl-plugin-notification-command) template. - Example: ``` From e15d2f40abb59159aac81cc559ab8179d2f828a0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Jun 2018 11:42:00 +0200 Subject: [PATCH 0023/1162] Docs: Add an additional note for VMWare timeouts on Ubuntu 16.04 LTS Spotted through our community channels. --- doc/05-service-monitoring.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index 855b75b53..004bf4581 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -260,6 +260,8 @@ Instead, choose a plugin and configure its parameters and thresholds. The follow **Tip**: If you are encountering timeouts using the VMware Perl SDK, check [this blog entry](https://www.claudiokuenzler.com/blog/650/slow-vmware-perl-sdk-soap-request-error-libwww-version). +Ubuntu 16.04 LTS can have troubles with random entropy in Perl asked [here](https://monitoring-portal.org/t/check-vmware-api-slow-when-run-multiple-times/2868). +In that case, [haveged](http://issihosts.com/haveged/) may help. ### SAP Monitoring From 5da0f41b3f4eeeb9c5a7cd6fe77933a770b6ec20 Mon Sep 17 00:00:00 2001 From: Max Rosin Date: Fri, 15 Jun 2018 13:17:52 +0200 Subject: [PATCH 0024/1162] some minor fixes in the flapping documentation - change "ware weighted" to "are weighted" - remove an unintended line break - remove a comma --- doc/08-advanced-topics.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index 0e450a59d..44b41dffb 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -438,8 +438,7 @@ Icinga 2 supports optional detection of hosts and services that are "flapping". Flapping occurs when a service or host changes state too frequently, which would result in a storm of problem and recovery notifications. With flapping detection enabled a flapping notification will be sent while other notifications are suppresed until it calms down after receiving the same status from checks a few times. Flapping detection can help detect - -configuration problems (wrong thresholds), troublesome services, or network problems. +configuration problems (wrong thresholds), troublesome services or network problems. Flapping detection can be enabled or disabled using the `enable_flapping` attribute. The `flapping_threshold_high` and `flapping_threshold_low` attributes allows to specify the thresholds that control @@ -460,7 +459,7 @@ Icinga 2 saves the last 20 state changes for every host and service. See the gra ![Icinga 2 Flapping State Timeline](images/advanced-topics/flapping-state-graph.png) -All the states ware weighted, with the most recent one being worth the most (1.15) and the 20th the least (0.8). The +All the states are weighted, with the most recent one being worth the most (1.15) and the 20th the least (0.8). The states in between are fairly distributed. The final flapping value are the weighted state changes divided by the total count of 20. From b9bfe70444e2e724399362d687d86916535c730c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Jun 2018 14:25:03 +0200 Subject: [PATCH 0025/1162] Fix missing name for workqueue while creating runtime objects via API fixes #6364 --- lib/remote/configobjectutility.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index ea58ba79d..fff206328 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -139,6 +139,8 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full expr.reset(); WorkQueue upq; + upq.SetName("ConfigObjectUtility::CreateObject"); + std::vector newItems; if (!ConfigItem::CommitItems(ascope.GetContext(), upq, newItems) || !ConfigItem::ActivateItems(upq, newItems, true)) { From ee9be90fa79934993a3754a523f0e180d71ce58d Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 15 Jun 2018 14:40:09 +0200 Subject: [PATCH 0026/1162] Throw config error when using global zones as parent --- lib/remote/zone.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index ea6e007bd..eddc3aa67 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -33,6 +33,9 @@ void Zone::OnAllConfigLoaded() m_Parent = Zone::GetByName(GetParentRaw()); + if (m_Parent && m_Parent->IsGlobal()) + BOOST_THROW_EXCEPTION(ScriptError("Zone '" + GetName() + "' can not have a global zone as parent.", GetDebugInfo())); + Zone::Ptr zone = m_Parent; int levels = 0; From 2b5ea38217aff5acb114e45991565f44ce6ac811 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 15 Jun 2018 17:04:28 +0200 Subject: [PATCH 0027/1162] Fix sysconfig not bein handled correctly by sysvinit --- etc/initsystem/icinga2.init.d.cmake | 4 ++-- etc/initsystem/prepare-dirs.cmake | 5 +++++ etc/initsystem/safe-reload.cmake | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/etc/initsystem/icinga2.init.d.cmake b/etc/initsystem/icinga2.init.d.cmake index 03c88a632..c37977f57 100644 --- a/etc/initsystem/icinga2.init.d.cmake +++ b/etc/initsystem/icinga2.init.d.cmake @@ -60,7 +60,7 @@ fi # Start Icinga 2 start() { printf "Starting Icinga 2: " - @CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs + @CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs "$SYSCONFIGFILE" if ! $DAEMON daemon -c $ICINGA2_CONFIG_FILE -d -e $ICINGA2_ERROR_LOG > $ICINGA2_STARTUP_LOG 2>&1; then echo "Error starting Icinga. Check '$ICINGA2_STARTUP_LOG' for details." @@ -105,7 +105,7 @@ stop() { # Reload Icinga 2 reload() { - exec @CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload $SYSCONFIGFILE + exec @CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload "$SYSCONFIGFILE" } # Check the Icinga 2 configuration diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake index 2a6c4a262..b7e3b6422 100644 --- a/etc/initsystem/prepare-dirs.cmake +++ b/etc/initsystem/prepare-dirs.cmake @@ -3,6 +3,11 @@ # This script prepares directories and files needed for running Icinga2 # +# With sysvinit we need to pass the environment this way. Or do we? +if [ "$1" != "" ]; then + source "$1" +fi + # Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" : ${ICINGA2_USER:="@ICINGA2_USER@"} diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake index 57e10b1ac..967e37268 100644 --- a/etc/initsystem/safe-reload.cmake +++ b/etc/initsystem/safe-reload.cmake @@ -1,5 +1,12 @@ #!/bin/sh +# With sysvinit we need to pass the environment this way. Or do we? +if [ "$1" != "" ]; then + source "$1" +fi + +# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" + : ${ICINGA2_PID_FILE:="@ICINGA2_RUNDIR@/icinga2/icinga2.pid"} : ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"} From 44fae88d43dcc8831a195923d6c0e7843f9ceef6 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Mon, 18 Jun 2018 10:27:35 +0200 Subject: [PATCH 0028/1162] Update sysconfig read --- etc/initsystem/prepare-dirs.cmake | 8 ++++++-- etc/initsystem/safe-reload.cmake | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake index b7e3b6422..d9b644b7a 100644 --- a/etc/initsystem/prepare-dirs.cmake +++ b/etc/initsystem/prepare-dirs.cmake @@ -3,9 +3,13 @@ # This script prepares directories and files needed for running Icinga2 # -# With sysvinit we need to pass the environment this way. Or do we? +# Load sysconf on systems where the initsystem does not pass the environment if [ "$1" != "" ]; then - source "$1" + if [ -r "$1" ]; then + source "$1" + else + echo "Unable to read sysconf from '$1'. Exiting." && exit 6 + fi fi # Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake index 967e37268..44b261eae 100644 --- a/etc/initsystem/safe-reload.cmake +++ b/etc/initsystem/safe-reload.cmake @@ -1,8 +1,12 @@ #!/bin/sh -# With sysvinit we need to pass the environment this way. Or do we? +# Load sysconf on systems where the initsystem does not pass the environment if [ "$1" != "" ]; then - source "$1" + if [ -r "$1" ]; then + source "$1" + else + echo "Unable to read sysconf from '$1'. Exiting." && exit 6 + fi fi # Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" From a0fca599da58e7fd045c094b3293a19aa4cfc332 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 18 Jun 2018 16:02:22 +0200 Subject: [PATCH 0029/1162] HttpRequest#ParseBody(): indicate success on complete body refs #6184 --- lib/remote/httprequest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/remote/httprequest.cpp b/lib/remote/httprequest.cpp index f698b2101..8f6c11e31 100644 --- a/lib/remote/httprequest.cpp +++ b/lib/remote/httprequest.cpp @@ -142,9 +142,9 @@ bool HttpRequest::ParseBody(StreamReadContext& src, bool may_wait) if (size == 0) { CompleteBody = true; - return false; - } else - return true; + } + + return true; } if (src.Eof) From 9b99c9d106eec6645b2b2226af6eccda670498d0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 18 Jun 2018 19:25:48 +0200 Subject: [PATCH 0030/1162] Remove leftover for sysconfig file parsing refs #6255 --- icinga-app/icinga.cpp | 8 -------- lib/base/application.cpp | 21 --------------------- lib/base/application.hpp | 3 --- 3 files changed, 32 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 0e462307c..404cedf30 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -143,7 +143,6 @@ static int Main() #endif /* _WIN32 */ Application::DeclarePrefixDir(ICINGA_PREFIX); - Application::DeclareSysconfigFile(ICINGA_SYSCONFIGFILE); Application::DeclareSysconfDir(ICINGA_SYSCONFDIR); Application::DeclareRunDir(ICINGA_RUNDIR); Application::DeclareLocalStateDir(ICINGA_LOCALSTATEDIR); @@ -155,13 +154,6 @@ static int Main() Application::DeclareZonesDir(Application::GetSysconfDir() + "/icinga2/zones.d"); -#ifndef _WIN32 - if (!autocomplete && !Utility::PathExists(Application::GetSysconfigFile())) { - Log(LogWarning, "icinga-app") - << "Sysconfig file '" << Application::GetSysconfigFile() << "' cannot be read. Using default values."; - } -#endif /* _WIN32 */ - String icingaUser = Utility::GetFromEnvironment("ICINGA2_USER"); if (icingaUser.IsEmpty()) icingaUser = ICINGA_USER; diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 1ee51f88c..dec962e08 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -1325,27 +1325,6 @@ void Application::DeclareStatePath(const String& path) ScriptGlobal::Set("StatePath", path); } -/** - * Retrives the path of the sysconfig file. - * - * @returns The path. - */ -String Application::GetSysconfigFile(void) -{ - return ScriptGlobal::Get("SysconfigFile"); -} - -/** - * Sets the path of the sysconfig file. - * - * @param path The new path. - */ -void Application::DeclareSysconfigFile(const String& path) -{ - if (!ScriptGlobal::Exists("SysconfigFile")) - ScriptGlobal::Set("SysconfigFile", path); -} - /** * Retrieves the path for the modified attributes file. * diff --git a/lib/base/application.hpp b/lib/base/application.hpp index 03d83599b..7722d25f4 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -106,9 +106,6 @@ public: static String GetIncludeConfDir(); static void DeclareIncludeConfDir(const String& path); - static String GetSysconfigFile(void); - static void DeclareSysconfigFile(const String& path); - static String GetStatePath(void); static void DeclareStatePath(const String& path); From ea08c8542463a4212340df17bba5c89e153aafc3 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 19 Jun 2018 10:30:34 +0200 Subject: [PATCH 0031/1162] Fix that TimePeriod segments are not cleared on restart refs #6282 --- lib/icinga/timeperiod.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/icinga/timeperiod.cpp b/lib/icinga/timeperiod.cpp index 97183223e..28f418a32 100644 --- a/lib/icinga/timeperiod.cpp +++ b/lib/icinga/timeperiod.cpp @@ -235,7 +235,9 @@ void TimePeriod::Merge(const TimePeriod::Ptr& timeperiod, bool include) void TimePeriod::UpdateRegion(double begin, double end, bool clearExisting) { - if (!clearExisting) { + if (clearExisting) { + SetSegments(new Array()); + } else { if (begin < GetValidEnd()) begin = GetValidEnd(); From 2fd67099526c1a1ea170ddba68a23aa591c9e770 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 18 Jun 2018 11:05:56 +0200 Subject: [PATCH 0032/1162] Remove ApiUser password_hash functionality This affects and fixes - Windows reload - Config validation - RHEL 7.5 OpenSSL memory corruption - Hash algorithm, requested changes refs #6378 refs #6279 refs #6278 --- doc/09-object-types.md | 1 - doc/11-cli-commands.md | 1 - doc/12-icinga2-api.md | 19 ------- doc/16-upgrading-icinga-2.md | 5 ++ lib/base/tlsutility.cpp | 30 ---------- lib/base/tlsutility.hpp | 2 - lib/cli/CMakeLists.txt | 1 - lib/cli/apiusercommand.cpp | 104 ----------------------------------- lib/cli/apiusercommand.hpp | 47 ---------------- lib/remote/apiuser.cpp | 38 +------------ lib/remote/apiuser.hpp | 4 -- lib/remote/apiuser.ti | 2 +- test/CMakeLists.txt | 2 - test/remote-user.cpp | 50 ----------------- 14 files changed, 8 insertions(+), 298 deletions(-) delete mode 100644 lib/cli/apiusercommand.cpp delete mode 100644 lib/cli/apiusercommand.hpp delete mode 100644 test/remote-user.cpp diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 1c6436739..2d81d3ee3 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -112,7 +112,6 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- password | String | **Optional.** Password string. Note: This attribute is hidden in API responses. - password\_hash | String | **Optional.** A hashed password string in the form of /etc/shadow. Note: This attribute is hidden in API responses. client\_cn | String | **Optional.** Client Common Name (CN). permissions | Array | **Required.** Array of permissions. Either as string or dictionary with the keys `permission` and `filter`. The latter must be specified as function. diff --git a/doc/11-cli-commands.md b/doc/11-cli-commands.md index d288c64f5..1b5011683 100644 --- a/doc/11-cli-commands.md +++ b/doc/11-cli-commands.md @@ -20,7 +20,6 @@ Usage: Supported commands: * api setup (setup for API) - * api user (API user creation helper) * ca list (lists all certificate signing requests) * ca sign (signs an outstanding certificate request) * console (Icinga console) diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index c029aee0e..722b88a2b 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -21,25 +21,6 @@ If you prefer to set up the API manually, you will have to perform the following The next chapter provides a quick overview of how you can use the API. -### Creating ApiUsers - -The CLI command `icinga2 api user` allows you to create an ApiUser object with a hashed password string, ready to be -added to your configuration. Example: - -``` -$ icinga2 api user --user icingaweb2 --password icinga -object ApiUser "icingaweb2" { - password_hash ="$5$d5f1a17ea308acb6$9e9fd5d24a9373a16e8811765cc5a5939687faf9ef8ed496db6e7f1d0ae9b2a9" - // client_cn = "" - - permissions = [ "*" ] -} -``` - -Optionally a salt can be provided with `--salt`, otherwise a random value will be used. When ApiUsers are stored this -way, even somebody able to read the configuration files won't be able to authenticate using this information. There is -no way to recover your password should you forget it, you'd need to create it anew. - ## Introduction The Icinga 2 API allows you to manage configuration objects diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 2b8d486bf..cf509cf33 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -18,6 +18,11 @@ The CORS attributes `access_control_allow_credentials`, `access_control_allow_he The `node setup` parameter `--master_host` was deprecated and replaced with `--parent_host`. This parameter is now optional to allow connection-less client setups similar to the `node wizard` CLI command. The `parent_zone` parameter has been added to modify the parent zone name e.g. for client-to-satellite setups. +The `api user` command which was released in v2.8.2 turned out to cause huge problems with +configuration validation, windows restarts and OpenSSL versions. It is therefore removed in 2.9, +the `password_hash` attribute for the ApiUser object stays intact but has no effect. This is to ensure +that clients don't break on upgrade. We will revise this feature in future development iterations. + ## Upgrading to v2.8.2 With version 2.8.2 the location of settings formerly found in `/etc/icinga2/init.conf` has changed. They are now diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index 9b3c33fb2..c3fe07bd9 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -784,34 +784,4 @@ std::string to_string(const errinfo_openssl_error& e) return "[errinfo_openssl_error]" + tmp.str() + "\n"; } -bool ComparePassword(const String& hash, const String& password, const String& salt) -{ - String otherHash = PBKDF2_SHA256(password, salt, 1000); - VERIFY(otherHash.GetLength() == 64 && hash.GetLength() == 64); - - const char *p1 = otherHash.CStr(); - const char *p2 = hash.CStr(); - - /* By Novelocrat, https://stackoverflow.com/a/25374036 */ - volatile char c = 0; - - for (size_t i = 0; i < 64; ++i) - c |= p1[i] ^ p2[i]; - - return (c == 0); -} - -/* Returns a String in the format $algorithm$salt$hash or returns an empty string in case of an error */ -String CreateHashedPasswordString(const String& password, const String& salt, int algorithm) -{ - // We currently only support SHA256 - if (algorithm != 5) - return String(); - - if (salt.FindFirstOf('$') != String::NPos) - return String(); - - return String("$5$" + salt + "$" + PBKDF2_SHA256(password, salt, 1000)); -} - } diff --git a/lib/base/tlsutility.hpp b/lib/base/tlsutility.hpp index 31bb4e466..38df7e587 100644 --- a/lib/base/tlsutility.hpp +++ b/lib/base/tlsutility.hpp @@ -56,8 +56,6 @@ String SHA1(const String& s, bool binary = false); String SHA256(const String& s); String RandomString(int length); bool VerifyCertificate(const std::shared_ptr& caCertificate, const std::shared_ptr& certificate); -bool ComparePassword(const String& hash, const String& password, const String& Salt); -String CreateHashedPasswordString(const String& password, const String& salt, int algorithm = 5); class openssl_error : virtual public std::exception, virtual public boost::exception { }; diff --git a/lib/cli/CMakeLists.txt b/lib/cli/CMakeLists.txt index d92c22c45..258597dec 100644 --- a/lib/cli/CMakeLists.txt +++ b/lib/cli/CMakeLists.txt @@ -18,7 +18,6 @@ set(cli_SOURCES i2-cli.hpp apisetupcommand.cpp apisetupcommand.hpp - apiusercommand.cpp apiusercommand.hpp apisetuputility.cpp apisetuputility.hpp calistcommand.cpp calistcommand.hpp casigncommand.cpp casigncommand.hpp diff --git a/lib/cli/apiusercommand.cpp b/lib/cli/apiusercommand.cpp deleted file mode 100644 index 5bd77ab89..000000000 --- a/lib/cli/apiusercommand.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2017 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. * - ******************************************************************************/ - -#include "cli/apiusercommand.hpp" -#include "base/logger.hpp" -#include "base/tlsutility.hpp" -#include "base/configwriter.hpp" -#include "remote/apiuser.hpp" -#include - -using namespace icinga; -namespace po = boost::program_options; - -REGISTER_CLICOMMAND("api/user", ApiUserCommand); - -String ApiUserCommand::GetDescription(void) const -{ - return "Create a hashed user and password string for the Icinga 2 API"; -} - -String ApiUserCommand::GetShortDescription(void) const -{ - return "API user creation helper"; -} - -void ApiUserCommand::InitParameters(boost::program_options::options_description& visibleDesc, - boost::program_options::options_description& hiddenDesc) const -{ - visibleDesc.add_options() - ("user", po::value(), "API username") - ("password", po::value(), "Password in clear text") - ("salt", po::value(), "Optional salt (default: 8 random chars)") - ("oneline", "Print only the password hash"); -} - -/** - * The entry point for the "api user" CLI command. - * - * @returns An exit status. - */ -int ApiUserCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const -{ - String passwd, salt; - if (!vm.count("user") && !vm.count("oneline")) { - Log(LogCritical, "cli", "Username (--user) must be specified."); - return 1; - } - - if (!vm.count("password")) { - Log(LogCritical, "cli", "Password (--password) must be specified."); - return 1; - } - - passwd = vm["password"].as(); - salt = vm.count("salt") ? String(vm["salt"].as()) : RandomString(8); - - if (salt.FindFirstOf('$') != String::NPos) { - Log(LogCritical, "cli", "Salt (--salt) may not contain '$'"); - return 1; - } - - String hashedPassword = CreateHashedPasswordString(passwd, salt, 5); - if (hashedPassword == String()) { - Log(LogCritical, "cli") << "Failed to hash password \"" << passwd << "\" with salt \"" << salt << "\""; - return 1; - } - - if (vm.count("oneline")) - std::cout << hashedPassword << std::endl; - else { - std::cout << "object ApiUser "; - - ConfigWriter::EmitString(std::cout, vm["user"].as()); - - std::cout << "{\n" - << " password_hash = "; - - ConfigWriter::EmitString(std::cout, hashedPassword); - - std::cout << "\n" - << " // client_cn = \"\"\n" - << "\n" - << " permissions = [ \"*\" ]\n" - << "}\n"; - } - - return 0; -} diff --git a/lib/cli/apiusercommand.hpp b/lib/cli/apiusercommand.hpp deleted file mode 100644 index 4a4bfb280..000000000 --- a/lib/cli/apiusercommand.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2017 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. * - ******************************************************************************/ - -#ifndef APIUSERCOMMAND_H -#define APIUSERCOMMAND_H - -#include "cli/clicommand.hpp" - -namespace icinga -{ - -/** - * The "api user" command. - * - * @ingroup cli - */ -class ApiUserCommand : public CLICommand -{ -public: - DECLARE_PTR_TYPEDEFS(ApiUserCommand); - - virtual String GetDescription(void) const override; - virtual String GetShortDescription(void) const override; - virtual void InitParameters(boost::program_options::options_description& visibleDesc, - boost::program_options::options_description& hiddenDesc) const override; - virtual int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const override; -}; - -} - -#endif /* APIUSERCOMMAND_H */ diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index 02a6efc07..d7b40d13e 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -27,18 +27,6 @@ using namespace icinga; REGISTER_TYPE(ApiUser); -void ApiUser::OnConfigLoaded(void) -{ - ObjectImpl::OnConfigLoaded(); - - if (GetPasswordHash().IsEmpty()) { - String hashedPassword = CreateHashedPasswordString(GetPassword(), RandomString(8), 5); - VERIFY(hashedPassword != String()); - SetPasswordHash(hashedPassword); - SetPassword("********"); - } -} - ApiUser::Ptr ApiUser::GetByClientCN(const String& cn) { for (const ApiUser::Ptr& user : ConfigType::GetObjectsByType()) { @@ -75,31 +63,9 @@ ApiUser::Ptr ApiUser::GetByAuthHeader(const String& auth_header) */ if (!user || password.IsEmpty()) return nullptr; - else if (user && user->GetPassword() != password) { - Dictionary::Ptr passwordDict = user->GetPasswordDict(); - if (!passwordDict || !ComparePassword(passwordDict->Get("password"), password, passwordDict->Get("salt"))) - return nullptr; - } + else if (user && user->GetPassword() != password) + return nullptr; return user; } -Dictionary::Ptr ApiUser::GetPasswordDict(void) const -{ - String password = GetPasswordHash(); - if (password.IsEmpty() || password[0] != '$') - return nullptr; - - String::SizeType saltBegin = password.FindFirstOf('$', 1); - String::SizeType passwordBegin = password.FindFirstOf('$', saltBegin+1); - - if (saltBegin == String::NPos || saltBegin == 1 || passwordBegin == String::NPos) - return nullptr; - - Dictionary::Ptr passwordDict = new Dictionary(); - passwordDict->Set("algorithm", password.SubStr(1, saltBegin - 1)); - passwordDict->Set("salt", password.SubStr(saltBegin + 1, passwordBegin - saltBegin - 1)); - passwordDict->Set("password", password.SubStr(passwordBegin + 1)); - - return passwordDict; -} diff --git a/lib/remote/apiuser.hpp b/lib/remote/apiuser.hpp index 44cb84df7..15b1c41e3 100644 --- a/lib/remote/apiuser.hpp +++ b/lib/remote/apiuser.hpp @@ -35,12 +35,8 @@ public: DECLARE_OBJECT(ApiUser); DECLARE_OBJECTNAME(ApiUser); - virtual void OnConfigLoaded(void) override; - static ApiUser::Ptr GetByClientCN(const String& cn); static ApiUser::Ptr GetByAuthHeader(const String& auth_header); - - Dictionary::Ptr GetPasswordDict(void) const; }; } diff --git a/lib/remote/apiuser.ti b/lib/remote/apiuser.ti index a767f833a..36ec98704 100644 --- a/lib/remote/apiuser.ti +++ b/lib/remote/apiuser.ti @@ -29,7 +29,7 @@ class ApiUser : ConfigObject { /* No show config */ [no_user_view, no_user_modify] String password; - [config, no_user_view] String password_hash; + [deprecated, config, no_user_view] String password_hash; [config] String client_cn (ClientCN); [config] array(Value) permissions; }; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 29a16646f..789550052 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -43,7 +43,6 @@ set(base_test_SOURCES icinga-notification.cpp icinga-perfdata.cpp remote-url.cpp - remote-user.cpp ${base_OBJS} $ $ @@ -142,7 +141,6 @@ add_boost_test(base remote_url/get_and_set remote_url/format remote_url/illegal_legal_strings - api_user/password ) if(ICINGA2_WITH_LIVESTATUS) diff --git a/test/remote-user.cpp b/test/remote-user.cpp deleted file mode 100644 index f43816a19..000000000 --- a/test/remote-user.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2017 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. * - ******************************************************************************/ - -#include "remote/apiuser.hpp" -#include "base/tlsutility.hpp" -#include - -#include - -using namespace icinga; - -BOOST_AUTO_TEST_SUITE(api_user) - -BOOST_AUTO_TEST_CASE(password) -{ - ApiUser::Ptr user = new ApiUser(); - String passwd = RandomString(16); - String salt = RandomString(8); - user->SetPasswordHash(CreateHashedPasswordString(passwd, salt)); - user->OnConfigLoaded(); - user->OnAllConfigLoaded(); - user->Start(); - - BOOST_CHECK(user->GetPasswordHash() != passwd); - - Dictionary::Ptr passwdd = user->GetPasswordDict(); - - BOOST_CHECK(passwdd); - BOOST_CHECK(passwdd->Get("salt") == salt); - BOOST_CHECK(ComparePassword(passwdd->Get("password"), passwd, salt)); - BOOST_CHECK(!ComparePassword(passwdd->Get("password"), "wrong password uwu!", salt)); -} - -BOOST_AUTO_TEST_SUITE_END() From ffc9e13965bc0c5f289e6a660a650f32a9d8a006 Mon Sep 17 00:00:00 2001 From: Carsten Koebke Date: Tue, 19 Jun 2018 15:03:18 +0200 Subject: [PATCH 0033/1162] New ITL command nscp-local-tasksched --- itl/command-nscp-local.conf | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/itl/command-nscp-local.conf b/itl/command-nscp-local.conf index 33677fccd..ca69ea2f2 100644 --- a/itl/command-nscp-local.conf +++ b/itl/command-nscp-local.conf @@ -293,3 +293,68 @@ object CheckCommand "nscp-local-counter" { vars.nscp_counter_less = false vars.nscp_counter_perfsyntax = "$nscp_counter_name$" } + +object CheckCommand "nscp-local-tasksched" { + import "nscp-local" + + arguments += { + "--filter" = { + set_if = {{ + var scheduler_name = macro("$nscp_tasksched_name$") + if (len(scheduler_name) > 0 ) { + return true + } else { + return false + } + }} + value = "title='$nscp_tasksched_name$'" + description = "Name of the task to check." + } + "--folder" = { + value = "$nscp_tasksched_folder$" + description = "The folder in which the tasks to check reside." + } + "--hidden" = { + set_if = "$nscp_tasksched_hidden$" + description = "Look for hidden tasks." + } + "--recursive" = { + value = "$nscp_tasksched_recursive$" + description = "Recurse sub folder (defaults to true)." + } + "--warning" = { + value = "$nscp_tasksched_warning$" + description = "Filter which marks items which generates a warning state." + } + "--critical" = { + value = "$nscp_tasksched_critical$" + description = "Filter which marks items which generates a critical state." + } + "--empty-state" = { + value = "$nscp_tasksched_emptystate$" + description = "Return status to use when nothing matched filter." + } + "--perf-syntax" = { + value = "$nscp_tasksched_perfsyntax$" + description = "Performance alias syntax." + } + "--detail-syntax" = { + value = "$nscp_tasksched_detailsyntax$" + description = "Detail level syntax." + } + "-a" = { + value = "$nscp_tasksched_arguments$" + repeat_key = true + } + } + + vars.nscp_modules = "CheckTaskSched" + vars.nscp_query = "check_tasksched" + vars.nscp_showall = "$nscp_tasksched_showall$" + vars.nscp_tasksched_recursive = true + vars.nscp_tasksched_perfsyntax = "%(title)" + vars.nscp_tasksched_detailsyntax = "%(folder)/%(title): %(exit_code) != 0" + vars.nscp_tasksched_warning = "exit_code != 0" + vars.nscp_tasksched_critical = "exit_code < 0" + +} From 361a1868df0d9ca56a1268d0dde8e4f16f967f8e Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 19 Jun 2018 15:26:54 +0200 Subject: [PATCH 0034/1162] Docs: Update Windows wizard images --- .../icinga2_windows_setup_wizard_01.png | Bin 31609 -> 26523 bytes .../icinga2_windows_setup_wizard_02.png | Bin 42327 -> 39043 bytes ...a2_windows_setup_wizard_02_global_zone.png | Bin 40955 -> 37111 bytes .../icinga2_windows_setup_wizard_03.png | Bin 33620 -> 28144 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_01.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_01.png index dbc9d9448958820e6673e7f9d932be54257a39b9..fe60d93772b7145916b4c9e9fb59e35869f438e4 100644 GIT binary patch literal 26523 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 YOZO2s_3Wj*#Uan~jP2?2lUMKl2T3)o^8f$< literal 31609 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 JQYGuR{|B_F3+4a- diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02.png index b065056ca8012d1767ae2a03f4c52c3b9e3aa5fa..24fa2641ed6d72631824efbeb72776878602556a 100644 GIT binary patch literal 39043 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%0AI<)XQAX3} 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 literal 42327 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 Kr98!lFaHlzO0|3d literal 40955 zcmb??by!_J_vHnOyR^6$_u}qSTHM`=7k8()Q;NI07k7u^?(XjHbLjhi^ZVv`X8s#` zxjiH~Imu44*UHL1!Lrigh;TS?AP@-gvxJB|2n22i{2IYP0V(XoP~^aWQ2JlQML@4_ z|1w(gqk$AyYY8==7*f~UFIb;d!8afg+WxbYDD(yd4k|W7r>XZl5Qqr$Swv9LdEsc; z%NloAkK%~|t5<%v^qZ`3jm`IY445FMZu5@=dFEMV(Uc%zrc>MwWBsI&oNxHZpTDmD z3VQg2Idh;Uy=O3zq9AbH0`VtQ;lgs^3X&ImlIhQ{3cNb1eVpHvWDJOb;4uAB`0P>I zsBxC$zv$pk37g<)y_X>ceE0=C_?ht(;E(wD9R=N=c^-x9ZjoDmfk1oqD0`rfvh~{~ z+10Jm_ibDtSgnKO#@M(zv__>p!qkDs--Ev#l}Iux7%y*|i{rCB2j_Q+ZVMGz@zH`8 z50yP%7G*HTA`M-p*qo{pPd~sNCqt9ivmYalat*AHK;l}vu^2|GPpwa_iI(qkC)unKxq(uAZGG>kd0^id zw)u5|y^-hD^MFN%VQZ27xvE$}yKL}D)R5Hw$zyi^;<13rQ+u$&WB*38)cA^kdUYg8z$;me)}fE`UlK=@wj(0k{_vVG4(w-JpS-oe%AZ3 zeOcwb=dRwqzVpfSm+JO4N3i?=nRTBTjkuAG-1T^CN7L&?kM$|WfI$EB_$jz%YwG*7 zbxjAIT&}dnpYws(&vxq=0Ww;uJ*^6q(Lq5bh?)(yWaa7MM$XQvRoW_LnjL3n)^dZi zDoyixN=om6F8$6^;JU|sXf(s*4E|+4<9g5T8RmEHn^d6k9dHLl1eGvKDFSdSAjNJHH%`em+C z7+LX1JGm9;ow{&rY%C|ls@P>Wx{U6VIDhAQxjR|$%Uhf7B0c>m(wwsj4CBZYPr|g6 zl>GY$z3}=X@F75WeC}8l78XH$n`(k1$Bx;hrKKzpVIj|R=?I3dM{}8HX?IGR%astW zJq|NLp3si8J;aD1bXuAsJzdBUDw`8%nwsy5imC5RDM&~b1i-G&R9bz`37;wHzDo*9 zQ*D(hHY^xOYr7q@?%8tz&*C_i<2h}jVWtt!sUP7ms!7kyrgx6HP*rD+Ar>G zD=IzasMp|YBzt+WhLld%eg`^ou7{M7?9%>Xd_FN}stH-KxgIEID%yx*6&l??L&8mn1xQdf2j7*7hQ3WJ7(z@})Z(JxBI%>HZ_F`Dt7wdSqF|Fc zz*$r&8!%DUWRf+dgitGPV$jnci;McBEIHy$LF60MTU)a`=1=q1JQsyB=zTp5fJR%v%ZGHc5{j+iByx+Kd0J9fHH@1aIS< z1DI`0e0&kJ+HQ!uBdNmX=H@GcmX(c=$1-N3{>2;~*Pw+(WVqb`$X#o_SHYuR$P^sz za5!`Bv?WB^R1a7KP!3q_GW51Wfw6V1W!=HluD^mHE$>nmqgx{`^rD9KO)e8cdR%8- z{cxqIVqNuSKO6{CdOf$wm1o`(@>6GWE%1yy9J=G<0#&Zi_+E@WS2-|`9;NOL5cNiV zh}o3VQ9$bh!p0ZS1{19^t~H~<;QPmPKgLa0U~L#M2I(oc=#=T3io-7;D+e7boN53o ziJE5&OtprH!jBWS6(`>>h5|1WDZ^<&0qA&tekb!Am z*H5S=>Kj6V>wV@6zku~ElqsZGqF-<^GDT@y%0HfEY7Jf|)S6k?!W3oz`@`>+(nTO{ zR$tYcb$#N}gC^js*TK3jnu~;(&hHtEL#4{S+(GHm_s3dt1R2xQXTojV+sYyrRn+GD z6q&UhNk~o8Z|?yurT%=MX1%(yGBQFfxZUu3$-KNJz-h$=8ky$|1ky`#m>0CH$_x9b`Q>TCbXmhqM8rDODos!LVN3p`QBAglQ+BpUS66L!nB#{xYIv3RJFMX!+yuQal`vYDIarWz_PE> zFEmu8r&#Q|K!DF-7O-`3q4|6IZh41yAkCf)Q5)P1iCn!pNu6~TpZp(NM4J8t??dx# z9?T%GLM-aN6$IO<`BfOxJ^QEY0FSC@{j<2FM6rc3OI2|+ak0*d5Q&g43}|5WVs!J( zf;ko;VISaP*#9`+mn# zk&QDAXIJv&oJ^M~NKZ|&zY(NYN1zfI7=;&8R-5JF1?dfk_uU1HAw2hhUhAuF0TM|< zGf1EPhEQS}b$Yr$y0`}kFoXa4dU5~Fsq%ht(E&b3xLFRp`ZA(0YXyw&1{bDuFs6Y7 z;?g;zdfL!31LtELfFW>5w!el#NkTY<@{2v1$}jLGM@1bsLJ+-IEe(Z> zGk12zlHob`Gixc+Z19PukojP7&~!tiMXBO;e$sR*{aBu}#}2P;%96w#Ud&Apkk-cw z+@4oCE~MUS>t8)EFp!nrrJB}$Tn!00RxEt{p7fXf^sLfSy4@;uG9@J?bNkJ;E4L|F z%#TOA&tpJe_9Ai?AMe^^hT3lA7dk^R89v+{DG|Rb+v|h@78?n55aV!>^|P>&()2?5 zqu3iVLedyuqPzjDZNenk9Q<1n+2_6}&Nq~kSB63w`is6LwxGG|S$Aa$;4ittd87=4 zu}X?J0G7lUO?*Q{{e-``$Qm!f_|F}*sS&&XTz!w*^w{}ZRt21k56lO+EKuAZINkVz z_f}hfK!Z#S^S?zCXlM-n)Gd{b&?VL58@de;W`4R}p22!*g@eHzw{}N)Ey_(HwoSiq)LKzNgE*u|)~|2lY|HGnP$BX@FkIsO zQyl+wYI;KlWV3ox+D`-xid>0b-Aie>sKefRvoxHd_7P&M+c8w0e*Cz}T(CL2)q1Oi zP<^z{p9+sJoHxpr5FpLQ7hE1!D@bh~r@{=|2;N#~oz*({S<98qQ2rLbO{?yD_BUdt zSB8~_^hA6AxH4eDaWhANhYYKCc!xP0vOB>kJ+j^M+!DKZcJ0yhtK$s!x`|Wt3t$PS z9Hq9=B@LCb%{iHoO`veXL$c#f3|aUzcU9c;i-+rp6kwdj&6sjgV&K7O zWy;H0T1%CEH)}wbG0IJ1365*(Y?C(}fo?SX(;7=wU<}Deqb7d?{lG)^#OYfN%JpX# z;HW#%Sq-PKqUCwtl#*iRalS;hGT{fbA8SW>a3yu|!qaNd_@v{eX`rf8BM+D>5xsBY z-L)iEJeGUd)=`+>Pe!d1tljhHjhVLQ>V{ zUHNzgdS9E#2v^?;kmpCEYY=a<6>F_*^6=2A^=4bmCKvc{uh#&5=lRxLJekubLY>#6 zvg%_UAYGwykmDx$lCvwp-Ys^h@$(|*g=BrkxcL3C`qV*73MhYSq_S?c?_4&lBLX0y zsj;P^#0sJJ(7)Wf2D5LKK6d#}C{@rQuS6rbnc*OEue)W@AM%C=r1leSI-gCd9Uhl1 zL9L=Y+=)G(lsMD@b{O=%UAtBe-Er}0r8xNQqq*bQy87hiqO;!Q@x^7~SUqA2Hw0~K zYGM9jjrVPQFSsy&0rr;U8TvdK(9rC59B{yC>tAp6sEp_KU1p|MhsTM^{6W4ES(_Ma zw@sCB2wOjg=%du}02OcD4KUt}Z!3*d>&-wkjJz$UFC`VRhX?DLwy|`O(!exX*wRA+ zMKq($@T4Ct3~M-ZomCm8Qp71Kw-D3)!F%j?d0TM?{G5^b5d6ZMt8G!r@o~_natK;x znV$))R~l{cWuQF+w7fjvBBJd~GaVk|Z1G;RIB7s0&s9wm3(vWP0c#wbfu!Yr(bqAL zy`)WcGsWA?w_6C#{&N})beux4Fr;~r5hJ>%XZ-7Knee6^oU7x)K*QAi8J*U@I!nPd zI$nNAd)$?n@z?@t19CH6VAjV2BJ+Z+9$`Zaf)Ek0dN+;tfZ05803-D>2I2~T>C?#SIy&$ z+!_ChsqJM&wd=@irTVnQFOIS5bVRW`DOUV8=?!N6T#puBG)x_2X>K2PJ;Cg@tqdOH zE>cEIW8=w|Gq5GXljw{O9!}`ezrK_y_Boa3gS)h5Cjo0-(cQ4!s`Rtq+pJx6+w?g& zT;;!oABG24?gEU^Wn)W!s*(9E;%6abCE$&6TgZ{EZR5*|p-oK}IPDIUsdNX#dn2B= z+!y}r+U5&*SiPcIX*Hzr%rZ`%t|s%@zJbG`!EhSrykj`hHjUZoc!%z3Q|0g+u#RX0 z%7!!%a{GjZ9O&cdbaYyl++NV`Tc^M9BNWC_A^*G&GeZLaD%h_9m=c0-GaFcdzf?@v za2$ld6=vJ zjD7@M!`+LFSJdSa^?uO|ccQz9l(gwQ0DAluye?z%jr~@wnd-szUcC2?kJElsvq%KN_2hnMt|3p0jxG+{L)Qc&E0VBMpL)`hcux2aiX-Yu1vGfnEm~t z@vUzQhXz({>5i-H4RND6mXuEbguoF_h&@~OghB(TW!y7LuVuNsrQ++^c7F@3;QagMIiSrlZqE`e#P^TD zB4J^$thYaAH?53M5ibM!It~SI2Le_Q)=Hy0uLYc}YyGpj>-kb{wP}af zlNoRCiYFo9b^G&4{*1o5KDXquV#h`codUC&qFiKIqXALD>q_DRJPH_X0bnq5Af@i7 zTNdkLjCq-rXfzF1^0t5mlrP47UzLwIWq;LH=Y8`E#;;>JbE`aFZ%!KBkCTe0XWMzw6(_H9|F&AS2yS0mL$qw3IBox5l3a7jDJJUCJ1Wo1!=J&M3oNL+zxWn|D3Rg0~ieP>H4JC4%_Y$+Y z=7n}(+q;lENkxi_0axmwuU|*T+c8JA25>~9;~xPxm`I_G*TM{2P#AV)k`(SnV z`K@LOuJqA(jteVp$=??f_FI4@iUVTa_*0at@Pfn~&U5QV1AunwLaSHFIfFP zal74XdGCDH3U{~il56zySK0_sc$jI8psRiW#!L={ae)@g1OOp(HP3Zt&vtEpxKmhh z9Q98}EI1G8>gsGYw0GYdrA@xAfAh_|{IWR5zpS!xvP%=Y=?4Hf1@`|?$bY_3yZ*Aq z|7X%a`Qzm9cG1z%N030Tvg8r%q@<+&_ch*M7EHa)_%C%vL$W&pe=7%Eq!^I_S8sWy z%Ks+)%_I5CQU61oeL9x{2|fR46TOucWVc!oaUqFne@f@+Uiq8E^m>N;>iwHeqqgE7 z<~=r3s^K#7mqSziLz@2~;r~`kO*_T z66w&};up!q-AUX0{Fi3~m)1MG|8(saqFs~YZ%n{qL6WRP#|!4v3%x${yqXUfcVLw<-eq=QWoE=d3tzpM_S zn3)`gUVn6r<%DAZcj!LRKVtAzxskm@is$+(pT1tF~ z3z2CUZdaR5bP?J(Ep1n9?8O1R+`&DC>rLClN4U#wf+lpM~z>hqd({4UGJtd0b+W@pCX1TPWQ^%{U7mdRrW)2E~^1HudlA9M7NC z8}iUw_Qc~I8Xjva8eQFnOu;ydM-js-z9{&0fW#Pm1Y~jUiv(GHIL6I;6Q){M&}lei zz8H8J))>NtC-w=rCizZs2PFA}O-;kf8)3*W&@md1QDy2q;h>KL!LnlrkLFGXv_{Apf7vt(xEAUSwff95!CB zXRk>xE)2}%_>v|f>GSXWNu@#sHR(s{hTZz6%y6^a^*E_J@HDc8}t2tvKWb3Hd>>UjX6M0Br*>YjY{V*1#o!y| ztA~c>%nqAhHo?12M;0!BRB{;>T4_k!wUiI^W+-AEpYjNR!4f7F*sW>{vDU=dQb;$q zKEiA*_luIdOuz`ZG1{L~HCc}UyCY~m0Ra*!8=I7rbOPlEhXb3BH-!VA#sa5M z|7Cd2Y>x(&fF^w!G-mPz=|>vz=VUr@7s*o{Y0e&M_NwJjml)Dwh7XwE7?OUN`OZZ^ zZbxyNijdD@=N^o;St!3{7(IgFfUOfz()P`gVTlqpOb1Z9L z4VEv&gv(z$x}tp59xj|H_dj7kWQs&|RWVyuW%Q1Ez){>)29S%x{b8T0(1&$g{FKQ`<2u!kQ2D$)OWN zdKdgi`=0P6Z1xb!n~5O>YF(2R0cP;<$#JOR5*v9yDeVl>Oq}81ivC@cIH&2Uj$niO zY5am#s?6g9swL_yE=;ISk+S_Ygr|*U`6Qt-K^ymYD2muv)~xx8IenXlhN>1fCQ-zl z$#sKlnY~;<%{)Rv?l>7u zgxF32Ij8!AJzqM5Ue){@da?xVo{&}swhg-#cvXXA33RQriL^gD>UgT5tE(%k*p3PB zpY%0ZcF>g*(;tAEEyLRDJiuFRoW34J&Y{1d8kv!+D~@6OO31&MiIK1NCQnFmzCoEj z!(VVTOL*)OcdYmi#$nGx|BHunkZ%_Ve=)I|K<}hsH_hNbx47NR8_)k$%W`pc{wbJS zoT4S*@4D`fIR`5ul03)Wb}!`!-i2r3ILiOZ!~FwbZmv6t#&fV_0h1;FQ*$@t8%ud3 z@%jXF-wC=UbFZ0@zq{h{R9>42qtM4gS0+HSwGg<@M@p3_((XyN7}*)lvRd%sYIdlm z9fx*o+7he!Kp%e#gyc#^0zPpaCZ05+(0Y{!B#p|~l#VWDiyHop0B=pj+mZYP3K&~# z;M?xwfe@%dhXNIx_G$7&)ZZ~5vw#FKxuCt%IBgp0u;Ej&*T1%|Xd;_I9sClMZSsKP zNd5sfI-p*L{ZX0JMNS)^}g`5@>}esqI^0XAH6pfF%6{8tm)mJ@!W% z{o%lZH@7NQrNnyB!Hg2Hd>AlIw9P=X#A|dnO>JJ$xql4(q)>R4H_c~`dGvx#gOi$^ zxE~;QENW19b2vE8;@ADNT8cCYA2ESnM_`LmIaOIbGTf5&29Q}}WfMYObgLTHZ05gB zdQE)!ZJ0*HliC8~?{U?^HWjgvPqvvM%v%)4_hR!mD% zU+a5XhH5$ZAQBYg#0x)7w9IDZdeO^pH@)pe>^z=%i z1aDQFI_VF>lXMU)YF13$HgwWuq;5%5o27)(&`L;k=*Zzv&y`1}tf_>EZa7FRKK^~I zrtXn2O)dUiCUA~ma4l!97H@mI>hz8K2Xca7{42+f-sipc4(TVLh-LQzBxv^t<`zo# z>L$CjmC$Z-!#;aDe1EGtlh%*Yk^xG_7+yF1i!^gqE_#|OLYg$cS@XozH^e7(g+eF_ z*BG&KmIL`o*6=$`{xNQly;NwqOt8a%mLq`S9#S7eVZxn*UJCC= z@u8@Mxf{TS#sM6zU()sG=0l{&TSN9A)5w>xpxEk*>D^12UWWJ*Bie_rvpwexYhX#e`_oN15YUV+q6-}}=& z9#$-5L0+batv!R+al%ir95mREF+w^KMDc2o)0U6wx2&kBOhbk+ow;=#5Hu;43=fB0 zK}N%v0KgI#b?1GM&(wO{|}mqo}}&9m!&>Dg2#gf1>=6)~)gbBP=Qv4orS35YbW8oyI zPr+fB^fKJ+!Os%A3mf@#^;sh2=t&#JmlOCumd&y=Kn0Uu)q|yTKrS34%Y>66)-#6c z;Yp@dq`O4cxgY*IZ=GSp%T`y}Ir#xWpJ3nV4|#B%AQC9;809-Bb_Khg;Ep5`kTi8@ zs%X_DpI#F{9FbEP8~vs10`NWAlfX%X->{K^Oo?woUjTZqY4}+#EfzwjSxs3pxFF{D zA4Xp>RexY=JA(m$=RW>O$~6x*d8haB0*)BadvMZRcCg(qlUKiq#{})~o30pJ@?xj( z3S^vxq5+aHiZ2D|s=oAa0s11JGT{N_gzO7!ZRLmu<{=OJ;cgrKsUT7;ZyRp~CdUxa zgn7^a6psrf{fo{2L1>O)$-#>u=FtjtAQNk+0OOn*2qnl0_x-=X?LYVY^ZhRZ|Mwr& z4QF{BiWNX#exwSBR0p5$oFUlRLp#6R@6Nx0I||{fsw?n30J#6>?rPg{$}Bm@uA*Dq z$HX8utv7s{Jj|Ru%&ePVgDsPS@S(398X{C-bn>tu=nhdquh;BZ(nh@r9QMW1KdaYN zZCPdtMoL9$+=_(sy7?LKUl_>oKvA>ltQxQzg`9TKgq)m8CBF`UNi?(*K2O#*>&Npkd=(A{YOW9k9)| z>27)3JA;d$`o>Jt#bFZ)<1R3Mzrkv1Kc zc$@&>!P{pjV-W@)6kI<(=7}X0jnDB8nk4ugS}+VApTa}D zojr<2*MJ_m#r-#Eq~XxTU;t1G{fOotO6k{3MBLko-}{b#4nv;R2LuvX1yADdq7JhA zG}qfW*9lHUzY;pWl7RQQr=yT#EEXhU#oUT^Jer{42L{M-6Soou`rTrx6V@1ftw~pU zkScvKd(NxHpS~^j_@MZZulnc@Oq>vO`z)B*#c@h9Y+v+A8}^dJ`A@*bBxFGGd%t<~ z79$o7b`y_Mt%^sPl94^lE1n(PAx6U%U6I?b;KAMR7HV44q1>&nSiq!&B@i6CD9aX) zOxmCBO{k};A7mF-e&YLlif2b8W+JuhGx2HABiOZr^oL^pDhBE$$Focq<;a*Jk0pwe z3*5VRVc|&X;bO_`9VkbRCea(3Ir)6Ep0=RoM@nrGX7XL!LI@?C0pPjnTn&}1}@W}5eINp3#%Go>A zP{T;RhVK(s#qe+ZU_{$bsHLFF1!WK~>emZCAnMrVmTJgiea5|p%d5?<1H>D{NZN&O zgLc!LG=q=;ccS&14Ri4AZ~Rs(noY=3yABYt5gNE65VwW)Bf|aEYBr;7S z4`XI(y;G4Ko#Wq!UN+$GjO3d7D9QNl%p$Y;Qexl5##6APdt23ha0?Ss!*cGWk)TUFticxp^Up|Q%@z{G<72i_DJdKNgxqG;377xm0s@+W7cd^b0scBjQB)+hT;dLwPP0Od?y4}c!+{xbZ~#h zVocxs$w-`XmS=ScuU!nBmgjHbIV5W?Sa^^TKv{*W8* zYdsGoyO|oWXr`*1YB0`tU|!VY;PxY};fTw)#t>Dy$HL5lG|bI)$*jxHfWF00W#CBw2Nd^~1Vcj)XxaP zhYz|0@AF5*hRI^bugqjDF>M#3P3WvMR7ZtWm%DYt=GyI|p3?Y3=7`~-}AaM~* zPYjNjQF}Jj*sP6ZmN{MjNell;#BLw@DF@fFJ;Kbs% z0r*-Qwu-Ykk)DnZOlWYy)47Tjq#KdnQf|1!^rMuYz(M)|I(O75G8)sh~Va%^N zQBd>(aXJ=;3V4z43 zN>|rl5xe-k0264|lylkq>GsWrAS1ory|3WHD7QV|z=g?U9|~%|Y+@-K?WQb8$-OGQ z(29%}U&&P7gihFy;ZsaV_L3uzCEbOKcQdL;l$ncZd;x_PfQXupMM@sz_ckAOo%vMx`R&R0sU$FCS|%Vm>`*y$|@NDWW?Oz z1IvLCFU}b4*xO*O9mRkLrK^mO?`NRsNPsrRm3IH)`1NDJSPZ97oCqXYlWS?OuMyg#*YZ>}1I` zYXKY9+SLsyt(Hf!Oe%9IV-l*m>epDZG`D!=UH8ST8pLqf5HsJq7f3&hmCAY)pLx}% zL7FVz4|`nX{-}X_AE7k8vpHuAG%>(*dLOfVO&q56N$7YaC^F#rQJo-gmQaW6*$Zje z^Jc}l%J;01@vQX(c#J7=BvK<|9adtkKGYc9!&(npvmh8~CZ$WReCjGthyLm)FiZS3 zT$BQOE$RKJzYv{Y)$$J$q7+YQ)s^5BkhY^Aaz$zFltCH8i zs4J{Q6n#^fUbyrYQ(r3Nm&90>$h9prmf(rPma`KC(ydp16(Umf%MPXWy&5gi@C00R5w*z(+|bh$q#~gcP~Et z@S^h!!LXZkts~p> zp&JV`b+Vy%a|ZOGv!~0^%gHJ^(d?j37}Bq(x4nC0FzGql!yWl!ah``)sqy}HbT zseRw^QsOOyHizTWo3ivDeJK-Arv}ge|Ip+A;k^I*0sohzf2Fhk=GFfu{ZqJ`F&@}` zCu<{nT=YSyoJpS?VELpG>Gzx%BttXpw$khtJg)*^n z8`FP4Akx(FH3Pvkep9H}xH1R&It&><2-ULUuluGtxJM2{%FtdDL~=Ngm*D#5S7Bz# zG5|Yus)^ddz+rTZ+4nQP>RO;~p5LE%I*vZE9K?SY{uG$vy}ANvKI1rjfHGL#Tq6Bp zkimYr8ntEUWw?r;<)(1r1_eIv;NvQxnFHdRvQ@GY$k=W|AV@U5Z#^CC5OX8iTk9*k zXe`+`1)le5kr)?Sp-f=`TA-mtVihUGW(km2@eS2T?SOD^Igirczdv0^0OBw|O#!sg@7T#NaK9#mcMQz3kmL6O3bpXCr*T8@}Q8!L>Q42~o%!D?uo} zj_^ggox79~5)&@Fmpj}!9=f&>Ojr7;#SV_C7#%9NQ8oPS;6>FPXC?v20wwJ}$feVg zLdoRo)OfPWKmQin_Q76!FaGQI!OwZ}@QdG58H08UT{x1J z-0D#T>w!o99XZQDc8@99Lg{`3fx;GpnF-*b?}bD%4p4JJUl z=``G^n4RbOj;@w*;fVKagj3HO8lvAJkL7UIB(_EsFBaWsJf^mIobWy--cCZ%a5({8 z+Sk_0@YX8gM^@B z^Jl~8Pph^qHHz??hs)(rNW9y@dtu<{_t2{0mAMtEjvTgAX%|yW=uJ3$kSo7yWefX^ zDbu|f)R(_rqFvmG_20r#Oj*oOzUM|kiUQk4bj@1Wsn*LvcJ{XzBfQ*>I`{F-Da_rS1Vu zD%74S!Znp;v8n!V&@9ssT`~Yv-fhwx{Y`I28T)4uU@u(jey1alb1gWNrck6uKU4Qw zHyTyPr>#E3|0CMO#z)CKe-htTtTmS{^vxW*n0m-=cTjr#T+DwlpO5ocX9>c(>@*!K zD6YY_AO))|8RElu;Ks2Ou2L!<^3)ZWb4*>0;4FQN#jyWcI87z)Ry=!HPXWkpBDd%Z|9}0$#4%3TMDBz%_=kfUnto3v7!W=b2Sq!g^rYr%%zRCA{W940a3=q zyCBe57ZH%>lws=#7K=o)6!K#jl)pH9LQImyjVAs#o)qivcaRVZ+Y zr4K0ongB`wP)bmTE?_PEp_)$JovcN#c^wWgoYaw^kqMUO^dcnL{}{IB-Dn3iY(H)@ zcm>ONJxm_Kka+Tipj~WvMXq|idi1<}`G{uDhxj-qjBEp4=zKZM9@;7u(7?^py$xr5 z55+?*ok6~_>zf|w-l=NzGx~*&ZqU7L!FB-;YX@s9?wb2`kAC!cvCii4#=`L(DnB7- zzi<4^p1RS`N!M4`un8axqg1dy`X%*#RdW#Q;LcFAd$jMszkX=E+TADNi5D;2AR$|d zV5wRtS-pPHsXOAI5(8Z+S4})IpY`aN=lWOUY2Mk|N9aYcsr^)VIFoktVWYVwYl#UY;dfKUW#|bE&b831%rHAbAxco!0-#{t;#SSRL zWH>7^;PLXZ(SRcQ=xCdG709Ymko~mO=m1}5xh(H_zPTvz(L2&=xs$Hcut5{6HlXSB5S2dRlX7)BbWFKiCSu|0 zpy1aOTE4N3gDb7iPQO-ue$bQeS2z>OFK`;Qd*)>94FQd`hR{mes$k z_@mzvfi?E!_1VyKkJ&57PI>E9*^L20Yn|_5kJSBcJ&>AVMTi8<{c1h%PS#v)L@2Hj zNv_a?@1%v0H9x=NY(22vDcXblllZzlm)57|e&LiS)?7x4)fuBy%a*%?!Gg-vcOdum z!S*N>hK<5}Z$dm5q`OP6PVV&b&K|Af%nU#U$~iUnKfv53BVy3)~q^#Z+IuD&qwIb4!k{$4a? z_T;Jt!y&D;eVZ+J)1^+Nc@xXVHzhf+DFsHg>ztVF#6Ca zVraWj?JN)00aK@Ekd@SVcWXC#{RCPDucH{V)xFQdafV@tm1Au3V=rd3n&zAShZRVB zY2t*}W0Hd_hL8oQ0_EA$f$Q^XHr$ri$D$Bt9pQ4ObAxk!nIh3B8AirT<`W&UMJV9o zmeZ)e^D?us>Vov>A{$w7!9y03q{-a&a&c=KZ${K*@B zzQ60hg?(BJ*BVF zs!^k8e~*d|)Ym@4FGYYifNwfCtk&D>(-C;xEw(UNT$4y5BccWbJBbLGPM(|Z5O@T9(SJ3;% zX{C7QUz7TC?r&}0MtTOU(f~wlh}VO^Pn^&rhRrO0a(}`|&T_Ri6|YnQ-XZstMB4-V z?&7?tI#)?3sS7iLKQtbAe-RnPan=Xjy+1|GtoFXBI(bSOv` z?)2y{^;t{plJ0qqhh_eowD_J- z(W>>H+zA6<42~6p*Fp5G(fC|=o$t_+M%kjZV!zXFvBId_CTVUcu!30X{VBY*)EQQf zF)O4GOg~~T*wv&5Nn}j!pY0@DZM1`JC+ntg+Cc&BmK7v5P9&zkghesSw5)+h5jl2e zROd}GTJG+U+8~|*q4TBGXG=26HOM;%{4t^-scUm}w#{I>wB1^#0rq?R1rbm0h9gb#c|7=n~ z4!6|#^;}t59wzz9tR2tmcW4?g`ZNR$<}{j0qWdOkjhfF-MzEb+~xgIhmqP@iI50I zM-5s#5UCEanj*7!8?t)M6O9yh`(SsAr6}9jT?sCKhHqdu*;IRcSl{Y*K(ziMGyTWi zLLP^XJBNUJ6242f7#@(ebY!Ds@N>l2@x{1zZ1|{4+2P~wwosNc^@aj~Q~0oeb>V$d zXW(VL7rI@Ge1N?xe${Vh4ONS$;zTsD9R}~(q+Ix(VS{Xz+peG}mlB^={Q=)^8-+1S zf+#A8=>8j9X$`c-x({yla*z9(dXp;jxp4t3qoV_{f5enPg= zi0vkpr8ViV8!s2sdfWgeJ}Rh6HOyZS4!$0Ratx)j6ELHV4vAd0&?1`zQ$n;F2&Nug z7njFI3YaE;Mteg2m}sQ7#URdxchL2taJFd*kQN+H6|jFWJB|`wv`^Gr1$Oc$tmG6&7T3~Wn&Rm8 zCfM&xT>*K?gFL~WJ_C4r9|5S>UKa_ zHtVxChY{Lx(kbr1LKx~YGpzkC5JR^dqC}N}bU)kjId@q^ae%;ek9ay6>dTL^v1F)t zAB)9Wo897i&u7>1x`sSGOQSrE$55NRJ*szwr?Pq<`j z_P?J%!sBQUMK|f0xk}*-HI%JqSF=aM?{_m(10tK=i`CNl28sO*ZmQ@aano87uxG4E z>j6)#Zs|vw_h_P}ric_rJsZw)lv%h;(yg@55T+gc#6cBDGxOPC@j}Dc9zj~aVj3XO zm|y$Z1`Zd9mwuC!Hb->Q6a1Oewp|WuJ&HMaj!bnfX~s)`+M)n3Byw{!?^7-2GH87bj}DCwa{j_zAyBjWXUoz0H>2*ysK4PtY~9Hl z)Rt~&5M}D?A>Ba`mt{6b*bdpm_juz#be0EWWXNH7(z^NkLl$o2%XPVrX#PB(iCT_P z`*@HXzEa;B+9jjlwQcptST1)0gu@Sc)f3I?`gK+HD;cMA>MFSF$l5?G4aa%-Xwcwl z$LrBEJ^y<^F-5RbZ}B1pq1NOvPObi*jElt>In2@)dB(A_z7Gjw-%{%3sN@BRMwTmQFy)?yYj z!<=)Ud+vMhYhU}?`#^?JP$uiW@u^Wix%-7f+A1${fuaMG1YN}zs?$DM*%%mQOBe1-~ySd*xEM<<|q>wv>|EJcuC} z%lPbIZN?55cTF}%4VR$&;fi+QUk_)cemMxhmwlf9D#UFi164S3x;88*Tq)Ul^Dea7 z?oyKxUzNgk@Y`e+b}_==)RQvJsn8_y@U}#P7mEzPJV0Tuqfg~IZ(2Wm;eagGRp=U@ z56Z0|DKAaaNAR^6o^adSmpWA9F*wV(M5&;NAAUpy_-P5jQNNz*tZQ=V5HjhFtCIH&!B7 zfxC%+l{T^0+?@XQrbKr|`wvXh2-!b*Y-Lq)SAbvVtk+^!Qoc4fe^Jvfm0;11cA+DI z)UH~^OqUYLEUVZ~ne`3-qsL*f%3{$h{0T6%HkS_vuE3^z z=D9>7;M16YMVs+1>1`o2OC1puf*z%h_i1h)i^POl1ytwkuOC3TA`5gYmkMk5TJ+s# zgFt>qF~|rp`sNi2i{hQ;rYsZ1!Z-V2_D1b%_Xd$rc1uL*w#V7dRC(>dOkZ!P0jk?8 zjIt!CJx?6`jHOFp&z4E z%%yPk)tKY#b#M?QHh#XgaW@wETQoEzJXuQAF`dH9!Q99==T9sWQ9fBMU-S8Y)f~A$ zGC+|8jKEvh+bdV3J{S-#$I+LsM-Fc-^0EL={-YQPcw&cw)B}s1bkk7iNjg^d1x%(4 z-aWCg95fFwC?Y)@Ng3YLJ7p^qv);$AF-yak8u%&Qv?vJT?mnO2A@I5}Y-2ZYEOn8|lurvg`iXn9v!o!&t9vM^WAL ztecfUzphvi~AYS^K;UiCO{PM?mqqh=3RMBQxVYY9X&$mc~-^Ml^$ zXRIb+I_)T0y|0aVR9O5QJhDV_)2tQifghMIo#K{x*Dae( zr4%Reibj4K*r)rZkJ-~tp8$SbM=TwX<#`9qZzBfxU0YD1P9o4jIW&B8f=if(y?G-6 z9Y8_JzY-cgKtdyrkjbl$EDY32e%z$tjw)$MnqiHQ^L1s0E@KcpGEMIct3uHFaN#SZ z_ag8iObaP)E#FLM$v^6&e0rdAS;H08awZn4O~Dlh>wl-MnFY?g^2j0FKWfqtK!Ja0 zbXQq@pADoS`~pX&XK_y8boP9-YbELZ#L{&(_0t6v_5fY(CvE!4mFp8>IEth|{#eUP zQ%$cx1)G>++|vmj#N!f`?p1r1pA{TsF_gl$7U3@t1^V{Jw^l(S{psR55X*s7bEcJd zJKl#}@S&|-K!~yiE$978kmN7%^v!RTsJYQc315X41F;HKBxK&Cueg1(9vzMP*-j#p zRF5?$L?`(8w_WSEU&(Jp-hpMI>OQ8f5iO)eXEhNTQjupYwuX7L!Iawyzqqx18R{B` zXwQmn&foOJR#My^d|jpZE6oV%E0C?_8|V8Wh0TiE{F?0c_VxhF|MfAd(SDEM-Z0{W zRZ?wfysq&(1nD27Ak{c6DY(4J31?3>!?nT=!SCk(b<9H;6A0UW@rSq17F+l&Zr=WW zc5D&;6PcE1eTLKGY=Yui{~)|??6)mLl#@y7eOmoBzTLLULH)g(U-&H6`1s?JKK81< zt{yLjw| z&u{WoU8lVKvn(u*WUoW4L%S-WLRR}7pd-dpF1mUtL^_NrdKCMiO)A_PJ@&6Jcsp_GuJ4=bfKpLU;GfUp@;A47vLh@yh+X zkt}MhU0#gx={3D`s$S@)Q{#$Xp*u3dmMYYEHl)<+*ruNA4F!6HA4A+s39Nm-da$ol zKU`{|z+QA`lv6DXR~Uyy3){E5X}09s@q4C>vx`3FwoL{@$)gA=5yj&9yX=+uc@)X-bTIb;KcH9y&y=Sg#aCQ)OClDMa-BgSD@x<+zM^5E;MN#Un=pEiV&Y@mA!W62pEv92$hPHm}8;6$YiauR{=L7 zc7v;jOyOxzkrN`BcG&XO4}-o2IWFoit#VP_zH58x6XWKHH>9sachp^f{rc5wUs?Mn zXm7r8AYCd%LzxCI@?ZjC zt*YwUJU>4ylDJaj%iht+O~CKea$kFc8BMhU_B-5{?$7*aWwoF?e?>BXHC`#`aX@>0 zzCUoggQ(;+3h;f4e4KI2tG#+~3uAr-IyH&u=GJb2r=^^?oOP9owV1D*fwy z3J(*#w-kIm+w!@0$s3NlZ~n=0$~r$7Jl%ua{lDPyidp|Ec;9C#W2_>5hOSAga0av| zP+cb15i+sK7EjtI$xcj7G0k-}|B*i^K+GZEe+c z(!qhoxcrqq63Z$PA=uGv)P%A6g&^Wj3(H<*h$M|%R z-*@b^Jn8E@Wo3iICP&|x=AKSkJ11xY*DWn=t#~KotcU|w9^h_7k6`6&tm;~tmDk8H zK*Lc~1}?@_tXO(+U*_3ynT6Lz*JA`foTCJtx1x+&q`pbjnE~f`aC#hD(fP&rh+Yhk zLH;}V+AWHY_KB8GexEByJ~2}7+WuN-8P5`06L{xGG{VZ-EUGL6())5c`cfYS*;S>y zpyW&Tr6&pSDeDAFKl@jtOW(Vz%Q?b-gEPN8vmoVmW(NkYWe9$pI6g9oemrtKIGT`H zF?TBZd@B*CFOMeI1WC0%QB*wTtrY7yInigd?9xwoH!$;~SD>=oBK}$++<2y=E`I`@ z=a{#AY`qU$K^-InxbUl^-S?iB2TpM6?LC&k_hjvB03rYj-|5~05)Xw&pq%p= zLT>r)FVpV3mzL-k6QK#n0>TU$=|@i=a! z#~aCir-Djp9sWgBIzH{bmR!;dU-5ngxSR}5rqU6%>wB39+ET1B+`Bw-N&cWTu z+KuxR-c3^a`=MOkLu)zYmL#61r?36&wFbN?{d7&bN3p%h?m^h$@|ol#S`7Qj!`e-M zn>vHdo02$J(whsnj{!_Y4o54*-~ZHxb`@6c8IJ>-Jnz){-J$PVY2*65ZsEoGj_+E- z)fP*9eEg^EzJd>ruY!$?Q1vtzoH3dg16=O;`NDCA-!i0%;|$gZp!O>s^mjswcTcZI zb#y~*VVA&?A|(|9tOvkpt~7l{GvDWcLZYg7_CM|MR8F+c0CsECN#r@aU_HAziA@ka zbx`3OTCrCItXma7C&ffu?t*S>noeZg?Msxz__eO|&)i&j0o-_0a*McvIDhOx^8#Cg zGz8h5i_~4f%V1x|k+5KUUt;lUdg8!T^uRjvaht~zn7)jwq0d$=HOSoS;7sX5QFP zlr%(dd0(tiJon19e)B-#vRQls``L&T!KSV@m=5UpE+ z^D;1n;gZLXTYjn9ox8rUanJ1Nl;wHEr*_bODPaFaBz9S`4W>5T2b7Nj!X}!>>pQLr zc~-VpCVG2W=fyfR!7n+irm9Xgu>ovpl=9# z|5lEZ{E*?fkfPGSKAp1}_q>h|o@rNQ&*^Zg0E7~g%5yuS^@8y+>AmYZ)APNSQ+&pU z=%`A54pe)L3wrL0)yAM?(}jGl)zH~4Ths6-UCNbICC7nNCwtDKTtHi%$#JcD!X41f zcba6;?)H+#wUk=06G@fd(8dGrk1ko_-CQyfm+13^%jFE>;+JNzCAEn)ZU~L7S$&`H z2%@u@vbdU6d4t8J?iiL;5&@lDSEjyg4tikYsj{(nOePnblE8&A6#}J*rjA$Y#v_VE zl6MJt{rG>uVFUU`NBEi-Mn{yh(7PY~-4YI~_%SYbr{l?MhJL>M?7nsIBN2)ARF4z} zS#GJHmh2p{5e8kgpOs$gx0}uKAOC9(1KeqO zo<8fvtogtg+OGU&zSyxv+nRF8&GaR2(R!Yd@QN2)b$Qi$O;vK^L59I`@yD7u)y2_= zrpnd@mD6S=>U2vou=JVZ%wN}e-)=79Vw9iAVq{gyv zr6%upV<=#RyU6tj$Umj;44Ton1ZtjVdP+6Dv!IqmXGCQwdV8e-+CP_SdkN!EZFsay zXw-Hi?z}o~L#`tA+RR*6G(GO1G8%_=0sD-p>$EM!w~$CUEziM&)0rBvf*<)#Q?pa? zVYop)+{Iu(NrKxevKE|LVB~B04BLgJgDh9NxFJ4EsFRqxqEa%*RFO_*M1N0z%E z?l0MJx=Hl)x!i*aI*`(LkKF!D`zc|g(ey~D3{#%gIr%9m;ndqL8ChBAtbL`933M`C zH%64yX2}q80!?~HA=YnG(CMk|cel@aeQyEg?~|%BOr~Cc!FP%wdQp@KQJpP0Ljt9n z#{2dA9Nic>6<%`n0i-|bQmM!?W+y>k5bZldv}&ta`*1ilAaW#?Ik0C~~<=;Hcd5 zr!iFWHdrx+=`StY`F#!WT9q~v5H2=<(dpB{kUZ=e<#4ok&|Yy!sPbTV^M>fB$px#} z;O=nhJjq8sphZPj|6}J@{!$M`)2)UWl2L(=Q1_dgbIlVxyl?CG34}^e(RR z`Tjh|p-~PHbGb6=y!6uZZDzz8aG6NPqG0nQ6&5 zJAS|1ut)6okURAeeJwRfA74V5r9(YIR*v8S!e$=AKJP#^^X;s9Q}a8IV|69HCUmql3Bzk{jllWd^HQ#2LL8j5CrHLoe1;^hroGb<8z< zmIXHVWRdr2aA@mf{3}s94h_AN>s=XNN@-C#m)ihfiQ4A4iuG>;i30ppA5LvuJF$MC z;T?Yr^?G@20h8gTqX7W;=tYwM0eSyC{s->+zhCMa7b;E+!o`vu&A`__6L-FBB%OC= zzee*sPq|*BSWa~|Y<4$LmHHYw`g`cS)9E}O(Rhz?eYS6EI4iz&_UwLq?0sbsU{1!) zV_96m)l1iZA>N=jAN)bxRg9wb7&*4Hg#a%5U3cTh10aZstNrM3;amP|$L=p$GsfLa zi)}2qh@cP{m9r7_y*jCh_rAOr2T4hxA>*e<_T#td)c-1_k{Ihp8HTS({br6S&~lq}q9FocRr z@SR-_VG#VCo`nB7Jv;By?%lqv(|Ct>QUkxKG%LFU$A&&h>uHdrIQg{Wv*V~kpJt`n zI^Vf|aN7E_o85Ip$#8}n^v4N8lG=O6Q^Ai?VYgGi3_=XRNb7~(jSn0*8*8LKhwZ>` z2cfvA`c>~{WkAk_b|?0JqmM@vdiA={>0)%<*(Kr0U4mGwdDcuPlW=<&hugs-_-v2D z#JhFoG;B?Pv(CfUW*l1A(p?jyCr_d*;u(}VcTcZM@jj>$!qsjga4VY9XAxq!b{mc7 zceVyr4p817wV64QsJEP67ocge0oNr@h=Z2zmweCU;^X+{Xdua3O}p+RhrnrUIkwJ% zt6^Z0S@_w69tyjtyBm(?)x!qp(>VZxH-`DOhExh)*gJAw?h&fgQDo8f-@1KMlh`&| zxrGYVL8n73Fa2_H`)N}Bc04g5VO&1^U5J1IQWdO=o65)HX%hGAQ?Yg2^&Sbj*4MW~ zi)$YndI`m!PY6LPCDQH>LuO1OHXk`}yWcKtD`D;(t!Y?PGohjj%RZ|qJg);59g*yX z{b5<_d=|s~eWhPVuA!2nzx$Uv4dwXbvb6I?&R|2Zc<(4jxbshYWygtI8H+2q5UyM2 zxjRP=QSXri2@$<(A@Kc$RAgPW0Q}Z8g{6|GbSA{5Dh(6w_|}puSVv-gm*)PlU+mNX z_~zxcJTsrZvHk3KO_ig7Zs$7Z?)a3Z_Lz?1Z2+kXWT*TK@k*64bw_lO^g*(eCUno6 zgcuD4HdAW-qGPHT4Sw00rjSOsrq(&lYTe7T8-O(G?SWuzwx*Xx(^v5}I=7{*6Zk>~ zt{FIv_BfvMzTEi8<+Y%4Ynzp`+6L3}xpG)L->25zY+vMKx9GHlwU*xmrM1OHYqVIsTIdf0X#M*VnOG*B6-+wS~YiZ*i?;Gv!EF2LgkWR8f-_Cxk>huqY z7k<{`BJO9(;{AA+bA32I{|RF$ilWpTfeUlOgQQu4lny(WT+TXcXS{~`Mm!f+u0uZO za2%0KEO&aFQyv_gd-6jr@|(cVL{I5t{mf39W_|3?4Es5_zwa(yFX1#?EcqJT70#uW zr>p|Yjf%nZdWW&7L_q373fmcp@?xF$>*VcS_=GxMKEUj^$Ve%;rUWV7(Gh)16@(`B z6JGb+r1|*ohYpFjwRJM3g>!2#zEANz&UrT@0_>Xh7$(i0E)~cUwYmK%P0{-`ZOs0Nqv3ZMv>&D+ z)+bl9xCd?V1-jCi;W@W6l%EaBT77c-9HExr_-dWwgWkGB@@&o8y&l2yqw5);Gy6hc zYLQbMGS2`gzC>U9#DbLRRg^@sj)-6*7b;CEGjopBRn-2`4u$syeN4);)r-E61KXiE zt`MG&k^7B@U_JHVusQBQzd@;azq9wlxo%uUyw=VzXfyx%L8A}7khDHO>_ZMqFSjj5+^g(%6DcTe(fuybkbZM@Smc4nEw-zxE9En> z&e>9E)pXTKe~~dS4`f#HVSl}ve1dTA>xD0M^TwlO?7kmeN?QuF_G^%Y0RMc&8C?I$ zBT>=Ze>{oCaH-FK#s!F+*$*KI?YSF|YKJ@Z>O3pYCbvz~cvxK32_uampwH|PW{js&p)&aPuOC+itUke1}zhPDH@vI9hYt=I7sNd2S654&A&BP zar;qIBMkg!XyiW1UuQ?IVyyCX4+(4{$EIkg8iD_Lx&e?JlEp+pLQ?^dK68m1VS>=m zomA6Hoe?wlVc)g0iwEi7fku6*wZ?_xk*kgOxBKNW;|KNoz93_j@$*H2+M3+&0l+y% zBYm&W5~*t^gd@T0hqoMeOB`jt6fOY1NT6ORs9NlXRR8c~=K-pVJV1n~2u4C5IbJdN zMq&8yHSb-2BZVaN-m1srI!@76g45=n(9`qXw%3Dc0I~$2jBbg~;p*43w2z!sTOSn7 z7`jfq1Cnj!Ho!X=kWWQ?J34#Uuidb4VS7s`P)MZS*}cUG3@h;V`rH{%gDkMzt&!dr z$^cYUJI5XxmPU{u?6oH4!qc6nYi6VvbvsyM6kA6UH^8~pWA5`(kq{TDjygYHXhx$J z^=LXeI{E`S{b@-U-6x_#idAOo(0kYHyU^6Ew?ETU-5*xaN%sC2?wa0JdMy>BS$kITTG2`VH(f({trGG`) zYH6sSB>vxYEt`_FJO8y88k-$1>&FCjx1|Rr1rtXB`gf8q8bjEx!H%J7z$TcgGj+}7 zv>aE{+_D}QI}W6QIj_a9$qg&$np#-<`l8|1UikjvtW?Cuw5WXXig>F>za}5D}e>^A@+!@Y~nRMacmGUuk*gu9LBSfrDlt zT#RS|AZ3@>VK@(HF2HUqm?+U&YTkFVLj!0G7`uoIvdHMV3t zIPR7zSTW54W7wUC+CrIw~ax{)cen^Pf6@2$$L{XC&eTzesFgk>Ei}}`9 z1fXo^NBV&kQXohhTchoeYfz)m^F9yBh8Z1X71=>fVre1aOnpK0skLB)PlzfpmpG@1|IoV&l~US$&GQ7d^yDba^O=R zAcv%obeWgNEUA$tpuWFMxAXtbbj$5({m%@_ufK;bFG`PNsIb_AUD_M}*qjoIC)dpG zeuNAA3PhjEd0^WNKgZ}7d_k{Hk@UHovaU{oWo|m%2umez=gGrWID_&ht zgc}a?-vireCok@;zBznasB&Fu07sOQ9Ui?V?Rf4OfmyzBlquWc_T?=z) zld%N;*u;n@r_fGF{T$EW!aokJ*)G@NY;2qYV!by{cuSjZmgvLWnY6!n;j*&wNlFn#oHjiPYNRlSkNnt7XW+3# za5lC*8JryM**QT~?2BN9OWEi$u=d4ift;1k`u|S2-0mN6X0>^0_a(-(4hk@SScE^0 zE_5wn{`IA@608{gnD?2O;|m~7m*BM0tV&t;|qG9`k82Bg$XEvCIDj=%l3{G0sI6T`(-WMvy0nK^qoGUA?? zOy_R=M$FlUeST*AhxXn)XRss1aj5|j96mCtktWbM<%P7+fFbG9@0+w`G-eejiRRa3 zvco7^XHzr0I_KAQ9&++LcI78k=FtV&4Rhup=^(u9zboXQC5Ysrfge@kf092*Tfh$b zz_7Ez>3+GcIr;~9%X{>^;arTbMFr3KcFv&uH}Vkt!+%q7|N8KM9O<9q{l`ltCbQ>> zwUGM;9S|^BGp68bsSv!}RpiL6KmC)x_~$yLksd z)_byTmU?Ai3u=C4`Njy4Eh-_KSx|@R3rN#j=8X=*O(Ub01QPO3sSR-f5hDZAZg&sy zzob9HPhG_;djz2`)rhB197NbKaW}L^J>{Z_q&|u)p^~QDJNnFiPnNr!)fMSvbgh|a zB8qzVjTAbTVCG6FS6j+KS~^|a*;$39HNiZ+^@4m%g*f_@D(U+}k=Y@8hp3n%uL<$B z(G55BkS7;R8J?Y5976|B;}^;1KH2QjyRZ^Zy|1`Wt{xR66m?Peh*fIukP{TKDzaLO zYh+ZDJn!MO@sXP7f~;<@iY#scbFU!j$F%|VOdr? z(x2Jum5oRS>aFX|S+YrIa^)))J44v^mXOBZhH#2{%Jh9!XWpm>y0?3_$e&&`-{n_z2H0n~Elubj zp>ZGJA*R?(Z{5N8Qpnd?au2Z&=N{;x6rv2d7`<3I#gLB^t2p^&>F+Z7`i@j*P%P(e8(YZzy>W?ZVHaZr=qW3t; z#VRsP_c^)1DA33VdUcxG3Q@S7julJ$rX_t%G+m^da5BS5714Zb=AE+$m*~MYTQqqD$88+tw-XDv2&Z zx6EU2x8L-!ZfEP9XH-C?2VtHpywrmsXlNK1?IG$e+IyqBH0huAZ6YC6Z1p*Do1Gi{ zOI#snk)};852P&rLLOySX0kUjQma-}kfHm@I(ZanAqT_&w#y}Uwl(>(^jV7es_i{z zUO5ivj-X>aA05o=Z2Y!!lmIVeioj~_?XykZO_!(OsgfD%b<$`m20oQG>i%mV&;nD- zMZH3#`DIRI+kp^$;@p+XkCVW8QCoGhluk-OqhaZ9cF1)$_w;biUQc)WTO6hLTQitg z;5A%(^Qg(l@SD~i<+qGu5I_7SKIz_#5RBZI?c`@j;Tx!rd?`qk>YH}s{grF!VX z)0$K{^zszcn9um}G;$AboJYewujm&xd$vE9O4W`fK&(%N?D9|-X02M8YR%TJJU88{5>R}wh_#s$e)))m4fr;HB?TfYh* zIZZA5N1&ekAPMXN|E)#@4nhr*9;8}nO7q8$KC*x`$RQ9y(;V|>bBq-b}j@y=q=( zp~Bl=@BbCWG5w9=rlee?jH2~r{|YAlzxG>Kwvv%BT5SJhb3~oPdAS3ZFZpl4H~JMM zaa*?JNdviY9z_3BNy9r>C^9;5D+k)0A;sbs7arz@G^P)|ymzHLDmU|-27I`Rd?ceH zCLiXEpzGB#B>w=faY~hG-cin;=7Z}O?HRVG$MreUXDtTkE0%VH)AbKXp#TjkhatJw z5`$TaPoUqbAmmQ8sPRr1=-htQK@c5c?cyI6Sr4vG5J`9oJ>$6| z(!#SKr+P#jSRbLKx6WmYah)|I-Zwr!nd)y){RBB3%P#6Q4eG)hhUcYOXS+JPC8_5M zu4!=}xIe>w)$d&A*0;*jSHrFcDp#$?fdD!fa?=S}3FBy32qHBwGBWxEhFl|VE(ahM zCMN!dw_BQ`XOpHkv-7u9Sa=(#x`b1HAo0uR_eUJ}z!D?90BXG-78lZDz3O0alvyH? zDUC^9&a9#JPkZOq1>d6o=4S3ir=T3w`9*~F@mh}?(*F13)s({AJso7eXEmCsEw4^& zmlm>jZg$6}F<*&kM(`PcFb+@Ol6|4@wN-)GSNoazmbpJ2=g^Hh!%I$lw&4&txU4d` z{fw5kq{AU~L<-vbDA&l?bIg{MVpawwjP3U`;c;=8DLYu;vlG+3cJoMhqRR?D?(VY{uBO1`oav9!qej3W-UKD82F3H}; zfpB)PgP`^1pH@|bmV64!R8ISPPhyS-lZ)30Ny*78 zK$$%e8XDT@*jQq}8jvHNzrUS7&XKsyy`r0NGW1G13#yVT{PCxvzJir=gBhl*n^wq; z7_XG}`>Ct>je)04LDsvu!o`#Jd)cD#w?(5lPbU%q$r=Tadn6}`Qo)?WVeX8l2Y@0R zYYR@U2dCBj>N|vFZQ|94Mapy|oN}Djo8k%#{lrQQPk_(qd7#nV^rI6;1Zr10)s9cg z#0bx`{L#(z)p4=yPGymus?hqC!lG}O>!!C~y1L~HCYobW_tD7b7dg!JHlGKbXD?0K ziPWaq_qNVR+#gFEx8QJm;N8dJsB6Na@p-pO14cOT_1V{3Tjx!yXeNr?_-5w8`JZkS z8r1iUOIVI9*9JpwQH3Wzf$PW`gl4^?a}s#d#(Q9>J1=EADwGx_`JkzUm5Ad)S?<*h0i@Bz4fbo z9~ltJ^uf4jP{U611;R?zQuEI56%5o%tqY&dkfzEXE97Y09&>8%v+K!RAXj{R)|EAK7$Km*_StUGf}A7J}V0-c8)=6t?Z`?35yQ+4biF zAybcD}|&(QgR$s3tXi z<^^qKTn!vySv@%u)?DiyXkS^TI>d{tDb2{Zku#cRQl*{{hYp6lh?Zn>K z)PF^o_f?oqZQ@gG!)@~XZ|ghi7U#^F^53s-&C%qY*;KhteYCCosGI+%RhoFa7a=fp zs#%&pwVtu$Yc))5v8#3Ft2K2ksyX4X&t1P*x}W2~A#=I7I=3_c-2U^oLZl{>O0rgA z#}^`|KjQZG(@|57?_L3~)h>w}{3U)KQwe`#=SS zpx@1fSCm7N3-ORj*(@R}5AG5-g*l(*4Gj8kz8QIQ!8z}JF@V^7=hgsd#twjIhcnIt z1^0?RJcaZ+$0Ef&ELjy-3Z<$Db?f?be&eKnhOy?`&{@O{uycpTg)mr5YY6^v2L-se zuFh6?;OK}OTz7~Wf=`nTgTZ`0A4*bI%R;n@Pt37!1(umJ9(nWrsZq7gD|*gSuK!|u zoBLlA2|Kb&2X@*$GmK0;%xgzl8a^5k8OdHdyZ48r268VRf=Bho;|_46KOk2*kRGuI zOKo3>v{*@oH+g|(5=-^xb0b8w(q}(E4E7bXS^G(}B;cQG2@JWS-`$vgDDPweI4X0o z&O9sL8nLKjVTT12Ko_p0qH@%XMFZT`fU^Kua%Qsowv9J(W{v5#`$ zpQ*=K|Fd=lIcsbK+KB4X{(hApe!_0p_1`(Lz8*zK2KfIGmX8f){h}{jPZ9U6*)n$< zRb!AwM%HGP*C!(&mQ>9FOX6sq3}X$#=mLUc53A-{OKaGYpo`Ss`i;_RdzaI{QRphZ`*n0Nf);b9Nn<-bAQwq0+d zl4r+|i|)!2{s+1P&6FU~UC7BqQn0oFZKBd2LjLGJ z3pED0KFn&s+YAEt9gP8rYj@M7nYF06mr=|tXVw|G-4I!*$v^4GyLtfNyCMCufa6NL z32tgxve_kfle7BhM}^?(A0(z8gDUPdZM}tlqEfAGbq^}8!KgvixWbN0f#k+SKtB-0 z2wFaxmEhoD55UDSU(8W5nd~zvh{y+%fjoHzl9byIPER?XU^xs^;1N1#_bTBpZBxLN z+|QQqF%F)z0UGg?=$R9TvNW@K+CxFX8BRjBM^VJ_G?ADNS=_7MI}b5=I0h-GKcz}8 zeQM=?>yZ(VE{^@SUJIwk0X4PdG{?URcD!~kf$p1E(R%R&&H~uYC!MA~&?|@YZ~{wn z5#ivk6^Q)4{6yJKAUA|Jv2MwEaBiA8F@~gQLSRRcDC$`WPN)F z!TlLV($7nFVN4qvc+o1BZ=7=Zw>F}_ryjH}5S++5yXx=_R*cu>RrKcfn@%!MkKbHb zp2rQbK;@sW*_G^7@Qp~`*FgEa@70H?v!+Wvc#c8#RJ+mpBhQBIu*=*9<)2qVeybxR zttMb`b~oPiHaaY}VEA438lvX2bV+_aluM4T3X0x&zAl){9=gC3yBk?tgPp0LNc}~1 zWZ7{E4=13yG$nlg_!BIkaA!xKIyu^GlcQtQHL-DP z!y9R`#>!NkQ;WN+fm`Xriv2OMr>*OugIq=@#Yz{7C#XNl634y@{9vRa|7mKC9kRTr z@2Yj_rmniKFh_G)@08Uu`x;RJUZ~eoN7cy_W1bD}`)#vZpZ0W(zmKY=sG%pXIxTM| zxwqlz+8?f4>kE}RdW(_XSO$6o$;LSGO4s9(;UNQuh5e(~&p)=d(zZ_J%>n`3zwust zQmXr^fzQ{Sx2698K9_+{<#{(=rnx;muQV&(W1eR#t(6!L6oKzVEfB_hxtjJ5kSK6d z&2!{<%XHde%Fb;OH}F7&=mYN)i`hW_KcQ1@iKCYWFAzG(#60y*g*Sty( zzS;||_PHch;iFjGnH{k5J>-URoI8iRcdt~ajwr?f7fSs9z=8t*jRg&af@vvxPRP}{ z>%oseU1a@^j0s!4l;@QH@C-c0L&mT6UcA(7pb4f7TK(`sO(vuBrT0tYBaE$#`81=! zXdxN=sMUJ2ikwF~7bqw+TJqA8AE@4%pD7!k6j%MljfssM-@Ag^<96A{EC9O0%~TtU z5cIpnAidA(S9$CtJ50Eid1~CL-swe8xqYUcBHt`#JlmAY>h!M^04j2;omFRZxxe$pqZ0l=VcfsNoNI*v{%*a-Mwh7M1bAGy z{Ef3fwHI!GqtjRa9akoJo`B9qk&9QZlUqr4HY3myCrdY`E4y1lM%}4S*!Rk14D`vv zD(ZMT&~zeRoo%g^Yh1bJdy`r#f=>0yZrfs#gs+jt7#`xCpR|FAdhd0l&PzUPPWoEQ zZgSalCLqMwA)&gjJdcKp2d%*J%5(Jtk28#CaJrf~A?}C4A4d}{_Hrn-Q3pn3_hEx8L%}r7@+b4yOoO359dm?ChXC%7qX^hRD!{9w)iGb46 z)Fns20oFKfnk;_*NVZz)Vw!U?zE>2Zj9dO;*_G201MOg_fXr0 zkn!G%25`)en(99+1TUy2FM*3$6iNN`(FnGLi%zXm;C6>W0N|buA?HZC@RHr5bI{gC zYM0)ossjixhY{%2Yie~zJ+C79(fVXPx3pMzV2LcG7FLV7n&HmN78?B#JShg*$g0d} z6Ol&C{vF1|x98$Iu3%bd+^$!GuCpRb!DPhZsKrjFPPLebrjr+AJF-yYgG?pk)N^Nn zq9f}IJZBVV_lsFs2l(7$S&@&o8}2jRb+4Ds9v84>~gw&iTw^Fa+P$HB)7Hq}Sh z(^#H+jix1UKgFB`N?C6|;0reNCAC_;NIdRfdmA}?y!2c%#Bfy~7-3|5qF>nuc)BKxrP=>D}1bQBOqboFOA|4qC6leAbd7W~OLSp}>w zq=W&W$9AQW{lgeScN_pYM4?wA)#)fUA&>-g_TsGT+B*c4eHx-gsmsjt<$y}!OQ>!3 z2ZGAO(B?QAfhnd(_Eom-4z<)qrp#;3>lM9JO1mk(SKko&e*v0^(5+JDNM=OZm*SMR zLH@wc1$b0kG-4j%c1cY{jdt-8IBVnKD)h>e6Om+WNDT-W^p~K?BiqC&Y2p z=W7-Y7+Td-IdSY!F>>4(?A!e_sj~(WQ#_+UbyjJ+Y6%wrm!`wKol5UPNDd3#St^0} zac{QC#mr@E6<`MyF*M_yYfH?wiH=us@in2;L`Vn?G|FB|RyG5@$!Vo+~ep$UHuK060y#-SS z;wEhe+CFV3hfjdKUNjp4On$*f<8Q4kjFSBi3-LwSsMt_9N=v77=QYqWiJ^eqs-rY!?*Wt zNZ#tbo2X>S`%VXNa+ili#NT|uUY#sU{N&t+#M0wL`y_3B7bBoaCQ^th=LuvVl>-lBjCO#l@Yoo@(*(Tm&?|lwbctI7Q@^~h*TP>b zeSz+ry@|MC+5Q(ZG91yS-#n&h*Rwg6v>yr!?YaocZaCH+Mj)`2(H*inzO*er7G`BJ z?_>y{?;S1a{T-G!k00%*nn@P*NkZa9{Ir2WY|0-qgwj^c-mRLscG951UyP4v-)a#t zvNX$&$7(aVpd=K=3{TB@c&`wZBLB@f(1o2JsIQto>R)K zJ>>!(5f>zNG9#n`_)_;pPMhl0()A?b{CT|H#HX?3Y25pXiWr*|Wkiwjv-{6X;P#|mWc-u%r-!W)l z_}rLUI~eN=&l}L(<)@(YAI<=mPq8W(>hZ>-;H~R!Qj6Nsjie0}YiU7yj7`(Tn}xY{ zv?6h=ob!_>S=;-ex0p7uZ*y-OqR)mg2ud^TU0htIcHK0~2LaiRkjut5AgO7sddKzW z`|{Z4NKT#~YMZ@BvL^FiXCnM_WaF*%?xcFI74M&GV4;|yO&bs#S8qP!!hD}ne0j8Hk$iGn#-jy4rE(pGBUCS#QYsUZB4CM z&abjD8puq6P-c@?xmkzYSsHjOV$eF9_BS^-$L*heU_OUH zd)xnuIJ>-b)*zkxmL@kZ_zIkhB>|?(gIc-dp}qSa2n)EIJ?lqARuFk&fA7vDmvj?N z>dTgSm!NxiJ%68yY`lU}ce$37eOz}su3M$YP7UNdP(L$+mF>%oqoN$~i-GNYh576Y zTE9Wd5DG?$b}sE+!z~4P03sF@wDLU8X4kIZ-@30VQeW78B;sTKqTfInZYX zF(bHd(Ojgz#sjs+G>;atlzdS_0rCD5EXw#-Et@FpFgxCgUV9KHx5)q;nrHgh&=6$d zmwXZ|1vtc*UHw;<>b}z~U;)U>Z=Ovje@^iRxnd_6={9(#`*oD{^}aD%Z4*2wQcp9> zeFZR3?-;rwUAM>C`21V+(*KKHdSK+`HSLnRe%)s{~}zxHb4krcM>LuZwxY5qbG zi@c&YtJ8gEwHf;1MLPQgfwzJo8mKc0RC&L{dNoGJfdKt&x_%}md|)7t(5&;LwY4h4 z&TC!2{+Y_gTf4hui957U6&3s=o~0uro4gSb5$c7D)M}0*{2gBwa^~Y6@*vAOq@7NM zv{gX%)YBs2qVE?=&Cyn|#q0$d94XSjEKxT*(jN*2;4Qb{cG4bt0KD~!Ej5K|FJZC& z)7W)JHMMQ)c#aJziVD(E6cjihQbGsM0YyORMIeBR)EHU_RX`EJgMx}uLIQ{w=|oDv zNE4!jl0r)m2p}a11Oh@3q{-cQ-@Es|@!pU3XOHYLR@Rzh?YZY(>-)YrR~WvW#q*7+ zELZ()_MAsomX~Y39oMJMz3S*33>$}X8uU)B69vxX$sU2kZ`Q|K8ps^@3Qz=Zd0T@! z8=m*C4lV%rO_|&M5G$8W6WC?tF~6KJzk6vVr=)~r%g!5c<MSlv54Yq*^v;*x-gypwL><&XV!Z1G_*y0I}5Ka7*JqN8$ zgCOf9Jbi2L=KiX~Z>n7FBZJkX=H$Lsr|%}fA9e`0O~jRbs?NykkRteszxI+#(e4rY z+bDfa?@)JykhfPmrSjatnZ9eK>{3>6pr7`%FaM)O7tXp90I;?-V3)zni<`f$ptu`S* ze0|RXNFOUzd+ck=&e~4e2)CUZeuA`{1uq%Y*g8Q-9&Aq6GI~TvZ<3>%2Sv8Mzwt3e zdzv`N{@7>25>@E6IPlft{9J)AbMirYcf-uu(_Z#FwSzj_$4uSVZuoh-1f4@G#y?{` z{LLwWwq}8(X=MDN5kD54%73!aN!h_sC?g|(M3pp%8do?bJ;zXZQCH_9CAHZhZ>I0Vm$C~9kB3JDXkjyk0ELiEkwp{y;w4eA^MIRxBS1wcpyoD?d zmj=NDJ+`G)uwm*^h|HqU?yNJ>`vdpToX_s*;uQ09On z;+3^Eb{=`-e?z3jzBMTwmEQ3jv3hL9LPe>n!I}4?!=1`fw=yNqu&hD?lwY(#5=JyC z(5fE90#R3E)U*}Vw*RYcgf9T4i{_PvBFIG)IE$m^OsMGDcr82)N?RVNlH6LLlsGoQ z!GK83`k|5A^LSO#ML>ej~y6_h|KKYR$+AP z|Ag01#5SQ69{{g`U-@A99mEuuZ)8}I4t(i*6y##8d5Tu`9^}30i14En`N00+bqj@0 zQV*bx0=P^qo-hF$=b)n^Y3J&8-Eov9>WWlpx;q!*VbGG-GfXPs`Mx(a=$`F1dz`bV z3DM$%z2)i=$pIXRcTNS>y}}{4_HMqo+wL1&lw6qXlX`NurEKeL zoT@C0vLcbR7`(1{!zU@TpN-#gNGKb;w`=(5E6l3{HAs85=QL|EP;INXA!>qD9;jWF zPgSljLh4UA<8RK7<3GWC((+m7Y8V}`@rK~?{BEqKFWvZVDr%eET7E~cdsj@@!O|Iq z=X927BlTM<&zS+6#e8z3#ezfveJ{KSJn{I$47z^)$W4V}a;R)dbdwKqj~+QQzkxu8 zYG*fEv!ogjG~$_ynX|cWv`RQ%AeE%1v8ALeT$Ax>+iPEI6$X*ixryW*0k|jvw^P4I zm!FvTI!d(_MhPDK^2lfNf@=^}{XkE&z-F&c_U}G{aPF{xM#Xub-yHtzG3YAED@1cT z(Plb#66?|t-I@GSu^a*IO8IPk@3SG26twZ7Ay96G8(0@Ci(yw^n1(s6I<0+8*QsFLJ-B2EkU-vsp9M7FLQW2r4Xk3j+{UpU;iLp_g zi9{{rOO=>5BOu+hW7W?Hkwd2%DSyZ?lXqDF*G{iFYk3*(2SV2E7^Kf4_U;IEl$wZ7 zMRaJwIbq7Og2{NV+Gm=zIKgm|lEr{34b<%t4Ll`jIqI~%V_zG|J4s5~(?h_fw8VwFa zu>(Drv~OK{?1ih#E>Qktr3$z39ghY<;`}8O;GFAFZ^o%Dj$@#m|4_AL2_Uq*JtD;{ z(Wtl^-cSm-5m-v!Q%pWb<1FPu1n0O}%mz}>bBdFCr$gs*JXK+ZD#b0>`K&gW1b_=2 zXovBgE(t<-l;K0SBS{yeODREvr1gLaD4}sf7|*{a2eladBtkq6L7!>TGqqH{vGPfp zduLy@VH)zDXfv2pws=cGUREVmIg4eFHilLwLTR(=o@QG1u;T(D@s_b#C z?1QI)*x|*pI_i7Sqyt~l*@$@J|ep-?aqI~ z5&sQJ^z3E@y6qN8NIm&$XQK?VgB|j!UW$X zVdY5jondew!36q3Y3{|L$vS{l>LQ_lAAqRpkL!%UgsLr<*nQabTO}1E;lFz40F}>n zX@hnm5vl=dPZEDEJ!d6Uu62rX!?OhTcmi(v?dltIK#XD{BWH+wh6dz%rg~x>P2gX6 z0PG$4_3tHj%bLap}(OLK9yR>pBLi8pHkNe=0W{U*+J z$O@0wz^dEsiP=Zl<;kulmfW+nNf;HS&AAkFWp`p_ZatHfkeCEO?h-Z6U-(Gu0_h!U zSNs#J807jd31-~^g-mToRz1YL>ZV*?97KfP$)*VHV+l6BO~B7CG#^}o41GqJS5yX# zRg2bRgR|9rQzq`X-5!L36Ooc&t)PbV@0vqt2_MRFki5#c!+)Q8F{TEn>h_BZwO8!TisgtBV7yI2jJm^6!+X@7=X5)^GiXi39 z7!oAhZNBEWwv?YKEB;GAt`pq~htux9JS&<(JwbEA!;f9J+4$mGIZ`V82j%Bxv#WEU z`*J(UD=0N^?(<4Y)RVs-twdWAiNutq1^tnqZII0GTd4JgS*~eyC}}F&*}TEK>pQHo z^z#tU0~ek}s)6v2;0Hz)@A{zzpd$;AdIhh?%RX#PwHx~@%h+!%Ifx0Ze5}^R?BDO@ z#BG0f{=Tv@1025j@}}6h?DUyV?NVnZqFx58_2o47e8GvsXol zY+atOBexaveNqwK2Ei18Q8O#7uNIiX%$(YRpuSq^ChZ?Hi zknxJfuyhW>LBT;l;iU69C{)?r4~s&fxDlhAtEdwlC}|m#zV(6h<>op)O}Adlgk*Q; zN;8k~y3q0RPG&8aSIX{!!@^Y0ldZg%)~-9F%os3y7EcNJEm|vQ;FIUju&?^J29HW# z+{iYhu$u3kwi@wc0?jdXWBPGUZu`{3i{y|aEYR1n{U1<#p-vYA_&F87m2 z*S5g1c2AK>tC=-8eR!QaJ}_#7o-t}@DH_w@Qn40A^8WDsj(pg>%31Q#GVX?QjPFz` z1+$629LpE`2UeT@VY6>F%8*kgGft*=wq}ue>A+*d()+J9J9*044uvnmY+(JqSXdCV z@Td_sdH^_c&hGYPg%d?algeArn%lQ)*~a|^GDD*gE+V44>Y8Tq5D z1r%~No&sI0NH}KqF00;zlK5!3|W(R>1b%6^ojUZ4?H?BqV$J`*+;qb@Yk8BZ8 z8$)+XRry{+0#zAAPV;sG+O$almw$Km>wo{z8946kUQiFiDE{YFVNT@obSLI%{Km@P za_Ee?36AUc%s!s6bVf}PR*C(|D3^=9=O4G`Vf9Jv|%(f`LC4Q z%f_t6(Ka|RDImr@CqvGnb9{WuhQ6zVT8`$+*sN>hq!tY^Mn5R~X|m=^4sBq#d39|K z2LP!}0`Zb*i^6~zUxzKslG0KT;84A39Yc9iuC`90c#y@Sx^~#sRmk(mw|oygJjxXP zed4bERD~9IV`qM*w}053A1S_V+v4`3Uf7l!d3^t| zKI3aN{&}f^JM`mGb^J&eeL3XPUrhN=kA_0JOs7>NCd$2sZ6cjes2YjtIm&vzVsUL7 za~q}5U7>^#HY^iis5^FJ7oN$9mw6OCnta|xoA;5-v3RgmuBy^cV zmH~*U>41owQ{03Ep{@e%tCMDC4fx!CdF!ZkT)iWPa5}@G?|H~c+^Xx8bl;yeL^$U4 z6Gnk6LstpDQ_{; zT&R~@oEocfgNeVk7m?0Wif9 z2c@nrip3a$H{z=v%`V;-@jja7qNn4Q4r|saT6+GnZ85yG{in@qhWqgNVBC82yDj4` z3%k|)_6F1SCzH>gwdvbS1SOpu{C@Scg+HwhBz`H$j+0xh7Yx;qXk0xugnmG*uQ>y} zOCLparo*D9XM>AxOy8CgnH&FNqf{Eqc}BRo5VUQAnJlsDzG=PFe>2J*=kRh#-dDAz zuC`+$xOkLS(s#eWhYWZ3vR`hF$C5*@i{HhDt;k6T5_LwYV;hvc6JsiZ{9WE$uRk_$Kmt&6wh)ZTDrfqUl^g7b&ZptR7dih^_n2^}Pn&_M{H2keM6l^UvufDjxL-@$DeTEU*v&(KuZr6;{!bYfSc-G=O`fvP6I#oIA1fm#=%hh+|)O{{4aT{&1gz!}FQmjca!U?PnXhqb?f+uUZH|xA!l8Ib7UuQgAB3 z3sb=>U*3OxDBV2!(Z~^=`ze2j9=E{TUVQbbdVwJLB-rVg)N}g7X%Oo(p92V&%oEFQ zyT@*+@bJM2e~rFifZ>6Hbo6mte6N}J$GO&XB+3ilv6eE{sU6WGCO338U(83g%~)@; zwKkNv0R}k|B9-6=&OSYU{e!wA{rGj@&qJqS$95a;{nG#*z;6zZZrU-$!xzQlU#af) zp9+-gN>3>p-RK%E0;3b#y*CHE&9&CsO*V3jlT~?D0g?x@Y3=gxvW`3>>zBMLuhsK{ zOnG)F9}v&1qa_3L6EiPw#fSoL_La2w9GwcMSMv4DUC7=c6Q$@QDjP*uD@c{}&bw*AiQ+lqeqws*!Nyz6XP11Zfw9v5m`$TNMwtm=Spn(FqUop5 zOv!cF*Q#g1-QUgutA!)-_JOKpQ_Y6zr)gM)4txu@YH`zgTGN8fN8j!A@u(m1#bh5? ziK4IFU*(|l%u+d_tt|ylTmRK~ji4n6-!Y-?B;NE5#R*?uJyhPS2iIx%>A(ZB}RQu zWD+M`GySXtbaGw3CHQbXxv&`MBQrnJ&-@1;`K>FHppLhk~GTBK21t2C%JyCk}hI+#fa6rpD6mJo)WnjMMFK&7kCq1jOPV}esEsKsZ=&cuoob!MFmX*HWvZ77QPj_W>QY;!^ zb0XUdBAZzCnM7rk%tpEDx4{-wggeh4?HG>R29Utk2VN(&`pMGm@pAA2GTwCpZ_{xJ zpY9N;4=y3tq^Rs@f0t+6O8epyEx1Ge_{)ye-SKDrw!YwZ?Fjc}{O+sUpZ}KzH#{}`SJsxoj*UCD4|WWA zyuBv_*kTTjy-!eo0gsEkctPNC_47UYPV1q4p#8w(woHl&@Ob$6GyV_YdFsgj>7gm* zAb8fM(l(sgv`N{{Ke@RUzV5^<-X3#En*ct@@f{CvzHG6bqvT@^`B_x9)Aj%cn`_z} z-NxMeF~r&w*$jXM0j&=wkNwRYp#yJ4DcWAy-rO$S{-wpnbS>@->&_^bgMSHM*V+{M z+)7&QT-bYHXPCOPGkq&Qe6tBWTEi|t?aZ3P^E3z!X=_d~!j2kMnQbq{X@Qn@+TV6U zV8(NZD1P^;=8e+gos&=|^CmvMsKYf9-P2^w|ac7}E!AcWVWMSv5vg4%{-jCi& zgjR;DSwD!e^4OUg+I9cb$dO0KP53aMZ>D0dZgnEMqWZA9}D9AfIbf=zx3kME3c%+ zZ!A7>8Ub23-ga4~s#v*}Lw-h4G2)V;WeNfoi|@7I{5K;nIDG#mo>z4BrB9+ahrwub zn|^qoH%Ht}*2n&&^5w``4}joOwhKs{ekm;b+-l3g!LV62@fq*MPWedeN#^iZaprg} zan09jQ|0twSuYj6^a2V_*508h|4kiX?WhxaM=}K?a!@K(SNPGTqxz(My>bsBzgllK zro85tj^w#8JEeZD#Chtl5G0HRp79evcJPr-VfS5;wE<%<-NH9A1Z#Bw8kR`_jk8;4 ze`vOE`a;1KPc=c}k~-7+ru94~EXQKGX%-UZ)%M**PiK_F zCx`nsi7(t)WhAMo-r@CQy?W&!S;Nx2=7a73i(J z0AooLQ<89`q#?wfZjI{eKwY?I_^RJ1<~{+Ri#Er8^DVXxp3q;d>-K0_c++?UdE)x2 zMVe7>BN|qlm1M;b2nR?gAJbKU%dM}X6lA5%z=16MQ*ail^EC*5(!hYM*WQvs*^|4^ z44-DdPOXlq;l5H@G->1@BDrHU@_)F%jKN8*p$6vQw&ttRRz_d&q^VhBt3)od%d~t2 zrxy5;X$>U1WD8J+PmY%%^!t!F9Ub9`Q2f!2$0g1a?ouRt%R=82E7ea;DJgzgcJ=7o z6JB^R75M}p|53d>O~vzWMQa%LEI&$iUs3ld*F+fIw+u`sa?5SrJj@5bA{$scr+G`H zLN5V2EC!4bOt$K>WzF{7g`2RF-RMMVnHyH*?D?4Z;FHqlBw^OjDlGdrD5W)>b$G|q zlaVe@#r99VPh~e28YsZaSQni9RPF=|P5V#2Vl}F$?HiOJ6Ulpa=Q@~%bx9|3=b5Eq zZ`Be}_7SmKV0Ov-Y0W4W>nP9z2L*!yN+?A`w_J(R2d6@azB(SqK;(d|G#xx9sd4g( zko)@MCl!u9Q(2ev*k>2$HQPI4e#{vR5`Pi&QJzT_YJE%5H`1@Y;DQXgx~<3ATZ*@J zYaZ9E=oi#;sOU9pl6BiuIhldc>-u)eEMrCce#`}cK>G8+uJkiDL6H0B42I8-I@3-2 zE}Z=9Jo0s7>9WpNMPs^dmnZ#c|E&(U3XTQ#>220cJhgNR1i#M8SMfdh9FhV!gWLMwHEh&kA6LsRX<@6y(3HK0d0sYQq zYs2Y)^9nIY{pv@+*S;&C@}%#P6@<*N=J>coMPVkGr;!I|(BjjOJy*EIVET*C!OiEN zS2(ux+-kIMi4W5c&lN(~pFzCmM3OVk* zLD@IB!VP!z+@m{scKP#9n6X$)#)-fpMXx{W-soL6<`45_tUuHuHhalcdfILEgmID_ zf^Dl9Zk4eM6G852e>g6~)haOt4ryQ0_{gnQ)9x}LO3z9oa;i9)H&0nJ!}k#%&argT z?FCpJ*t<`%DZ}_6v$tCK;RUeC%g3PK)kB4w5`R3#Pe(qs}eyw4MKTzMJWRk~J5 zhPB#0vtA5J;}0SDSk7Si-yx0yF3UrxOcSb4J) z1)D&&Bs`+{n4va}Bem8M#b3}}RYPmE(1w+9dyEb#s1%u#VY}WFHk|j~pf20PyRJ^I zfh@G7TWyB9u^u=VnR|TF9mpTMRdA=8uU(wCa z4XQOHMhr9L8cx#``p!k?gj~_g>ki64%3!{Sv@Z3;5qJ?PYqnVV!PH`m(Kpg;y+1@` z!?MPAjv6YJ%gN#g{OB&i^`T&g$~`K(T5nW;Y2t$qaCaGb*_GCs25Sh>cYBXu$)}L845W8niLMA*|ym{MjTT#aVEZKZavaNyJ1a&>GP_7x#Nsn?Vc@ygSx*~bwtez+ zQ0j<*%pK?uFU3B%1hr_pzAZ1mh3UC*lzQ8A9>q_5fHj|CfS=dRrR=~;2wQ9qYM1HB!#HJ1^ zo#85!wD2B%s;6yoN_CXv8U0eS9L>`?6O4uCXy|!=V}&V6s)5z8i?u?Irgf%bW}5Z^ z_<2v95L=Z<@G>QZI}{_Iuwqxb=CeH*>rv5xfKD+x_&^z6aY6D&f7lvE$_W>{%d>~2 z`qWCa0ZSs5DULy%j;oxG_I$bS(b^VlQ~?cwo?=U&U5&JcgUl?L1z(>|N+fu)_&ZWC zLhhF#e4Dncsv@61I3B71oPRD@Kwll?7Py$yf9ns9Pv!eT0oUH6uXfEGwmr5J@Z9?J ze?HuK(y$gYx(4_QHTR0T!<0>A;2(Jwb#xD$^+SEZC+>wETlsSbbxD@Q+gjbD-;>_K zNc^z>%PYJ$U08`kBIN~FED}yk&(9PNsf)Sl);;&Ew6CiQ)dG|BeJX>NorJ3yb|a)( ziiNrJM2S;FF=KWSPF}V29ALN!^oc)k1Fb%Q58Ey=XU%R2_4IinkVu=D%NqI(n<;e- zw)J~U4xe4Fe}^ zH_utWmE9>yRWw-bH_Ig^&BuXY=#O%+s`aU8tFl6|7k}7zGoa{9V}W{2S14QU@W{sM?*cd5M^c|z2JbS&x$=-WY zo-LLbar*}A+|GG$ZtAjMh#Yaoo5FFF=_JJRy+HmRCtfuR!L+89o%U_eaX^H*okU>Y z6Z{(vK?`P%-Ydat0Eisfr>F#-wm+Fa=6QI1fmfQRUi&HuiOL(P?2KCw_9}FDP`os1 z3Ul)MC|%lJ>q*wqlV@93nGog`kBFLv7fYU6l`=%|chT;ySu2aQa!GPkVkL%=dOq=6vrpvq z6a@7!A;I#;nS;hCKdYmRRP+g?>yZC+sjp!-Q-Q1`UM^DX?@ylU9PnzNa~^s)m(1PG z#CWOo8P^DlC}|k8FY8kdBUEX3vd%u0x}Ab8vkY`HMn%)>6&)m<74MtR$;t|r7EyTy zc+(mKU26&6DA8+tm+eXlM8NfascLhxQHaZN#s1H{C_*3}+6`6LIFh0Q6s+OyB$e0c zW9obwq%^?$bo}%3gHTblvCk2Nig;6T0a4fsg7pv1sW1xi$jo{nhs?IF!d!FJ;-8o~ z+Pvf&l;NJm->pBdl1a5!zInhdQwHwj^CyU>n>KL2_D^o`K)=6}cfGvbq^@?KuIZ>i zTBZF>!KociM2Cds;nRn*l%Rw?oi#@F&QkPhj7e@r1}X~edRF|BbIH@2xw1J##R;F> zD)k&9%eCRvWqwlJ!38&`5~Q2DQZ9xr08aczYk6tNQgmtR|vsdRo!z0*j0CRDqw8Tw$9k(w{s+j>`*$ zvCI3yrt-t(OB$r@9n@+^=?hmwYGW^I=pL|3-&u_}03dPGN1)99#7l?AA1unP*UMT| zj!SRvJ&>rm4E!f1Y2N$u$jXHf^>?%PPEVv3huu&OcQyvo{nBK+b4s-6;yz4fWm8un z3v`u?SBX661A8~8TZ40pKKqLHEqrk1@H9jMQrpJHz8B>sgyAwRVkzR z&*z&hjqJF&swf}d1zd!jqRo8YQ-Mk|+k%BPN<<#NF3t_8iVR%b*=GCCr>JWAIFic7 zpHH{ApTQ7E&OYsFe~OYkj2HabVk)@{H%tHLhIPm0j>iCjS#lI}kaP0j{|Th)BTx9U zZa5G{@V()=w z1``7J6KzMKl~x#Zu{q4dbl2oZvzfDmv;EU#Qsw(m^{4%zLCHTlS<87F+6XS9TM63o z0#A5hFim~9cE#IP+CR89X0yJ;i&a7zK0~E z^jkoBfdRPmV!V2sVwWv6Q>s|sa@GDSGw?Q!Q`w81)B~&K%0=#~Si`2IEgg-jo@P%G@>LNIuLOq{$u@!IJVT|<;xxlrAK)|_L zEfeZS@M}ulCa=jq!m!?!)UjLL2#T8LTb#gWoTkO+(%8jG^nU^V3OeR{<&Bt8;3x9HStYb zp+fwEWC{A<9$~I>(e<+${j;-h579Ea`6@(wZKD>wayeStB)W@LXuL}PLDXh+6e@)lqDe4Cm@7De?B_$|<_h z?AO#He?0$=n^c0&FIk2 z&4q`nsmzWXm8~oBldSJ}hmg=4KZ2I&q?(cO+7fS(>!{(Sk7ijYN`t-io3&D7FLnH+ z!;mT6^@gBq6C(N)y1TFm+S(fzAH4Mr(iGabz>?{k7<$ua6eLy0^Ca^%UGS*#>7^fS3 z*+ce_ejeExJ8yVhUL65R5&XJ`8+6_{rFmAl4&GQg zexxZbuXD*$lDuCMsc)4b9NY3raZ{l~+LM0&WDi$_mIc?dpv(jj_^5F-v~`KDr{(=P zts-R34n+H~6pM8+dPVFOHk-1b->ob4Qf)t$n~$4oqF1F!H$KoLDCd_<cXEf>+=Vw(8(a+72?}hu-nTb0fysFYb zQFGyP>(xe{DK&7in%f3N%%r0t6DLbfRP*XrfM@t0Va7%b8sC-o(b#m$sK&iD8*r^@ z(mNs^QXi1&hr})??aMS+F4{4KgZOmbXNjzG!LANl=cqn8{>p>yRcB}`*$KVVjWK(x zte}H=b19nQZA?}p)AKdqV^<-?n-IT1`Cxv>JS?D_`lAA$Zpiy&pM-JB*Zwb!!OTTqtw6c;B zhMcvB)y*o8yqaElTz_IJI#R2EJ#F%HVRiO7w_1~sAnx39B_Gcn$tp8-@-&vF(;jGm zsu0Q_V0_uE4p+Y(4B9udo@~Y^qI66Rlo(a+UVSI{C~6Ca>opj1Z<@n14sTobZmu8? zdZtd-dSf-mS<#urJ7P!cpyq%M1KMZKfpyhNi5f`e9N!m~)yRDA#C;?|>2l+od8NH1 zNZdi+Wky02`UV8|En=PVd~rt~A3OiVT(fV|gCgaX-#zGlN7iPutK|iAXcF>$Y~W)B zjZx7NbuD_+xYd=j0u`SqG-`4){S<=@r=Gv$>iFkRN$Gf_)%kRdXUcEF8q!{66s?85 z^XJNv4sS^NZasZc+_>KumaY?teK5q#w`=6WrB2bXSy!P)EOd#;RKbX_nOb95orLk^ z;p5jvijKsjwF!m~&&_2@Ed>dd`z8Q_AUwapxUf{)7Ngs}GT0`5vR&xDLJ(d=U%8Uplf$*LWSJ^2tdS~t?0W72kj3c~tkobr{ExBs z8o%1T&sy=J(91x@4{pD(_Utl17GkNfgK~9-boqSl>k24AB1wGP(#E6%NM z5G>MFukl*8ap}oFa*EQM;VQ<}4#;&xj+$2qXRCq}1-@RaOWsPU zeIu+lQ;n;Z0x1h?bQf^XXKAX!PeY%&$0B9fGh>(mn;hvnQq8QjcmB)usD-ca*Uho6 z!;_c!wyB7$+sJTSvFhd~8gq8M5*!^}V}yMe ztB}{wh-<9Xl-7&abr0Q-6LplyTyE#XxCA#(txbxJTF4qyo+ZTnC^4)K(>MlMnF;l7 zY!-a3S(R1(-s>U|WE|DNpcuo?Sw`u2CTEpM$Nr*KAVre!XiHt>>opib-}^Pn1u`;Z zWUZEyY-kv^XsXkbBc{cj?``VN%$}_2OO{zLv8^q-j!bA*C?1_jySHreDzaLZSBH9h z{_VmGr#^tY(pgKf;{3jdR?&pnhJ8ZPM&$M4utNxk0G%tK=dt#nY7++?a@T4BSEoKX zZh&cm1Xk(l>r?mXV}&^#)bQvtQ+4D?4D?r+k zzTl}|olF|cvuLbeQmD?e06(5+V6s$>Lp9!jkM-qBL+<(sh_cDniCob&1P(#<-S22h z-y7(2ifD!66{Z4RvmhIpz#NO_QRS_-WBWqrg2gM^Kkq5qP>O2fPGn>zMNS$8H<~D* z7)BOgwF%sqWp9^8cx8ns?34VNUgK?XdVWM1xNH$RswByE}f8kAveSeFHD}3E$>s?LJ{7 zihlcpQUc^zE<8p(asK4LD18<9k?`k#C7N?~q=$XP0tIUizm(DgEi=nycWc5VEFw~| zBAZjXG7lBJ0D{?nE-z(ms|%ieYPztcYzU7T6@<+(Fip>o0EHcgc;dOQ2ko?{VC4X_ zdbcK}=y*reD$Wsz;Qjyxe`&e@?6!Tq)-f(v$q@kS5~H3;)f{h4-aIm z&L;58$9-M)=%NmHx>W|>L9XP!77tywVve;qlair*Jo`Wqw|_v&u3wZM5s8?_ref=o zr3;g#9l+9>Y$6_qclt)b?-Y=ct4U_c8Xlxhd(sD z2uv#cQCk~yAgGNIl!}!`ciYz&%{4Zn?dj2cFajMgO$qT<8^3yHLD+YH`JDpc+)r^A z>dnVp!Yny2W(Fp~jE@X#`bD5UFfA7az8YpsTBwqtuhK_=?Dpw$UyfcJnpS}@u?dblH(Oet~b&_Ik-Oc3jQ zlE;1V>EZPYVwdcs!fVZ4t2s%th}pMkq|yk1%6{P)W-~gIDxlf=Yx>9R&l&k?Q*v-} zHA`TKjMG434>z0_!@GFymm|7_AnI2>pEH$wKBvvp?7H8(uYw zxfMMkso?=u@h(f-HbX!{fHelq#~EemRK!S`K8a7iy30a=xAwhTwOx(WD5z9pL?*()BEBaU<(+3t??V5q_*GtGAbA6q1& z+)YAq)h-DnkETxfE)bV5>XAhb2|Im!XU%kaCLK8)8^VSNbwbg0pIrp(-scsm2Tqe? z2<`;kdgtR3H{wS{-cdue^R?nvo8cgMohM0twxl6rhKTnZ5Ni+$aLs&#Ivo7cCVpB% z+tMmZ@`3j5C*sh2Nd1}4rnM69Wr?w?4n@!)!9K;>TV3At$7R4GcAS9C$!JJ}c)&l1 zO;_?Qetdb{9+gb^ezPyhKrv$D8d&IP_Ocp27u|E!bpJU6A=`YdMi z2)FlC$v-Gow}7&P!|hel^fER1II+ff>&cfHG%5M#!i%cjn{MGC3z2zyr8?i8P1o-Y zgAv+;y(>Dj;#T(ny4L|zd}_eEn2u3B7he8%^wZB6c8pcpYP6%}5C73}RUXiOAfKcC zf#V-F2GA%Gz@ysxqWw^IePFnt7~XarKz}5z8iEf@w6JM1K;*K2Cj)RG`^htun$Yj+ zFrmwM>hz9V2Ear>1*-A>-_@x54}$_!W#D`o)KJsywK7_~G(O8kQ(6OgXV_9}-z-sU zef%(6H*fXM4$l6z{PcWWbYOUTwlEbg5@tBMq(`d1FXB~bGR9cbX;8&4XDYWbZi80i zvo`kZ``Bu9@e7_Ac0g+3?DR+*I*oU!fHf9xo;x~OKJ$HxyouJbm3mNSEit#ZARsh} zS8GHhXkzRNQ`KH#?xvn$$^vyi9NgqT%orCFUd^@fx!n(##jg>Zud)L{0d5+|g?3*w zXE~DBS<^*7tEgu%YBl2IeB6?m*Ut%&3ueTiWBZ?>Y?3+wq{3IEt*fa_%V*o#w_xEY zUBsK(^loe=Zk#>SXlORil`KLl$Xy1nCq*Yl^b8oeFyf_!uh(UpyfgGbtpVN;d0Emv zXAWH_tmjdg%ufFCqFo|#IH9uD{Jx#G*ob(rZLxo7gGTG+DxR6N?s*W;Jm;|Rd>mM_ z5Z4xi6JNj{*#7kkqX2#7JB?L#5yw-@Y+s-b$Loat)xN(d1d3dEtBK#(pThdy2f*nY zztG+O9q-vn{;9%4Zek~qQ~?{Ki;bCTUZmHJg=`r}rnDq^D6&Xi-l`JkxcVrOk6dwS zm`5^GU_LlqZnoL|)%fx^vOxmCi(i&Qf3PNT^7X3j@%cDsw2V%e%VSwg1eLE`!1?Vk zR>^s5osd5{_BKNX-s#H+lL~WrR-wcCYBbVHPcm?7 z-Pgx8LCh+DDF>e)1!Lyt3hSP-19Y%tZ}h6_>q$mH0@eM^CFcd=(JD2eteNH{2b56N?JD=_RO)HW_ZEan;cM#hQE4M0w_}!ZLYy<9HQP`_(<%pPv4A+9_D4e|kI8llK1ISs?=T zB&^7XYqzTWxT-(=Qw#8O>@;l7ZwF%sa;YC>;Q4?37Y*#rlvFKKuzinE+Q8pE zpH=(uR^jJ)hAe4f|B$82zz4c5uO0nunWGMYsxSYx-B%<4qw%{}#RouHAOEKD?hF3P z;lDf2jKk(ODKpGrI|O+Qf!HQov^n$l;6flq$BcsK&4<_ls~Huh|4ck12gUyN!wwN1 z;LzZnn+W77b`FQAnV%MP+pSH;$4wTiF_^76fW^$sJFu6@-lOK;o24GzjoxE3!IiS7 z;@4_pPjuAB=Jf&zNR=bM*XcCLDn%tcEB!h?S;=f3U5(*dx**m~J~%yHs`SWozC_l4 zepEFlV4EP)RL8TFoaa3Bn)cVfI2!JtvI9me*QKup<|OfI$a>A+6|&P34uDusBtD9l zM`yUq9pm_Wvk?9;p_q;p2{V@*YvC zur76icX{g)nb6ZRJ23Q}Z}#b81mGd>?8iG*6HtEj)r?YurW6?$`V7sk;e2C)LG_(t zf4>Zke=$hK+bRFQ-jjdZz(N(g;4(BO?SbNM{Ls;wN^=Y%eAz7y_!RcvDCA1XNdsbi zpfZN1Gk{rIy<2(xuEXhh{^jRCvHhpr#p57Ze(cvkwuyc#NZYot3M*FdYKL$-G20#4)B z>1}ubAR&?HIlE=ixA{9!*h{c3Aq?irN`BF}!aBok7H=VG=i)hRPeOZ$;;FcpsNBxw zin_?z)-|1Vm%B)+<>{QAGHc!Y-XQ1Aj_~GWy{^Q@03%{rsMY6q&+ef;K;1^QW5a8G zBDDTibbM9v*izzI!9lMEb3t|im_KdhJ_XG8IZ*Ip>rQ3%8QtaMP?a{k)$~ynICozk z&NeJnIF?MX9Hh%6c%OYPIk?!>GH(z!t8fcHbgINQd?2k@l4oY8@Xm0&9&bCBiS3tX zqQoUN_{(d2lO!=R^YNX)02A=Abtv_D@nEJL(3L|Y9fg9w2NJW-bsP0m!_pM6(p}!= z1C-RdWyE}kt$#=r#!g6l)>;0UQLR0*lh+a$^YBD^77AXmMMw{Iy(eJ!O3`R8aJA*J zT`INCKQYh1(D^$AFFELCL{sSBS2S|c=s;_ihXt;85~7o~=&3!p9I+dze#%VG{Vf$f z{~hrHY=+i1Do|{E^@k-~{c`udj2Yj;uO!j?sOKk+O5@mmucm_YPO)gn038@E{Q zZGS7&xi5I3{eNpA;MptxZN6T}z;S<%yZIEQ1{BHcTwS>G4)ULcraP|e&AWxDx{&pE z!Rw1o%&~Imu28(~^M)?!*BE#=T1tsC`x8F6wzvd{OJ~iLdGv;up1JWm<0ebwx~Rz{ zXK8zIfWxS{G`#f)$Qd-+LDfdk@KjU#5=A)SvfI-0T{EC6LBvO%4GEeA;JJcgaPrpT z&4zo+|HPlKqd;&@B{B)&KIj44OY>(8xgHVSwVE>@Zv5}U&Ubif-z>tpotw*_6nW)VS!eU_h{pk^ly{Gaf-l(5+Zjznlfjw_c`ihB|gz3t#$D)hldC9&uz9GmVMyUxoll! zbD@ExGZ%P+0+{{V*8nMv80*?S;t4=1o%X+xUb;NICvF$C**Pmi+@*d8XFDgz$QOKu z@Na=%0i1>9zXiS;a2Eb+(O6~{DunfpH6AZ*t@X|!T7OOr*!`%1Y}lN**80IC_hQm+ zH=@$q9waH=FlZHd88ZkRV1DPi9O;^&YaD!16uc4lu281h0bb6f5j?W2wm^8JR~r#8 ztos*D#Jf=1OS1sDT1bnZ$&;EgB6Nwrsq%HQ4U<=wKu*lC#!lvAGy;~FpSjTvduC)7 zN~Z?;3p55!F^r}d;tuLh!wj;E@~ibkzspAw%ES6>|m;yLGI`+g%PH znnRnI#HDRChw6z#!ZPaPOO*OoZg201zQ$7^kQ)PZ-N^HUuvfau`WL=etoN)N=`UUH zr>__VL^RA|PloNq^W~;V3)>1hP{;)qpEL(s5>vwV8qy$|AF2>q&sj+c4L+U@xl!G zJK}a=a`UO@C&3yjb2f-hrU)PiL)te{*i~;dIUs;!_hnNphsvlXg=F}j10aEs`nCqA z%AnWWG6Jys6eEA(|%OnsMd9j#HJa6GJcd7ByPq7N-mcO01`B z%)qR-OJ4^{V-wv&KJ0QU{6B{bGVtEOXJ**sE152T_4D$HBc*VT=mjokydP`s@SlZV z4k5;n%+x?3@#XIfMM--Tg1Um|l=RgPjk&n3g?O*gyFgOoejO=4&c)_U2s;iimPX{8 zX;|v|2`mR_761OI@Q$87lxoFe>)B*x6@x*>pw%u-c8)4dYjzdZok_tGpYE8=yD5NM zK4XtfWzP&ptdeY;zs-#{tWJzH)mgxdHS!i>IsS1i&w=U0<^E?Y4#Q*HI13G@}w~qf80|Fs8dXd(f z!=C>ZUBFXR7|um+0qAx2eETm&DhOZD>Xs*yHCIyWzEE2m?woMt_`h7y2m)9Cb}V4j3~&Rq$;9|9y)&&~l|&&&uAhvb zWISD7{+4#NAb`wUx9XkITNgeVH#!`(ZqNssZCiNsFOIyN<~G&5i#B-9)Za0P&g88Q zD2y!;iBpp;UhMd!mr63057_@N|6C0uUSEf?z}L6S&1HbPP^!kzDnd@A!ORuEIN^VB z(`CD~_r*s${;Hcs;FD_{I?Ax3I0a%lm&J#KRQ9X7Cx#2*?=9F z@SfIx0qT;<`~z!$eQMls1=W+LA3A+( z72#Of3vl$R*_lFXZ><4@mY4sua66-Q zbpp8gfs+^FxF`47#e>nE(WUFDc}i+?#%)3~AiCbHr!OmR&e}h#RDXEgx1Gyv%Z~(Kga?2_8*#~0? zlT}2^KeP`%F$^D9Rc$pok_jp-mhb8<>EaLP_?Fz4f<0@NI37+dnOy`6CekgoH%@;w zuN?8%jIe1KK0Z@Zw)n^{znE0`R?Qw=>l0O-zcG}obVQuv)MF4I1on8)6?Jx%ca#nB zzu#$kq9|LFcw%e53jOSwha8p$`<3(BP9=X;KJt8*q52eVaE6lG~Ys&Vd>X z4m-b(;^|ncDQvJD!1>~Uj4SnnJp5VTE^EMDZKmY*Yp-<;yzSbVUpHv?6FXB?NO^IS zu{IO&q|YgnorUaGe$hdPFs{!1KmqzgnjC$zCS-I#?1sRb8j^%qzFt6FuX=lu$7R~l z=*k&xqu1&$v5`7m8an0UvGtOU6tgL}>FTIf)^vlQs-3JTWwf4#-pCIQG4y7OO zM$`hIvCF_+`9@H%q;Ya&KE_jM`%bY$X+PnIWmxI~pqmPXJPj^o7dP6If%|<*b$&`e)|A8KY^#aYjTwPnh6$oH_Q5NyoHi*I zX`Yn}xa^VJjm@t}$40>(-aOS(XkvVrEq380`HZB5(cr*Lq+yS2BO?H9!dxF`xIyAB zyW8a$c&`qU46>5ndlyg2uV}4k7xSZ_z0*$?RNJa17j5E7Hf0ePG~V=AXHq^dq-PnMfI0P8tz5^jy04;e)_GK;;v^4A z_SQiachD;5_AgEnXV|YNGisyj#>|yj$_!7_+D#_IVS7lc1N+`!Yjk^aG>!QOM;;)T zT;*bUSNLnwUkfP0nNQ6y9Lyij#o-6!fEJ8g&B$n*uJKL}o zm}wA4n;L6-Nr0w*P@4#jWv+i)M6S2{O!60N<};z|`)DfM&7b7=iGogpMe=|$p1e3D zg1K~$)Hkh7JJB(>Y2Ev;N|5c~FZh`8xb3w#^v;#f;;jjXtrp~Q{|nRME6(BcPAjH> zugUm{K;hBURL(}HDsgQQYn});dGXItISLLRsn_>h%6WWWSGszDqfNe!*lYaLE905& zdh<4q^t#z&(R$TmmN@P8u)Q}*lni6R4YJc+LDVtB*6YcgLX4%-3HD+d4X>ccG|%c| zK{L&^Q%gIhOL=7p+OreF>>0PBVATed?r2;#hC3r`+8y_S4+EsO4%|P?-$Z+L&1hHfvkkx{);(_Md`B=SiiRzp3Vs;IuscgxTSGRr+R$D;@8G#qI z>bCNabmH{W*r8o!1Mu=*y2EFNhkT}k)$r$9MWV`Bqy>wvo9|?XKARq z6@pjhtVj;|iDoSQ3DdCicTsP(eG;3za;bHG8ZBV3y^#jJh@*m(Ue1Savq@jSK4EhR zCIO|qQ$@;|%Lj!aZtH^Z7M1<6K38(1$=5a$IG;p5NBq0$_lu0L%Tl4ye?_EVWyia0 zL*BT!WLgAtc@ZNiSGzQ>L5Vb@Va+7TzW2DvBE_f-?jm_($;L)k_2yp8U%<3Rg*x90 zRyU+d%TJYohb_ZqqcPn1PF~S0y`Sx5z_wp@w}+tI()0xty*ZNp&)2?KcKQrhV9Dn6!HI()rzCLnAw z0KYRYW8y~Br!g+UEpA(_(uJFEN58Xf&c<$*xqqPePAy(PfJo&DR5LaNHN}iC`ARp2 zrW=Q|Sg2-K`{oS)c-aNn+0yCRs807dM5x(;_P}Snp`C`BGLWCyEB$aTiinv7QB-g9 z$7ByLr@LUtSPU{l3F*1jk{+%xyVY_TBdM_US2_VN^k|K09mLUdP17N@yWrG%`r$0? z$xnl+SRQHn8qOvk784Ub+ce?UvS29!F-m29Os;6X)x6l=lmg9^MvDmtLCQVbf;2AS z7Q;@yG+2`|W>anzhNi#0|0UiRX(I>@FWbc1T9nu|G-o6UQFz>oCX|WIG3!3IEQ%{W zS~J$i?`NqKblo<~1|dhA>a1N>-e)uz*!36mL?5(Bc9yBJLShE#rK;C%#RVTLR(}0C z@CR1GVbb4WVm)r#v^xfAK28pNM1VP86MlV4_f^;Et2&gEC zQj`!O5MWS>5(v@>2*Hsgln{g%LPrTCLIk8lB(%GOGxOat_xXO^`#k(0Cpl%8wf4K; z^{#cS?Ns8QKK9DBhs(B>w+IgYFg^^t9)bMu!!JA&DwVxL55t{)C_jJLGN*Wlr%rBFN2W7-BxcES~? zlLZZm+TEJ7;|Ap?u~bG+n$|*K!ICT~a)lSU^I6-o5fjofxlKl1ZnZcRcN=k}bCe&s zJXLx3oRdsh)ebFj-#?EjV9d%aQ@fa>>49*A3)EO1X|6wDw3h`>`Y{qL_e%sPMe4)A z(t!0*h+LoA#nO>zb|}I-kA1aU5;F=^6cLni9c8~blrEg zGf2XCRt1f7ULt+iCSe)q_cPBbO{dEH;?#%7p92SSSp7a~^5(kjxr=a4P3K&mqq=;N zl!S0NVZvu)K&vezv~P@{Q|d|ZnH22q(^?W7HhNLp;u8O0AZF`CZX$d
v}fbkE~ zRXfC0pKC0G`51>1ij@c42_br8(}UQeSs}m}zs2G!a2QzNd$QQ!d1`Zt?8sBt9kJm0 zrtvR(hE(7E^@GPv`wRLd6kvW&e2Q9*lG}d%itkaLQGxc4yBTj-jS&@u#R0QTq;vIm-a)?VX0}Ae7?3-Ua?oJ+Ow)G=ZUajP>w(%Xv+8|_Y?6Sq`pG$w)qDpvLj%W$ZV#qcaDhc`BN zYL=ILWbMLxkdv+k_Lf5{-wK4&i8P!RWV6Tor@@5>$+Mr^r5~g>ZYlHYnYa|0zNXaD41NKqVRbN4$5z;Z zDso$e1Ig`Et^JD$MLsI}S<_bxikI6>&R-=j3kj{;6Jpd8^rq$Orp_%{evf_I&v&cU z_aqzw{qr1GHsh>&MARgGq=r!pu+FupgNP|*}A9qL-eRJ zOs65>Q2_pIe!-9A2{behZH=1#6Q%PF%}WTH8eNi_Y`HI#cuUU^qxb8A=+J3}#Z)bb z$Iag7*{#x~8&GSDJpytshdlW%=cbu1a7WP>s9&q8~*`W0qQ?MmXq9yz!l4c`!;mvA@V=4z|(}HGNltC?Dr|eStxo! zN}VGB>aQo2xW$4{!B{>ke@B+JPv*IvVkgV2n7MWsn)RWI88+)K4HN18trVL(u_ z$Q7N+cAJbETK0(O1^J`am?!DF!v)cendtO@TQeRBeULzVn{48R-fPS8h-1-U%uTZ< z;qty`ZY)-?hUlr3*g-Z{bz0Ne$^MkiX``N+yKhTz{8C}RaPwKN9aF#DYIK9gshv`N z*=yqKf0F~lUUW&dK<4QaG28u0_l7q8VxH^4b+UvVM?BXG6JQS-So%0oIQ9ODj8PCf ze2YJLlS_S~ftnEi7Oi=>>Ha7AM*}=;+QsNjPJH(d;1pW`fRknZ8gS~+Y3#tH=(B;& zAW;$WeER2r^@AHIm80zyYSV@MTeLTJI!6!AxZLyZOs`DhS5i+E^{HxP*LBzH@8s3N zKUfF3*e=!->L*rrS;>tEy3u+z@RIp%>bFkXQ(%Aj5lNE?G1PZ&qBDaR<_(E|Iq)8i z-UFTo*UzGJ*R>YpEgUIdgT>1tzsgKfEfsznO9l(@HlzEvC@rlFoX$FEc%agQ)zW(~ z((74!{B(fW$dkxa7s+^+eg0qg2J4ZGGE`ee=?Rlml7&H#(J9aL`jDA13m^SreU?4p zu0yCYfg$9#cv^X}mYv1I&vM~W0+zYK@NH<864(B_!4C>5h7W@}Ew9dyXTqR!y~ z9z`e-=iFe2Tf8*s6DBMO9i^vwray99Tw*Ck5~t!@b9uv!XH<5B)r0F&fYUjsct)&2 zEwdQ+IPVn5hlD*S^-~pL~#GMo=WVb>=D<-IlXMD!)yy(6G3%QQ13P-_j?! zxvUfA+c{@)PSo7B6-^fgb(Jnv)63+~9mQ#_##@RsS??Au3y*`S%UgV$h)LkBM-o+* zw}8l9O8)BnCl}(In*qu9dyKiuv&B3~O`A9pHo+0(O zs{v~jASU{^HvDDUf8FRmzUc2CJVfr4RR-QwL@`|2032@PorZ85`1aT0*V_6YORC7j z0V>km@YfouVF=E%Stt7RF$ZbBvLR^&ceWkyj53IP)ptWQ-M!22gx2XopAaWq*VB_< zbwyPoHUPFcDR$MjHj}n}JMK}gSxjvLOPiV)iPt*;RmfMnQZwOTVBTX;eQ}LX0Lt6N zr7M0IC{%oguPs@ttwE*#L>HCS`{lMbl4y%FnH?rYI#{P8w?WI42z&$WD5=O%YD!R^ zyQywU)ndRwAbT{HL-*u_?+-&TR>N<`?T&XMn6Zm#+GfIPEA-r0_7XM~2Fv4xqDqcC zVn}DoiZg}1^F+WaKs$Sghl$X4bnZQ><2=YfK z-_DlUlk+o3gEUi5Ek;LjiO?PUc!3%`DM1LRUk!eX0HY+f1>aAvkoR7Yy#-lkm6`Uk zXf8N2&!SE45?BXpUwLeQc{1e}Bw=5E_8G_0;i^H9A+BuJ`<~i$H18N&5`ny#HkmIk zsUvgPk{IS?1jA^XrMoRozcJ3*MF@y!2!3n$;~rR?MCAbDRJj17)~{sC){h6o{CRZjs{_PKbZZ%V8UEq zVUcEUIHkVQ`?E#wSM)WbmnLa~RTH*J+Cx3im-@NV)^9PTpF0y_Q z7yO^`>6(3t&Ji64R`xf^xEG{R2$@+{LyLp+1wLrLJxim0ddKRoyd-bHId%h;iCA)z zZ8|CPdrag@K<~(1A6j4p6;$~QS&_d}R0?3LLiWlP#&O4))s?B$!9sDd(;NRj$6$qH zKwO!#SS=T(L@uO!RnX{5nlo4|GngGM6z-Uje9alUF!PeUF2YnhGB(V1c<8~5!3VFA z^}mVma&i;cVDy|@jxzWj<=j^=uCh9#LJ)CC^L>Rgzw)kJB?h&st6xbJv=`YJWT69v7|qgwXR`8J;j<`7gN39H#k zH?H}dLS8}$bjY(h$b*S)n?AH)TiFKY{kCm00yZmeLF+(I-oR)DzeOBQo6TwK7H4I3 zCI0F&EUreVF$aV)?XQ56;otPf3Fla!NG44X>!(O&HMEh?3$=z7F` zc3<10tglSDC(nd~dpE3q?HCh`t3iexHgA1WzGD=7uxgyDFC%DMx$jp~XfQRF|F|sH zSLWQpt>8vyV^Y7(s1P&Z%B}I6@CLO95VUU;84s;Zm+?^m1dB0bf!fF)Uxd@?ZE;9* z#kOIk(=*$OcQm(1AF#!Sd0GvebJY5#Xq?vA|G9cv*UV&=L$b60l4l;E#N<$pZgpx# z%9U8}_<&RE0r&mWmzXU-+S9Cedxm%6_egXV_R2a7uL%woGPcB_Q zSq0Yg&^|*OP*3}E%$G-W&07EO8}ap9z*6*D&W3sG!go^af3kM;L)Gr@RUI`}K@U6u&1UGVk7IzGz&HrE|KDU_j&(7_7) z@B8s{7L{|)w?15`JursdeR-ks?90U30FK#W^SDJ}{y3;5XEro$fKB?a?>w_n9Jco} z-$J=9BS`4R0{e48aD1#pJ8EpDyPBw0=Vl#mtVq3IU(K1cF_DIZ6n36%3&CmO=&T%{ zG_lqv0Sf>(Tq?$sK-)VP+Z=q-Sdtmswig5mGYt6<;(45KaEVf0!XD?0tDU%3H9Kd7 zduO!(;S@-L`ze9S?k{A z>(W-%`b^pmr(3NwKo%rpZ`?U7k1pf@s;%CT#>m4rNT-OjtfS2Iz9Z@$36sGPL3+TT{I zkanCqKc_?u81sv~5guXh#jmG;S`G8l(2~*Mbw}2cS^#(g>IU`bM!ZYd_JsV*hQ2&w z$^>`>q~Lg7^9zJx)e_G?Td=4WlY2UHBUbxIQ7UOcn zBio1zW!mf$`84%Z0`h=ra@&WV_)k2+{*v~`n~E5iK#)Uz(p%SxeLZEUf>lV5pR||d zpj+KE=m{zvAS7x)Q#s;rloqD@@;dCJMBvxrCp7dMpS-1 zTJrAJyR@$uwbcjF)m|xs*L`F*v0zX#&#rAo#@c!&-ml14Fkh03ex~GXY_h}t;ZqrB zHdWauj?il+d>`SI<&Jtu^$L>9?$F@Z99MG12W+=S&TrhpugM2n2ax~=;A&6$!QXBG zz5pokf8c~4j#~6&fct8Q`1h~wqJZ)U3-mxB6-orTy|`kRXrW&3X4ZN(Uk#kSxCZ_H z+DH65k@gQzY0!jL*@+Qk#qO+$Y}ftRF8mYd)UH|C`JXQrQ%MCfq5$bLkz!$&<||xS z|8;BY^zjnr;N8aRp6{aAX24jVd!3ziAE;#5^{$_NyA;y=L{VjoKyaT;%^54Lrx)05 zwI+TEwEpH><~>?emAFtT2C_cEa2%)iw?|YK)Gtq13OI5q&Ri-;@AX4eF)n)ILo}mt z>7nu0S`!hsO#Mb$OlmZ4o-DSsqF%x2!RimOX>HizDzBMyJzg&jDiWWf`DdT5bqER+ ztR1Oe9IzA+U?5!}tniF=N8t_bre>`8Sb9ZaK?O6s$5TgjrTLMQi~G>kokik?cSYcw z?#8`(RKe{9NVRkbgMX|Vu+oY8XzhEm7s-$Ntv_uWrn0bfA>6Wfp9Zc!-BL?y3WCbE z;OFUCGDazLims+J=-r$>{20{&V&j+8v~KT%kGs7?m8Nx*tEh}G`3Wy(?9nCTl)$49 z^F2Onny`0NE9?Wi`y}Q`Y|q$>c8lU3DgK=|(Shv?x3!bkcuY~%j)`j!ubYFyxc*~M zNqLtn<-8_~rWVfy)ee^m1^y;k3xhL=xdQxYXKp`SO>^)%v1(E?HTgaJ0-N1|RB*(O z&#C0RD!J8b);j*3+l>(RG&Tzm!vYe=%OT^MTY$7{J@!+tG~{TeirkDH8Y28Pu}j_c zCY-A*A)2qwa!>`NnW?>+zt&NWX8M?MwN`Qb1M*pY;#VmIyEJrU$9WrUGX-l*Ru2&` zqF3}m;Nz$u{DjG=1G6$oN;HQh5_7a;+~kdqQjuhPo4*E9JJ7DHLme}qx_KTFTj!V` zAj^>Ab=srvf+B=qdUgL30^F&An${(L&5<{WOEH~%`$z7y9fBg2M^&<2*iElF+8HC< z!_?+N4ogN(`iGPYlL+~(QezQV4_WJtn9|H!_;^U-=Xwh51lp9jzL4%HzlQ4n;g;S3 zq0YsKVR89CDo$QIaR1i!k#FtNzKk0cuY01C=kkg{ z?%wqIf$l^rr(gO&UHhtvZoI1y#|;uD)z-8t1ePlqyskaZ$AGjRKWmAwzDKegF;W}^45gI^PKMr z;N=EDV*z6WiA5OqOJ6Ke;^W@6djT>kYx#>SP*W^VjMEHOreEWjT#m237txBvqDt4G zrevL z;Xw}p>oA9=$Y^!AKqalquMcwa28nZhuS?w(Mk_rk3>EvzAfn>B6KzhOnxs+Rb-J)ZE)USjf$G-{+(xa92V zP@|#DFLGCCOxUE{x8m+9Ls288rqiByQ>?r~G17~ju}a5$9TuFRt`vpNHQPb|wvH&B5b&wLlE~4V%jAM_QlP){4 zBs@wrs74fU$}frOWG?lS%v-S)<8z}LJgUu3Rx|Zyo|wYAzYV+`aO9$HOHtq5_nM`k zXySYPB++zq{Mgvct)ee(ol>MZwQrY0)3S8fZlqEmo>*d#WLmSe&zFdqZ&;fh#W)GW z^C?ij=f;49iyj(hhWMsmYiVjpI>;sj`5I36N>rZAHCJ@>+9$Lb`<8<+?NlvUe&X$Q zzLIztpI)-@sJWf8{MH#NIQMx9#v3OX$u)@q3T$5Pd9ag&tVxr3(=GL3~4 zzm@i9Ic}u`ClTm3ib02l4Vl?H9!h1&N4f^veO5Kj3Ji$v7V4TM_R&h>5+{W9&sN6$ z4i7!bZZFa=2=}4h91IQ0vUfdY4^eP{>2B8Cz2=XMfj+VU2sZ&f5?P-Oc!ki;HThDi zJ2=J=g~NXP7kl})Fd3K{m)D|L|K0ff{J}`vW_%6VD0ck$a+egyITxukZ-!FS*@0&pU#%_=vOlkb|gBBdGtq%#z1#{V`2FBuRp0ebGdJ2G~!dS z#pD$k@Cl?rZ9@{XP9Pa+_p@|TNg<+N|F)m*V310B2RPC7V2X%=#6u9Gl--2%774_} zo@|7&#X+Y2Y1FKU$+>gtg2q1?woUxS@rke({k!(?1byRmSdF6!5ELxJs?MhFrT(I- zaoDu2AXnL1EMFBI{ni=(34j?Dr|T+H^=hqcE%(|*TMDsKJe59RJvF>gt7q0jN!NlL zZjt%|-^*wa%lwm$Ug+6o5E#_4Ju<|)&a`cMkEjtJ_nva&4wCDN2kT8buR-TQPUDca zTyt)^mg~>@VJ8$XO_cZ0`v+WEt?iThH9~0`D411No#s8?GEsXQPS`Zk>w-2-fTY%y ziCSXMxIHc`sJPPEarxE;v~I?VJ^&|r#)-bJ!^y}=6R({~oD`Me{ll%j)%|t-MI**N ztZml%&q}saQ&<_EhE!q3Qix^^j>&QPM19p05da@)D=p?w-{N>yHOVQKb(#tKdY){% z_P3Y&fVf%IgR^O*c~W^oyW*)wSk z&Ijjfro1;OsG}yoD-#*&Zp|&%2ww_9r+YHmeb`$ON_gAd60^gjssw+)HL8^q>bk#> zk1m$xTMA~%ZhagM^x|rzc79t65zkQ%Ys*L(Mq-?*LqxlKqVe zrFHZw3rwM1R;P@8sQSa1QMGp~#YJ`}W@}!inm_dvgVnGFH6grxH!7!AJ3)EFZ^RXY zy2b~$;|J+1BR-||wcSX3W9ztiO5*RB-Fz=c;wzyh8b(j9(T_38>H<6qYT*#PYgyL6y8 zRUHyj6E57ilyP?2?dHj(^eJ>izf-*8<Zdt z!yHoqITorngbs-nkKlTnm$?hTbbuKljG;kW@r`uHUBDVr*50J^-z+Va6mc3Aa~GE` zVm!rM-qHn73jORMVD4+*fQuT^e->q#QdL#nQ$>cp?=wxN>hS+-XA}=+F-Tk7v!KCR a6*seZdhV;BCsySDj1A3yC!TY@_dfvT!G3@M literal 33620 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�##{MXuV|E93TLj%-Gr-JM&y8R-Q_rauF5Ios=Q{>*VODt z8F`n*kD-spbUhlUBl3W!ebn7r-2t69^fSei_y_7!Y%iBCT(a>R`>WAe=@KmR#f0wH zd&7Hz*vfrX%l+Uk*r7pDxH~#DVb#r)-=MuFBOnmN<~Ir%z=_mbC$vmEl$mm3C~aTn zi7!mxk>!;Yv~3l+A;x1%`|5kv5!aXV(uNXpcP6qb>6nI__@cgfa{326qF=Yj(hJ+s z_2Q{r<3U~fG@Nmbov+vms_NvFDv;2XYHg)6rEi|jRqu2JMIL!zZ!nzPb4sp3E$duB=>jTep!7lQ9vgTxao>fR*Pn1d%Z6(*66ys!F%=5 zwsxGk6Sy!GXP&sAZNM+fh;~aJ(GD~|6J;OEF32JfCI=?4N&gpQoe)d3 zgQus?)=HCSpzazW!K8C!NE)UMsk~ZCt;RFg`Pv$W8^RluG&4yuQ1)5L4zVV`x+bfv z+qhq9=h9^|HHN{m^(DHMQxdhbQXD|2J17~psFzNjc&>yX37NUG^mGUMdyoR$OXYNz zg@-=(6Mb(ou79^+F-Tcfr7bm~o;N;>SqG`*^;ZzOYA~-(61-_{#Jo895S3OmAgFVK zbmGy_X!+gsId=;JrMC7=pZ7$-w{vO5=zMK*Ar6U z5S`;VY1rZ*y^D_abuFIwkVM{HeQsH*l{Imk&RM95O=3RSW9a5As;sD_Yg&nmnTTF6 z5Z*{d@Bh?c{9TGA>bAf-+E*`ea(eg?=I4jssLUF49<%<-M>muGBwwxA?sGkky%tK# zz}w_do0DvBc|ZSXdM1O80Nyw%xqo}RMC|jNh%n2jj(=p#s8;yQ1I&;;Uq}IYzs>x% zGR7)%nd>&gzz1C1J9*B^Zny=MFWQTR(%pj;gzpn5w6M3+KYvBG5DGITknVUs-T8RS z4ox{vSytkmyUB7MhnecgSD|I7vso&!b=ri8t(pS ztR>c+yF42(Ao#txqThv4gpS`G5hV&XuV5dZUZQ?) z6l$jXDpms~(w~ry;%pmUh%=s;WsU8NYKXFM)Xw+LEn6OzepZN`)s4o6iO0}$1IBH8rv1q7>D}C7ZDcx= zY%#cksnjEtYC_V68iWYFOc`A4r^gQd<*#TjorAEA9eXGFhqX)Q_~#~)l4rN5K|bFk zPtIZw#Vb*{n~e7+JMsqw{{Yw+=4-n|(gUyck6-TpchKwgAyDYb+8$~nF!mKFL<(;- zcT5-kJf#hCFtZVqOuV!*s&5Lr>2){U5O~VJF!R@yaHNhR#6_`q#(lT=b5k!QOp9ji z&eHAc?-P{67M+~+JbuJtigfIyKL__Ra#T7DdJ&;fnAueM>+|P3jhngAM>7D84!qoB z*&U`h#Q5s{jk^dX3VG<-$vL`v^q^nn)ENT?C(0DNq=;A+F;CLh3Fbu9#!6XjCg4K_vu=a z#z#-^s;6vomG-#-iL54SYQ{y%OI-FLz=e55?`uXkJZz{UnCR>@2>jNH?R>h%DMY8g z@$xmZzeup}t$SXaZ*&bC6+&tAv@AtfX1SQMm!tduPg?5jY;LYdT}sa+muNZ{RiOl9 zuRZZB>co6abb!8$c{REkgsUEQYDbcQ@VNrX1 zJM~~q;65fGvW^f_0)KLV+dLFJ_3pBI|54Rt1O^u_=RM$({wvYqjShj32hI`9j5$Bie(H12xob#FsHt_rO4B*l~=g4_=$4I)o%w zbd-|KQWVA}T3nZ3A~C8Ig*ABLA6>*te~S2of3PRUbu5+0W8CgMM zTiv%iQ#Q+sB;u2LaH(Zp`1X@@=_xQQqi5?|IDLZpA21*>;`3wNMW}Yp-pR>t9R%{1 z>46`tsd@!$8mPP&NEza+)PHLj!Iq@fD#w){f?0X%z&NM{JA+x@9xUpkWIz*`Nij=8 zMTYW8NkT(o8FT$wFKci6Eld6|F9sk?*2G=Pn!t*(DLzK`;R{{+G7O89?W7qyCXGCM z+!ZkJhQ+uxNZXdM^3#&4cMQx=-^App#IKT4iBXKLZrXiA`^>Cz%~qhz2h*)~uZfWy z%@$6ho%g~5k*>FQZ2a?&OE9cP`@eIqsv9*&wO8fdh-?5e`6)^9Om&QB=XDmwBswUA z;i-Au)yeDqtKEN?mAXeEHry8b}W=a zku98(QOXsaXFum@c$UiieY!v68XGwD4DH@ud0 z)8wbRvWnHgT=DEar@Y*em?M1pi37{MBnSJFoF4HtErUXaZiIv}7>t659a1;mx_g~N z@OFRRua}j-wTD*jM*bMkv8K*-@EH)oC$eOF211qiBF@g$OY;<@NrjREB^92swe&hY zt+T5(@mkk=2-$p7y4dqF-%CI)o0YIfJ}$0_*oFh4ZoE z_S&)O6`nThZb!F14<{k3zc(;HIdUQu6}!_}w3F(dfpcD?`e!YGdG=rNCS!Y^1}u$+ z>3i)~yZMHR+G_A^fM&@2H=w0?&b2s7+G!lNY2_Rg1YwR{KIax-`7An_hZN`D1Rzmk z?rhzgahAC&#k3F2o>;;89ysu}mR2^GxCG*ig#PB+!XL=|7W1Hq3v@O3G#0EaEB7u# zi(DR%Wce-P#e6--vwoEy=I?-X$=)(tZDr#L`lf-2uZW42h?x(K832PTcE_6Z-?J_MNWomb;}Y-xb#5Lv^05_I z+y5t^M@6*JE^YpKxbEGe@(AE@{>BKeOH50IJU} zSqqDbmQLVwZG-%&&7{o|43BA3Dj}u-+INh;eEa;-0VZT;o{AHeAp151vF`czV*P|A z`s|x9@%(nN*C$`KiPD*0x4hN(%yeboLD!n;LjM7I0bmPY+sx zkhM6*ldknPPybrIqI&A5mHOsJx+c!FvMJaGC7@n8%Z z{C*!e#aLCCXtf+e?RpO{1iL!I;apJlu#Wt!7Zak5{oxU4p2lnb`PBn@9X-QoN`;B) zz>DAZ=L03B=tid+F_H#@ssan!9|rx0N`H*H9p^W^34)>vUy7G|ia#(NH$0usxQ984 zTrw}P_3f!#zilD&u~w^I{yNuqGynZewL3VnW1+05)$Mk@-u&S-dhU+>xrNn=5sNVCbpo*>MZO-yFr2f~l8Z6ni+;kY4!f*Lr1*iOSw1t!NW)<#@LEyR?<=Gvn zdr~pmG|jd?n&q8L6Mq-F;tZ)8yW?_>wx^wQ$@vj$-yUfv$ryDuSJ8R+7Ar`H-Bwdp z?(p=LZ@6=v7&+N^*_N9brB9ho`@hj5>)g`g4bSWN(_Cxt@XeB3z1h#|ih2EbFF}c< zMfh##w{6YV)u+;Ubj((rx|gmPU#W*?rmG^!e$apZ^D7swx@dyi&_Ca*MqZimTKD2Xw(swGzMPB zou#U@%`v_L8K%zeBkr@FB6!T#Y)hfCv06DRmi?|RY0?D3;K#0Dh`5o+tR29R(9}Ej zh1|NQmmJ5?A7#UtsqS#>=-{@2sneL3uAdHEhShcqxG22-xSLpBlZ7vq+jkq3?VBo%fI=565HNznYp>v6Mf=-U z&E);aQ2=U)gjrrsJy*=6)v~lxQgP~K=qewtn82angjy7w+pd?7!O+HClEwWcF9eERTWB2JWs!RU3DLKl#g$ zJxl|GpO#281nPgbP^6$h-pVsKjX17gh4CpQQduxi)UPed`d-IToFoW@E5|P^!+)ob z<>&uC;p$0VE`{gpzSdfBE<7c-mw%zg2z7sEauj>E_-#6HXt(v8+}5SP|S$SurflSoWCqG@>RCBf-5ZwD7yh>D60XPc+zd- zYdql#fi36GdOTK&bhq<+P_A@$`C-yn{&23eUMFx^7Ia!J>DAP_;0@w`TxnRRk=GYF z0Zl}y*D#7T2&Jz7rlq;xGa8Tc8wutr!P$QqsZ@bUy#Q1r@q5#RAuHvzdyd-MBVkgH z#OW?5Un24-A3OAZOme@+75}}jWs{ub`FuoKEr+CKcpM#lW(`()BE#L`mGm(72Jfxj zXZ=0gt(D*lrdqTbxRLgRA?Kce+bs+iNn^2!y$Zskv$+-kQ-{#tWa#df z=WetZUjOW1r&~LrTT!`W%55yoI2ec4yr8;@JPMd#>g685_fpm(>Q_=`Dt>&_Y_Ij6 z8`D}IdU%hIw;a-+Y}JF}F7YVu)Uso_En5uGI(zzX%bJe8QC8%==oZvNvGt^07WD43 z$AFb6HfPzR+<}80D~`2ul-_n!RnzCE`t$zN$M2ZduCvt%j967qYZ_Uq?!M z9KAX3M$`A-C>5*TGhmL);DeSKqnXg~L~3LPU8j%x`0sCJee$T~pAVp!Iu2&4)s`=i zolIkU)zA3Q4m~xQ<^CLMvFO|x9>X#hhz8C9Zob@(Z|H`wBhUU`6!q012jDLZ-g^Aa97q&RHv-hwo0q|dRpsz zsPqVqq4K+#{XItRS;_B)+hZ*R&R(l2HrLAI+JOQepzerX zvd}@We~_yrwp_!_R2Dd(Q>l@`hX@J1*4n1VM-Q4>ef32OTgwI0@SKx*#8}zY+Q`V% zxOsKkH%PvLO*pSdI&+3wTuQK*4{G;}BP=u30!LBlh-fd5ZGVzqTW&7qO7u z0YWA|+(L~w{a$t+pIV>da%LD-uO#-!%@ATyKyd7>IoBgt2YyMdFg@`9`e3=;&dnqd z-{}iUE1pN)Fw?IIT!NRb&IRpMXX*=Dd~#mw)1fr_WU=kc`Hgyz^_iDdhgzYx7+ zj}y(@$?U-{kuCD>S5H*s;*7W#;OgSkIM_Fy2MOHM1tR6S+y`DCZCWmFnl6uW?Ef(5 zYzS?>@-X}H?N7>WFKF0T&FAl%IjR8f00DHA1j2g%MQ<;mpkSB7_I3*MO7*z#9ZGi? z38+fpGR5=Hs@Yh!@77JnYo$U!F#BE%|7sfh2k3j>4*~9f#?t?ajQ>SjT_%tIWAyxg zGUoEp_j`1|katZ1`Jd@n{kKOE$YSj@nqKbF6_Ne$gzj_i{`&c*t5<3lR5@>5|B2sD zyG#}Z1Y>6P;2UxtKzh1Sut({?XeJ4u^ z;dGE#aJ5xkyDMZTcNv<#F5x+qFEnnbLlorLQ1p4{O`6r7JfOS^dQ6x?#Nh$%C%1ub zl-YJaDnZs_Xmgs51sV9-!y}dENX@A}uNT+)K}E`ej^Dqp$Q%D|i7d1mivZ}6eY(tv zwf$MnlPe&}1cXzcvAuMO55U|i4F%+wT_3v>q!zZgckR}7AnSE+Ab`j~7<4ke=14SU zx1`LpLa6;Sdy}}Yb&F7I2ryLDPSz5Jqw-o@IS4=mB^5iGYI_F;^Lcs$!k_JVRPS2P-$f5ehW^gz`g0mcd(e7-C1~U7om9ahK`be{-GUsAh9;8KCU@Lc zhbA*50T$FrbB`ysL`wga^4GT?tj@qSd)&ChbpDCT!FV0Lh#`xT*N{}Y%+x!&O_K;~ zC)V2ia+nlX_VD%@)ZXh?!boEoT+E+srH+cDPV#}_h;G-nNuxeM2l*Dfgiq|+ah-f! zdB5E4B%&1C(BPf%L~`Fzx)jXh-C7T8jG6gKq3lxU6U}J{TfM?*VKc8LfE)35(s(nq~^ssOp#kX%i6eK0NYF}+j z4CD78#VCCn$qwdN_{i%B2y~JarW{mhkPPti*+ZNz#%HLuGy~=YlLygQL~6M~i@L^- zn~W&;R867UGdt9`YT{p(P#oqaBsIWB@GHY16^FI@WJmGGDHkeR$+Y3#HR zp0&x;li)~^G8mIk$&Ea|{XPg>Aud(r>uyHzm{)PN`t2A|Eu3$~Lc?5-%paf-GMC!m zD47t2_#W;7x~|>#W#x8GzB+^g+#XJAf9WH@E0*`#ZH{}5wpaW>3YV)3msdg2ASEW#)Jba!TuwDl+i^Fyvx>&!ZqqsZZjmH{W!AS46$U-9%s*2 zW%kAR+G=eSLHkqq_D&IEy+W$C0eCcCSCN_O8oSUWv;Oum+nTD%9Ie0Z&3b%=y|;HR&lzi(BgL-kpECUWH!* zP$$omeWxX?*%V9`V&dA9DkJDDecz={!2>Guni{Y#bHSsviH+dDF}~&pRW#HpnvpIc zAC%kv5CeUevt>~WnQ6<*u`{a$2#|bVfa_rO`~S+-e~-ZoG#c{1FR;}FsyC5>p=Uy^ zZ466~SF_LEKIoAGg+qRX?9L5`6VbVV_*Z4WxlNC{`=~uYWr2tD5q_szop#ql4mz`( zTj(J^Z)xAmXL`@t9ZIKORtQA?rwRe)zhv$X4r{dJv&>ZaoOQ(R4ynitMT3)Ri8Dkz zLHCxgZCo_V>(4f94IqB(ha-W2dEJfGTLt&e7K-*xKs@~9Z$A?9b16hu(uo_ICC|`R zuEogdi}y%r61NNCBLtDjvgBn2GSM2tv7e0R&wJ|L4KL_}sd!3^V zcl6&S`TVS%z76+jdAwTGe5!j_u3U6CPrvz5;7+06#o58$v8YjvgAosV&x}I>dA&~}BeYa@DUD7^ z4ZiXPX+cJ#k}qFiO<@f^N#vV>@d+PgC8+ z#8>|UB{Mv{AGXm{>Rs6cV-%eox*ceA&d-$im?^NMxZgT1`^dd@I?&*fc`s-TC>Xu2 z@+6uREF4der7<4cTFns`f2Yht+4VrlBpxh)vlg8()mjLgiQ_jf3)Wj(ANF}#ywzM~ zJlqjfU_!3XpbVv4Ei>FO4r};#mfc6nexx|2X3N!(@~7c5{-1XT-Yn&*0K%_2E`ik# z^+pJ>O7JF|5UIm+*R14#VL5k$X3?nNNDa0G_06pDbi;LC6T8%*lZ_Ua(^H+fvD>J< z#)wKzX5$pxB~xxBX3`-G6wuR;61>nXQWdLz=QjY`Y?_tDlkP<2)os1kZE_v%3dwB4 z6bxEA^X>Aa8Kf*Jk>>K;k4q}LYKM-tyH@p}t8OW$S>@W9Rtpcbp0RUe_61zO4MBGZ zudi$sTVT`Th%-bTo*Sf$e9jy4Z#z7wk32+p11sNkr26A8i=sX6{*}_>7`9;dNA?{KWRgvsfPdd@;Y)LmpYDV1(Ozqj2u zz22Nb(-mlOy`x#}#$C{OJaG}fG#_L0Q9jewf^=Yy~`lAJgkfRg&(qm7HU=J{H3~%D&2g2AFf}gSkhho$@Bk z{r%>pSatT!0Yf;X$>6m$6O^-Tn60~`Eo&mmVIsvl^&fzbkRkqRka~3N00)QS%tlS93pk(9O;WU>=Gl4AclNd|j8d2Nynl>^0_+I9}3M z1+I7d%oH?lD(^ueSMPG-g~EmURRo6_+!J^#G1bF#WY| z{X}Ap*QXEQgTFh!BDRN(x9<-EwVXL$h`j_1Z;7S$UXMzT%*Mt4Uo7rr%sXD}6HfR2 zBy^wTU(E1jtv+*+)I|m|Wv+ZZGBPed#!Qw%PGXar5Wlc3u^^tBrK8{F?wu`!5_qf- z+Wln4G!K1cgJzb+_H>l1rQC?#<6`cs*_#(~)JjiUrf2Bk9K{Q}QFLsLHT2)Qw#iRk z$enH{x8&a}ImES`m%mBz@`PZXC6$A6Xb3ywwgqi)Zi# zyu&r}bMpx~#P5uC^ClUe;GDGord@4F3{=n8BkePvR9HY6G1a5)rDr)`n0*&-2Jr+T zS`qs_ygZbKEh~41T4h5i@M${Y2Zc>?K*vW|B`d5VbGr{}Yx|)5LHlC83DE1bRQ{~c z{|-^6qFX^k))O{gBcsfRdjrr#d<$u*s`?OTIExv*zkrlSSIVh#I?%h}C{lk~ZFycf z0(g4omX5RacbJ{vt|f#=qZN9ce<^v&n%lHxvGVjEG$3p6-4m>6w|i`7lsk}x9QSr_ z$_ZL{5`92g_wCMSLGP$A=$?b5Avntv3VoM==dUj}G#VRXBR%mr2!k6GXY?Ypd6#by zm9TkUGzu_{6FX0{glZ-}jrcV=UZ1u{js^io-N0ao-6iq#)MOgqmc6q(Xv19UZntZw z+d#7IM!S#PSQAHlOrMK8IEoUq6<*M^$s*8_^MYgiXZ6T`WGjygAYUAOUaY=+O`ee) zP9GKcQt(7z##`0m?U<@)U~6IGcPplB>XN)iMSr(`2H2n`ejZF+^-P`0ymX#=B)5BJ zhF*i`xyGmnn#I4hK6kyR@U5>ATPa*=>%5>Jp~q=cOVA-?ygMKxY8$$;xrzsJ?te#t zDGEqESKOro=pO^SUGL<|br0c-Mn+wO7gRRvoX-H}2WS$kJ*1MzU|Mr)_*5^*cvU$D zy&-a50=>2!EYCfsGC;q7m*ufmkIQM;G<}jd&^ES+Cb*5%xcs}feYyHKzNj@alKh#| z5rMAl6I;~NHKq0!a65==R&UkR(v9nPLoSD z1jX=Coe-ICT3>qX(B``*qRy-`qJ5seVP~NCNHR9I7C|12;X>u)OM$sZ<^iw8+M07E z1{>Ihk+YG#1PQ@pcBw$UibG$qOlvvWFj~iGB}8B5AX{UL}M`Kcxof7;v-z})l%N@;y}oO_iy3j5k+M=GJ`$*ZY_iHU5;kmxvRawuOM zj~}d}Gm1rL2ENK!p@BeiSL5PYom4Qa{nQ;IUA${aPtX4SgyeZ>(|-SgxZrrpDk1m? zZR$L+Gt%uit+id?`8Q9F)AUepIt#8(YW4eDl7_-icjhn7vrUC(4S5m=39F-1ORnAr z>n7-kYev{o<*c)Fg+_-yV;*l@vs&MdmTL+PSI7ZbNW>&6HjyJu&|4cfIZ&R?qLS@y z9d06{dj~_kqOBlZPC|44r&FTI9u#5{Pob>gK6AB626R8YS5)c@XQt&M zgc?83b|_c@kRg}!#`nIe7A3O1>ho_|NK>fASf@6z5647Q8gqPt_z?nzV_nLa#iOm(m+m6ml z4N?BD@B=iFng5{r69B8P>$518N5l-{cW28zRNj9AtN-d7`v(_uNxlgDAU10~Z~HGe zvE8jbBwo+?N_6`SKU(zyB(AlU0rEB8A>!M=Q8{a^#K)Q~kAH(%{VyML2TMhK;v$C^^fchY9(F-3HMztfWpB5>%fx0Q%lXPnP3zYw44yWoRzvNXH zy(cmG%=P{-cfFg6s7p|p#KB{xXGIz;V!3S%u*F{g$(CR_@Ac{7w;D3A(1Y`$*bPOp zZ1LPjYA0xff4AF9H87?(QD!Y<_-osV73J3KFj1LZWf@G9yo#6eL0>Mwvx^Hd>b2rW z5pYw+2Ix)<^*y`MFOG)|zA9=8k7uR^-aevcIvU|+r43HVpoRynCB=zi;DaOidzVI1 z0=H`sab`{YhO8KSqy{u99vm+mhf}l6Rsz#+@ZQw6ui@&f7L4${0qD@ohBHI3zPiFl z^rA?DQ7e87x;!g2qf*AfvPW$jxRB%dD<^GVW%BjbMu+tJ%5W;PxK+3l&Gf`Tcz%IK zAUL=QSrOf)25xy2c&r#-=Z4PBXp^Y%j=79RD$dlzPm3kM$l8iW*>U-yekFS!J~=zi ze1l0GR9}QP6z@^3#!xdzxzSJAXMCEIcDrYboJL;i3SgcNA$nrx{O9$ zqQ>X)LyrxDjr+@x)jIkJfXkN#mn+l~dw@{F(-XPpu>@(_QNBt@YZa&V+8jDxGw0HcQOH%P) z4Uk0?qR#q*UFX7Z-kOlc6npHe~zEtF+b`X9=LEVW8m0tX5>_2v%XK5N~&ZM_bdvS4|v{NSn#x^KGxp%A$|2N zhC5%vli^F%+(5Z0uRtYSFfQr$(B}KGcckc0<}TWiX|Mo&RTIer7+VQh$J-Ao$xA>D z%hze$JmX%nMJ5VP?CJ=fSXAZ!u3bhGGCWoQax{5tX;BHNUTn-c`jI0kTt^ESh?;oud4ASoqV`vl7$W{ z1EWW)lTMFSRKWHQV~Wl#gfum^B3PhuVUye50ky*$F-AJkU|B$UZFaSp&y56o>^F2O zAEr4S7Fn>Rz$rB>oox-6b^YPIS1mrps@o0(wOAeCv<7=`c`(#X2|ueZfPXZHm&Fv9 zm%FCi0rZA*8k{NfqPi?OvXy3B(b^%ei?%K1*^OR#SFL3)lFOR>Xt)txmqrmPkH*Hu z+zo}*mbRa8e1Uv1THUrzs^al5(XFr3 zc*IG*P@`0_aOzMaA<={za}ktk9bDh&FgR#?c+>(V&tPh6GP#9MltRfo2LMxb>&d>@ zpC9!<0j&i*O4^00S%TguStQ-OCz0L~jIq*1(S`yw#)5f#dD2dwc13c@h)Cjv=x_28 zKAUop*2BE2cbT)61|)n=;>2buby*C{PuwK`nAQEyY((;6pV+OxAnMWTH2# z!o`%13xn_F>Rthj!+=xS*2&~~ujpL<&CKNiDEOP6 zhk|{UGrbv_HI^<*ZvUq-e^o)02hy_j2(>#D>zOx(B|44}ryh5Y z(&LjBm%+q(XURIJDwH|jQgW{~_r+ExqM!*lYKYW##IvHO7nI%4fQ$!vW?)0lXpw2J z1lw)opPTHo9DxK1OovzBW#7$A@;tW0(9ty%J!hGx0zMKT89O_aNLSgMZ?iaZ8!Nu- ze5&|}U#h$?I|$5=a+lvI=>`avrS{Wh_+P5F?%cJ;3a@{RRdu{E-T}NzIghtI?<~KP zcnN>7ZpUjJ)!9nohT`05@oex#AnLp~2|q~(a0uy1_q1C>&8HO|;qmMUW`l>>WYg81QX-}qVJQw!FoT`Q|y@>E+i3;ZRm6E>1$lFAw# zfnFWf{~KngAU@-`wLH!6juu-ttMDxS=RSavDNH05R;EwV>EDtO%ePil4$wIi3$WNc&XUC^~S1$LMQ7!`)}1 z_L4YJ7w0D({Th2tCWA&T{)cJ5ue?X5oc2`(499mzSFq)ga~I85sMdMx9*$H4=Y!AU z0Z6QS!#0kekL#C^UuOouqJ`fs|6J6-)~^ghd33oQ&8(kF*PtbU153(jb63q3(DS_i z9aEG3!To#(d_&#gr(27^czJ4WIwxHTzE-8Jx$3y%xBS;3=-A4h${(ZER#qgSkZZ5R zP*C~fwd7bjUa2%CkK=9J+?f3ZJz#|zxWxBS^CNl34XfKTE^}UV#N{)xN#s+Lj$uAp z95E_vAZ`--Scte}MXB!zm&az2CyecR1+HVww&TuA3Xr32Zi-j>WIG z!1(q0zlx%!=Gbd`5_CV{Fc-cdn(^B(i(0`yj?N#$S>Y&|fy+JN`{5S69{ui3=lK0s zKWkyxvyzDBI}$k?H7MG+l&Vv8#uvQO8DT}KV_%I#+!Az8h}-!6t_5YvO=x@K{5o9q z2nfTX2Ts!lkv=O~)#90lLb=V~FY*(S^VibRhr~ogL_&RE`@%v)L#d3EUfg3~U?@+u zovq8EdzMT>L=@ZhYZ_%x?#A2q0yy%+L{SR(`Fnb3oDguaMV~m(1J574L7VE)uHA@IAA*|NYBu)4A;=bd0kAxTu@{=ilc4 zdmFLAAMXUApG~nqzHd%o}Jj}pz$P8`}A0FbciU$Gpax^2BM}45|FjE?_p!$lj`GVY= zo0|}b>MZPxNx}luGPZ5ZU3_m(XJ%FBgpDV7?68y0+x={;NFIN}+n0ZHHaSvHX!xQX_(jG4~R&Q07KI^}z$+C1&Ajt8X`t>+1X6>b)#P z7z~GQy6o=|5dA%o;qMU8kfq$B2d=B%0JcO@A-ox@Zo@yVI2_L&oGY{y0*C%N^IwDY zuQvWUqA}!y9#xY`@BI!k>{e3Ob3N~yo0zDh*;Z`HM_&8RxOf#`&;w-j_xAtYHi#@j znO>qtwxz7DeQWkUjT)=9|q8?YOWt%{c9Ns-`^w?h(Fe zvD<%QY~;;oTS(!Hhlzg&5OaE?m%E_9U%F)GpOL(mqP@Phl^yxi3`sjOR@r-S@G3&byi3qU8&Q?xEl6ODH@CcTuPEKt_>cG)cvt9O9r`bOc4la@AR!eyt zmP4GOE2>7ew}tHej&8o6=LSf%w403_OcNjwCN=d$kEv-z`Kn82+CD?Qzwcc7RiCH2 zu65*s0a`HBiVY>8J=oiMxS6NN!%|Q*H1kHDr1Z_|bw79FI;ZCvXRu8wSY7kJ*0hL5 zn!aIG(dPuywKZ%1@thau79uf?PB*>2vS4ZXy~rmyZ}pKd{I-?{q&ogfSW$sI>+ZJ; zHH4<-XH%{IjG7ncLf?3AO9CT`4@p$h0)sUzEWcNIB(LU-zb6(Dsjoz}hyEnh(ll`B z&~S1wO%8ec77=4X!d6r&+KgMo)>*#2gCtTOM9*+4`?tITCFOO~QrgIhzQK7@OaGDf zAf`mfOjA)s+tdzApW#emxlYL=(nO1G>lfPdmg0ZS1JYeTy|x39?RL@Quw$2n)+Yw_U~uDh3EJ+x2w0KKw?1!FMKM#}a3OTA_rLcyi)DOKf`<_`VF1W8vCKYuIDkLhW z!=4i8abO}FRIzM^|CbKBLK{gIH=(RE6#cicTOj15tF#Ay7= z41V2)mPg|;8!f7sU{rck>XM#2nXuSsS4Zs4kTw+p@3CJQBFnu|;)ld8f`0DtCT5_X zHH6N>CqoLqM3gaY;WpJv?&c=ZHNIe$M&ItF@W9o!G7n=}9=vyA4Hj*JAxR+J;f3H; z%HEQ?8SPq*g0l~mPwviA4wmUIWPGaB1Rs=-z8oV+#;s|HnIDp`c9_-L?va5ezDAW1 z!wBFT$zFR46642F)FO~WEmO%FYx?Eu9mCeLmw|rtxfBFKVPx;!50o2<vynCROS zNfe(Y+Z9ea>303IY4;@PO_>zgL(OiB3mPRMsj|}izt%Rr_IXhQyTB}^PRns(6)cyA zoj$7xK)frYHF{nOj*R(G*<7{Mu6~C61SGY37(=V43y%0Hniu7JM;(AY&y5=}mb@i#M z$*+tkHu!p>5b4I9{3#4q;p723Ihis86wl`H>$4N3Xg7kGfsqX9+@%Ud*9iP-PK3V z4jw1`2+NL;^p~W6{SBdEo3$C<{oN41j1+sbgfk|sz$2w4go`TG03?K6_nXTyF}^6y zdi=TGuR;}FB$dd?3}^j5m5BO;S53&B=UL!EuDk4Hbr(`5w4wp$eK3kWiEi4bx^)oGneKx`0@_(o~k88~CB368)yyW~j#*&N+|!u4X_mCnoYFvVKlLBA~gj1PWq3DV7HB5X9OgAb0F zy?K50$YO&*`+@SKR(>AmA$T@_0KcnyPRD?$b}E#Abh^Riody<4W=Ndg)h=0c&|~n5 z)dyW)33#S~(Wt`k=*G>Kbd^@i3fv5q&mU=MyqJHM2b z8C^MM=)`M3i@D||#?`9gQQ{?EdFJhnhCpM6zBIlEB(hAK7iUR*T%ucyu`{_Pyz%oB|e~g#+>A(q2JSg(?wAGH`m;> z7u(&4B6W6Yk>?mkp<1j5dJIem%^AXkkw;6Eo{4F2iOFGG#$hgUys2YXfumb_A8wud z+Efq9UAuSp7*qw#^8|2k`L1~(ZyHPPj*M(kQ5rv_PGel8YJWwBPyAIFd0-Ks2dqwb zsr~Yt>GMV&&OWsQA8}!5cii%2)#BivE9J3IvIjfW#izw#qucY82?P0GtrZsN36;537ulRkZw(b0_UYH)Gz_?K3Y0a4M z&yF*2ijZQfKtQe*EB`pX{`?icn=Zwi zVw9Nd@jY*e+!gElJ|U`nO?XoN5c@thOqu+Eq<>N?<2MltIn)@R*!K{J^Oc3i1lahQ zpbQ;p=Qe))?3l{?f(yb3GiWbY^Dws%)syGgFwUS(1IE|%n@*tFZPWnz8}ny5X2V3<|OYal_>^tVSgqvtA-al!Y!9O zg_TBh9ds+0Bs%Sk^9C?vjHBEy8CO{%j~${|)n&i58^P}rl8zAYMt z`_aQV$~GQMuR2Yie0TwW>o|aEi+Q(W9Mijoq+-0;TmZ4w~CsmEk)4axObj;H#`$dZMJW^NMEgy%R-b&1BQtNUpaJN3Lc)z>* zM(p>?btHzk(nd0zl{jo@W~L95*84Y0NrR-9mk3%6{L#)1nV_z>7)T(tke8dWRNZ{J zO-frV-h)*T(ZF7MmN~aW&gd9T8+vJhp!bA7Vem)@)^z z9k9t&Ym-)zTu)#aa(NJy$Kr21wx!w=+`m$&?0P5f&gZFTQOR67#euw=rCOAmc}}1% z=jAF#wbcnqWV&}SE2L@{!8KDf_y*(x>dwr46?0>^s7ZYuVc}j9B~ioL0pNEFhu^7u z)79B#XNZoK&-(T>*%Ey+-}uLdBUZy9)(TyCCh)MEGCxGW!_^od%fC>8wd?l`!fIVl1mK%3d8urA!-%`MRh)4g>1Nc*c%|1c$s4QdfeQnzJR z%adcZU^!9JK-0nD30y~WCzjmMEvinsb;}D@Tr~Yr8Ci?xQsAl}kf!}*vR9dhRJ*-) z?ou^;*|oYzb+=ac1U)B>c3tC=lM7BgQc`;sw!~&GoxL*pF4vX(mLdh_ep$^5%((|f zi(l2Wh|e7v^7kvJ^Hr&rjj~qA_(kwSt!1!g6IeP6hNT9`jqc9_i-=nc0dWN`dO@Nf zGpz5Vqj_RbP4dgU)(=C!PxR*w6_4+-k)3+04FA&Y`dHRFYf3LF%LLkBE_G8O5riQl zE*4l>+>fE!W%n(sf^GM&5I>9xx6U@%DT~BqhQ;u47)z!4c7ARosmsw|zA@5235`~Go(Z~#V9Ql0E+P3D*W3BY0C1<@#^83(` zm8&ac$7L`BRDaZbeco(^($LY-IrMBCheCrVXLk0qAid?*Q;isf{$4hMRQfpeT)ynK z@pvV8;6%KV&lMfpA(O3brtnVaF{M6b=S=WoRn2Rm{Z>z*wzeG<>Wxc8Nl7$tWd_@L zqn1$WhDt$(+IIQOZgA4qu8Pn|=4&j$WZQ|MF~0>7)@C$S@c$=$BZ*4w=wPkXGk zY_RL+@?%;(r_^mo1mH(ZD5vycWzTn-Gi-`{IX1+CN%u>?821kv`eYuy*IjP2!tJv1 z%~)znTJ4$)7P!(I_lU|zdb^zQ0ws&6X2r~(i-(Bf#=?O>&-EPjadrNNeXqu?N9gvE z-vjq78Jk};`Py4}+6;Ojnl6vDo31Z+C##D4&5TV=O=bL6?c7L*5t=-kz&2L{Dbq$6 z8XeY*hb4tJeT)@_O5-pP@M_b$WX}isO!aTzxxcLfI;_}q_v!s7wVxrBCg?U9N|6pq#|ChKzkV>y{ zwO(^evPmK;kH5YvUw3_j2T6U*({lQPt#1m_8~rOmFO&h)WW1jz$m#C zh9$)y^W(GE9M5qU?PaI}lgeZrK=mWW@>JlUw(SwtA8j9-;W?USDW;INL8LJ+R6%NG zh}o&6@#rzY{?T8bbctIQA4mIL1QLi}#7ydW*_`Vy)pLb^gzo;vFn_a+QYg3F&WFs` z>VAwjOSVYVe3E(C<(-%u+WlP#;pyci$H`A*WWPt9rCqma;$bQI{85=*kLAu4D7$9IWXv zV`c`U)i7F}6uomOT-^F&7A66W{nk`j-Q+cV{;G4=@A`a%gibM2EVAD$>)kVZKvjE_ zX}B%9!u2)UlVVp@@6k^$7N+opk``Nv$6%c9THyIQ38)qOj&uc4y zU7w%YFuX^s4RVtZ!K|)j=n4O4u%1nnBK!i4*L=0x;8gj!(xGVHD>iFqqUdaL{801t z3f(Y3hjr`8VwS-gqz+~BaOl1M+fxNa0(Tf%47=;Os-pv1kYt^7@?zcQbi;Q~D2-k&Q>d(}V?36>O zSF|a2DvQ<~I@j{AEx6#YdDr;*^eroWf);XIEs#T(q5)wi&9J`RW3yR*7)+804wmyCWHcx@4JJP^X=t(cei$riatmw| z>^{+wL~E3H>*x#j%%>8^>(gg*OLeQ_UB8?2s1aZT&1Bo^R9vycdfrgCj{&%w+x8JQ zAFEaSwmP$xb?7TVi{!B*Jc*EhbqSJ1-(~107>ztH_OV;X*AY!U5))6+(CwI{~Y!rj4$9#6l1L zAAq8h?DKyEMLWe6%N>DxS+H`)J{Dhq2f#4yJab^KEz^`PH#_}oq?o((A1%OvUPv!D zHW%%VbU;%c_4-@WPU&=05G~RB`#dz7w6$f7cOPvRlk#NAJk^_F=hbtyi4W=SgqS)C zVi-TfmX6b5la7jg_}Q9V(wH;u#kj@jOSsymttD7Boq4^uplB7vLBmp^KF}>&Xk4~E zrRBg`zHL(^=7(y}(xNIzm^|6l_2mzN537QLUxM4-+PYqcXpI9Dc>tI9+5EK)qun)1 zA7J|!9b=f2yE$XaxRiBP6ys<=-7_@m*m;0vgpB{le$dY7iE)5ENa%HqPdoI7x4d*f z-KO1Xw?=VvdY2#h_UmPTahws8{?aI~8#N7zF*OBPbLvyr7w&D{DAYYJ+NWzuoUuJg z@DPE?t`}yfUpH7Ogx*n%5p#W4D4Qluh*fX4qK_*$K%WTGx{d!zi9)7P@1 zXQWlTkd?ezjPk)*JlAiyIu^BFSbGTo)uvr&1R+}*><58kh<>*ETFQ)cRr0o3! z`6AP3GZk4!(=ZqxSF6kO_G0NZd!n9tP3;G7mVrl3rwJ#{FeWvq)z>Es=ZQl$EU|6m zMjgYd4od*HV+5h3rSA-{m<6ISAo9e>=WtWv)YQ`BcjDlAl{8>V?fh5PN;C_fKmNO&?ZcHS3CymyFU==~>0G zoagNAzu19g_t&8g$YwT)<#D59#zA%$Hz_>QCf#9X2U4{GQdgp?-uF_@DL%4gPEM|U z%oS9dj61M%xtl98)1xEyWzwuo&C`Q+9~7YIa5eIjUAL}1N1klWiYLCpN`J)RiWtlu zX&+}r?x9_^I^IhZd--OqScgk5lF6}?kmUqpi?T_;J0{7Ljx;0)DyUxzKs_GM$PLY% z%oZ}95T_X-vx`oT!GyioNcZ2ijN$C?PQ3uF)eyrzpxoe91h?ZWGnlbZILAAJCyP|{ zV23E0Oja*wJ~d_UpFxA8Qh@1r)oNO}tF-c_XUVg^pra3s0c|(`!GM%p({B=7HOFBp zO4?SaUe)K5P4QD|IJ5YWqQ|*f`@cxLw7MWI^CE+EZ6xuCrb00#4>PAWT(JN+T=ai% z6#z}>${8nAp!q&eSd1~UP`hJmi#1m%lb?M_zpf`?(|$*i_EGJmb6U8-G)119N0nn# z>BNMZ?R-;_c6@j7b8(q*r>2eFYQBqmp)yB;CAxxc+nVDe5<2mL4>#o8@$E&V^8KtE zBiwQecV&|Bm(r;is{(`kL{8CbuTwkI%c*(?Gp6J~87D`Lnl=JEdepq>pNN~I&>A)EX!Rivl{z9es|E5Zd$~VO&xBRA)ra%Mv9rhBo-oLZ zhX$ZzeOAk)6D5%qI(k`D09J^N#P=Ia8-L3!FmwKKw9#MG^=Q-3)@Ga9d4V@X1#X|Q zwJ@;setcD$6rE0cPdl4p0%o0UXze)RmA@rF>V5S*%^4!0#6g|uJ5afgQ7eMuT&b?F zSA}ky2uJ1+ix40eYsi%d2=}M@z3xUDnY#|U!Y16J4)-@B^cygo?KifB4igzbxapZo zy(h1W4fQA|Rg689svOZ-0~)Z&K!d=$q1{&gAfbnw{@$A0=DVF;G5ZFqlJ^Fqm|s>7 z^Ems>G@4|L#RFD!vojisw!0pG=6&O6fz7bw;tV#eO27t+`MQ5e6{8K?=T<((WXeY z6;4H6Z9ALqHA{w~QzsI7>D-?d+HDJ@9#W#ob^JV@iz(Z8nR;cNqi#{kuYao^W4GhI zKA{?wp>n$+($0IRnY5q1H{BJ?oCM>_F4DHWV%n zQjUpRu%3ma*1OU=v%_%eiw{N^BHV_6n6<#zVvL`*17M)oqrs|P1qqGH2@uVRack`{ zT84P6#TV2i6mgWxnrh7(re(F5b_GD-q#na-5dh>JEe5i&2WNCER8;v_b5q;sT-Fd5u{c2 z#_N!;m)#u3UrbUhjrRJqn+FWiZy$z9KefP8Zjnp5cc zc>CV_``Bg5R6s?yPKV)d!>r@HKhrVpccw7+V(F5V;(m9%oD~Xx4LkCjRx2uo3wOg= ztuXhA(V4pPXwg7iC51Q$kdW&8>KS$5!~^f6#@Hh=YH*HJP5IWZE!3xFRlkHXdvxw5 z368zL8qYHUayor>1@wFVbWE8hf#^L3uGSr@3fu)JU~P2;C82QN0mPu}3CRNGFV`~U(5f66C%=OJ=Z2HXpaBggCcXr*2DEqnINMM;@u2+ zyRplkIr7PX)!@GEPDeANWi%z>^l>n=TQiq+nVwsL^MfnMV6_n;8WEIkCUnEYp9j~S zneVCA`VNUL1md3XyFgVf>~u}ltx{EWSx7i(>2+M*a!>tW&8I$2ZMSI?I5h}!0*uKdY}f}&s;88+2fY9+W!YLN0F;Hn>aiTykU zS_}gSue+SKeH7TACz|1hrz3+j(INjK!LBxuTQqmdII;ZVyuVEcW**0YUcRWB#2R7+ zTwQF|Q4c(NDopfFMMVV=#(B=p&SD3|)w<|=@854e8!x$a(nfn_P&)v;`KPYs#SSuk zMq-P-iIpSUv}8HNEiWK_ijMATLc($xJ~*2JU2@5Dk|reC`3AR3MLK%&r;SV!Dx}-w z_v&ZsUIxuRnf){RMC_Mi;VdSJ6f_;NQ>EL%2W@2!Zd;CFe&Ur-55-+5?V{JJ%01={w>iK1tJG;Xe1=PRjSI^c9Mbl&|bu&ce9j>O-%N@}s^@*7$IaJ1w-87q+vIchYM3>^ z8}QbIuu}nZ^Hj9r3ZUGdyKi-p`EoX%-X2M&;>qH|CKAaGbnp7H0=mm6U?UxqC2;+-Y2iVPcK6oEg7JiVy^F)KLpBR>XTFYH66Mp2DsB@5q6$5G!dI+{)pB;$9{WSM`R zd!0bLXPUFYs}Xj`TdW)$KuEt<34y$L5HggZ&vV?zGq^X|eD&zlzlSLIR8Z8X6t&$r)jHiL0v~>CZ>#p@R9Ul1vlsg^w=7~B0&Li z#L2kyU?GRLM-1_DK%(+}rlsZh=(h21G^aJ?WO_{aJo~}BdMfDIhwxO@`VrM5__%v2 z|DdQYeoqjbKN6j{Su1l_(zWA2CR zoR1jQs~~H6$0|Hd0sK8lDyXeTGuqApY^H4yiej4pD_hZWa3pSwbRy2GZp)846ziYI z-TxG&k_Hm^0889giadTJEa-A|=M@MAL9rs?WSY*22{@cS@h1$Gqfr$lArOqEX^4Io zWa6sVcyzc0c7^i?wWcnKZ^1nYheH9@uEzV6`}%74I%;yWV-uxTSOI}_u0nxI~wqG4o7Z%HqeT^pDGp@6}L!gA*Ff*3F1}p`T{)@e*G7tb(UMqkN&paW2*s zZ%NA_WbqAh7&wnz69Ucrl}hH@E%tNfd7Q)KUyT!UhwIo{`m5v$*Tif8C@E?Bnu8Ea zB(<^=r8d8KoJLzKrKHUzQF~`q?n9TRbni5Tml}B%naYa#0I7Bb**Y4FDtcMKc=xT` zKGN2H;&J;tnCmr_23L#Tgv6ET^1b!Gz-N|WcliFW`rv3=;^0|y6*HPF-sZ5o1_~x< zMBRUv8Fy{yT?2lcvKe5G<&{1O`ke9dr$$PC{|x}x)4etV)V&8pFg{>;lO9wT;S&*o zu8-zMVi6+9_Ijd3SdVOXiY&9#cBg;ZIoax+rXArlD(Gsitd1O2c_A#>EAr(nlH=3% zGx0!X4(y7k$Dk1HsvLg^I}iYz7>R>}qZ|%<1>F>*?7x@vYc&68*?;6U56DmpZ42nXlj1X$@#33tGHj0d8sgH_9*rV^z=Y( zM`wOUdtBonW?4~&gG{iKL7qzOQiYV% z-~u}$EpT%={Ezh z!OVGUq^UW9jZM`CzZ5NHZ;r9gGoN)P^-i*NS_`B!mxN9Vlka7UG6r=T@HL6ad~26w z5b04BWg)P#%cX{j`c9v%?baAEGQzhQb$VyNXB`K`wxJ_kzA0#(-ZP3VC2WmYpu`XR@`=ud1&=4*@~Dm{g@(qr z#%n6D-hjiZa4GNGi!;1w7Eez2nuuFQYUaGb#i*5OPqON)?UJav+Ri)5(f#ll&gk9u zJNP)cXX}QslsQMbf$>jt>W0j={4RtAWCr|IVUH74(b~)UEc0KPc`O2&!qr6|qGr21zYdUSUQDw4p zR(}R;zHFig9fvhS-vrdLMR&Yl@_K1%uI%^N-DTnS3iClnbIZq`WQ!}%O19OSHqC+L z$d67L*~t^n{*Jr^e%aQ406c?$$iLO{?>1 z&$Z3WrKK_6SD<G*cZV2j68>h`d0pN|WmDb6eKApwICQqGJO~39oG-97Dr% zvWQWM>slvPJz8clpRn&Q-r8=iuZ~qcry0^ypN%k_-dsssz-Jbk42~7G?fGHt!Foaa z`K6SJUnL4Py1xphv|UwJVt2!whMpHp+h+uc)IR;vs1Qyt(Yy_&A@7+P5H^`!+uU6k z-4`4+8^W_4aXeWPAHGn0mc z`ZKb>p39o%JR(idNbPp=M-j6T)M2urA|^oD^tIlYdN9g0s*0km4QFyGho9qyIXDvo z|I9rp&q_B&O%%C%m(2Ue58%Cmn$5m3RUm10|C~Ce4WW8{6Uz#K8oVKa9J{<
YG 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 V^UDu?f!!l+$-P#TDwZ?|_&@$$>E!?b From 5e7990640375a2c394568a51c3f6aac8c024f6ed Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 19 Jun 2018 15:59:44 +0200 Subject: [PATCH 0035/1162] Docs: Add option 'disable conf.d' to windows wizard docs --- doc/06-distributed-monitoring.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index fe3e04c51..985e23fd9 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -718,6 +718,7 @@ Optionally enable the following settings: Accept commands | **Optional.** Whether this node accepts command execution messages from the master node (required for [command endpoint mode](06-distributed-monitoring.md#distributed-monitoring-top-down-command-endpoint)). For [security reasons](06-distributed-monitoring.md#distributed-monitoring-security) this is disabled by default. Run Icinga 2 service as this user | **Optional.** Specify a different Windows user. This defaults to `NT AUTHORITY\Network Service` and is required for more privileged service checks. Install NSClient++ | **Optional.** The Windows installer bundles the NSClient++ installer for additional [plugin checks](06-distributed-monitoring.md#distributed-monitoring-windows-nscp). + Disable conf.d | **Optional.** Allows to disable the `include_recursive "conf.d"` directive except for the `api-users.conf` file in the `icinga2.conf` file. Defaults to `true`. ![Icinga 2 Windows Setup](images/distributed-monitoring/icinga2_windows_setup_wizard_03.png) From 50e335f79674549d79da59fd17b7dd54950cf586 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 19 Jun 2018 16:21:59 +0200 Subject: [PATCH 0036/1162] Docs: Fix icinga.com link --- doc/01-about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/01-about.md b/doc/01-about.md index 7669ec81e..6397100fe 100644 --- a/doc/01-about.md +++ b/doc/01-about.md @@ -17,7 +17,7 @@ LICENSE file included in the source package. ## Support -Check the project website at https://www.icinga.com for status updates. Join the +Check the project website at [icinga.com](https://www.icinga.com) for status updates. Join the [community channels](https://www.icinga.com/community/get-involved/) for questions or ask an Icinga partner for [professional support](https://www.icinga.com/services/support/). From 02d1f1cc579d9d2f395ba3e10309d17a636b797a Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 20 Jun 2018 09:59:18 +0200 Subject: [PATCH 0037/1162] Stream#ReadLine(): fix false positive buffer underflow indicator refs #6354 --- lib/base/stream.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index 3048f096c..a7ac2067c 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -143,7 +143,16 @@ StreamReadStatus Stream::ReadLine(String *line, StreamReadContext& context, bool } } - context.MustRead = (count <= 1); + switch (count) { + case 0: + context.MustRead = true; + break; + case 1: + context.MustRead = first_newline == (context.Size - 1u); + break; + default: + context.MustRead = false; + } if (count > 0) { *line = String(context.Buffer, &(context.Buffer[first_newline])); From 3c7851107c254e80c65cd4f2b42c20b61dfa5146 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 20 Jun 2018 16:55:33 +0200 Subject: [PATCH 0038/1162] TlsStream#IsEof(): fix false positive EOF indicator refs #6242 --- lib/base/tlsstream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index a05a3d7d5..38a9b72dc 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -393,7 +393,7 @@ void TlsStream::CloseInternal(bool inDestructor) bool TlsStream::IsEof() const { - return m_Eof; + return m_Eof && m_RecvQ->GetAvailableBytes() < 1u; } bool TlsStream::SupportsWaiting() const From 1c213877a4554bbe3632eada2a6fd4a99f8b90de Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 20 Jun 2018 17:28:52 +0200 Subject: [PATCH 0039/1162] Stream#ReadLine(): simplify algorithm refs #6354 --- lib/base/stream.cpp | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index a7ac2067c..0b847060f 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -129,40 +129,19 @@ StreamReadStatus Stream::ReadLine(String *line, StreamReadContext& context, bool } } - int count = 0; - size_t first_newline; - for (size_t i = 0; i < context.Size; i++) { if (context.Buffer[i] == '\n') { - count++; + *line = String(context.Buffer, context.Buffer + i); + boost::algorithm::trim_right(*line); - if (count == 1) - first_newline = i; - else if (count > 1) - break; + context.DropData(i + 1u); + + context.MustRead = !context.Size; + return StatusNewItem; } } - switch (count) { - case 0: - context.MustRead = true; - break; - case 1: - context.MustRead = first_newline == (context.Size - 1u); - break; - default: - context.MustRead = false; - } - - if (count > 0) { - *line = String(context.Buffer, &(context.Buffer[first_newline])); - boost::algorithm::trim_right(*line); - - context.DropData(first_newline + 1); - - return StatusNewItem; - } - + context.MustRead = true; return StatusNeedData; } From b3970d4b741acef76ec0fa5a10262fcd12864edb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Jun 2018 09:03:04 +0200 Subject: [PATCH 0040/1162] Add headers to debug output --- plugins/check_nscp_api.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/check_nscp_api.cpp b/plugins/check_nscp_api.cpp index 333b217ab..b0871713d 100644 --- a/plugins/check_nscp_api.cpp +++ b/plugins/check_nscp_api.cpp @@ -93,8 +93,10 @@ static Dictionary::Ptr QueryEndpoint(const String& host, const String& port, con req->RequestUrl->SetArrayFormatUseBrackets(false); req->AddHeader("password", password); - if (l_Debug) - std::cout << "Sending request to 'https://" << host << ":" << port << req->RequestUrl->Format(false, false) << "'\n"; + if (l_Debug) { + std::cout << "Sending request to 'https://" << host << ":" << port << req->RequestUrl->Format(false, false) << "'\n" + << "Headers: " << JsonEncode(req->Headers) << "\n"; + } // Submits the request. The 'ResultHttpCompletionCallback' is called once the HttpRequest receives an answer, // which then sets 'ready' to true @@ -223,7 +225,7 @@ static int FormatOutput(const Dictionary::Ptr& result) state == "UNKNOWN" ? 3 : 4; if (creturn == 4) { - std::cout << "check_nscp UNKNOWN Answer format error: 'result' was not a known state.\n"; + std::cout << "check_nscp_api UNKNOWN Answer format error: 'result' was not a known state.\n"; return 3; } From d9a55ac064ba15d2250cbbfb6d20f57595f554f1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Jun 2018 12:46:10 +0200 Subject: [PATCH 0041/1162] Add console logger for nscp_api debug mode --- plugins/check_nscp_api.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/check_nscp_api.cpp b/plugins/check_nscp_api.cpp index b0871713d..1fd12209e 100644 --- a/plugins/check_nscp_api.cpp +++ b/plugins/check_nscp_api.cpp @@ -25,6 +25,7 @@ #include "base/application.hpp" #include "base/json.hpp" #include "base/string.hpp" +#include "base/logger.hpp" #include "base/exception.hpp" #include #include @@ -284,6 +285,12 @@ int main(int argc, char **argv) l_Debug = vm.count("debug") > 0; + // Initialize logger + if (l_Debug) + Logger::SetConsoleLogSeverity(LogDebug); + else + Logger::SetConsoleLogSeverity(LogWarning); + // Create the URL string and escape certain characters since Url() follows RFC 3986 String endpoint = "/query/" + vm["query"].as(); if (!vm.count("arguments")) From 9ea0650edc1a25ea974ffa8c1183386c6b15e405 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 21 Jun 2018 15:41:40 +0200 Subject: [PATCH 0042/1162] Fix connection error handling in Elasticsearch and InfluxDB features Previously this would just throw the entire exception stack trace which is not needed here. fixes #6394 --- lib/perfdata/elasticsearchwriter.cpp | 14 +++++++++++++- lib/perfdata/influxdbwriter.cpp | 10 +++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 2e8ffa515..d9d56b004 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -428,7 +428,19 @@ void ElasticsearchWriter::SendRequest(const String& body) url->SetPath(path); - Stream::Ptr stream = Connect(); + Stream::Ptr stream; + + try { + stream = Connect(); + } catch (const std::exception& ex) { + Log(LogWarning, "ElasticsearchWriter") + << "Flush failed, cannot connect to Elasticsearch."; + return; + } + + if (!stream) + return; + HttpRequest req(stream); /* Specify required headers by Elasticsearch. */ diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 8a3fe97b1..89cf13220 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -419,7 +419,15 @@ void InfluxdbWriter::Flush() String body = boost::algorithm::join(m_DataBuffer, "\n"); m_DataBuffer.clear(); - Stream::Ptr stream = Connect(); + Stream::Ptr stream; + + try { + stream = Connect(); + } catch (const std::exception& ex) { + Log(LogWarning, "InfluxDbWriter") + << "Flush failed, cannot connect to InfluxDB."; + return; + } if (!stream) return; From 257ad12646d578e21108152427efd5b3376ff0e2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Jun 2018 20:27:52 +0200 Subject: [PATCH 0043/1162] Use SSL_pending() for remaining TLS stream data We've used this previously, and according to the OpenSSL docs we should just use it. From our experience everything done different to the API functions from OpenSSL causes undefined behaviour in the worst case. This commit also breaks the packet size limit into a more readable version, including logs for development debug builds. refs #6242 --- lib/base/tlsstream.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index 38a9b72dc..33d72d465 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -186,7 +186,26 @@ void TlsStream::OnEvent(int revents) readTotal += rc; } - } while (rc > 0 && readTotal < 64 * 1024); + +#ifdef I2_DEBUG /* I2_DEBUG */ + Log(LogDebug, "TlsStream") + << "Read bytes: " << rc << " Total read bytes: " << readTotal; +#endif /* I2_DEBUG */ + /* Limit read size. We cannot do this check inside the while loop + * since below should solely check whether OpenSSL has more data + * or not. */ + if (readTotal >= 64 * 1024) { +#ifdef I2_DEBUG /* I2_DEBUG */ + Log(LogWarning, "TlsStream") + << "Maximum read bytes exceeded: " << readTotal; +#endif /* I2_DEBUG */ + break; + } + + /* Use OpenSSL's state machine here to determine whether we need + * to read more data. SSL_has_pending() is available with 1.1.0. + */ + } while (SSL_pending(m_SSL.get())); if (success) m_CV.notify_all(); From 0ffb8af8e38fa71f19dbebcebbbfc37937d1bf90 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 21 Jun 2018 16:53:44 +0200 Subject: [PATCH 0044/1162] Conform to RFC for CRLF in HTTP requests refs #6242 --- lib/remote/httprequest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/remote/httprequest.cpp b/lib/remote/httprequest.cpp index 8f6c11e31..4ba9aad69 100644 --- a/lib/remote/httprequest.cpp +++ b/lib/remote/httprequest.cpp @@ -194,7 +194,7 @@ void HttpRequest::AddHeader(const String& key, const String& value) void HttpRequest::FinishHeaders() { if (m_State == HttpRequestStart) { - String rqline = RequestMethod + " " + RequestUrl->Format(true) + " HTTP/1." + (ProtocolVersion == HttpVersion10 ? "0" : "1") + "\n"; + String rqline = RequestMethod + " " + RequestUrl->Format(true) + " HTTP/1." + (ProtocolVersion == HttpVersion10 ? "0" : "1") + "\r\n"; m_Stream->Write(rqline.CStr(), rqline.GetLength()); m_State = HttpRequestHeaders; } @@ -211,11 +211,11 @@ void HttpRequest::FinishHeaders() ObjectLock olock(Headers); for (const Dictionary::Pair& kv : Headers) { - String header = kv.first + ": " + kv.second + "\n"; + String header = kv.first + ": " + kv.second + "\r\n"; m_Stream->Write(header.CStr(), header.GetLength()); } - m_Stream->Write("\n", 1); + m_Stream->Write("\r\n", 2); m_State = HttpRequestBody; } From 79878ea2868ce9f173040c02394f11ebb3cf5cb5 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Jun 2018 10:33:31 +0200 Subject: [PATCH 0045/1162] TcpSocket#Bind(): reuse socket addresses on Windows, too refs #6378 --- lib/base/tcpsocket.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index a25d52d77..0af189f8b 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -89,10 +89,8 @@ void TcpSocket::Bind(const String& node, const String& service, int family) const int optFalse = 0; setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&optFalse), sizeof(optFalse)); -#ifndef _WIN32 const int optTrue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&optTrue), sizeof(optTrue)); -#endif /* _WIN32 */ int rc = bind(fd, info->ai_addr, info->ai_addrlen); From a1c2eb3d8764718c30d36a3a59cb86b46116c3c5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 22 Jun 2018 11:12:09 +0200 Subject: [PATCH 0046/1162] Ensure to _unlink before renaming replay log on Windows --- lib/remote/apilistener.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c1546710d..fda3d9a94 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1046,6 +1046,13 @@ void ApiListener::RotateLogFile() String oldpath = GetApiDir() + "log/current"; String newpath = GetApiDir() + "log/" + Convert::ToString(static_cast(ts)+1); + + +#ifdef _WIN32 + _unlink(newpath.CStr()); +#endif /* _WIN32 */ + + (void) rename(oldpath.CStr(), newpath.CStr()); } From 071617da9fed4b457bf7defbacdd74e5725123c0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 22 Jun 2018 11:12:57 +0200 Subject: [PATCH 0047/1162] Conform to the Plugin API spec for performance label quoting Single quotes are allowed, double quotes are not. --- plugins/check_disk.cpp | 2 +- plugins/check_load.cpp | 2 +- plugins/check_memory.cpp | 2 +- plugins/check_network.cpp | 4 ++-- plugins/check_perfmon.cpp | 17 +++++++++-------- plugins/check_service.cpp | 8 ++++---- plugins/check_swap.cpp | 6 +++--- plugins/check_update.cpp | 2 +- plugins/check_uptime.cpp | 6 +++--- plugins/check_users.cpp | 6 +++--- 10 files changed, 28 insertions(+), 27 deletions(-) diff --git a/plugins/check_disk.cpp b/plugins/check_disk.cpp index b0e898f54..c6bd9cdd3 100644 --- a/plugins/check_disk.cpp +++ b/plugins/check_disk.cpp @@ -382,7 +382,7 @@ static int printOutput(printInfoStruct& printInfo, std::vector& vDrives) wsDrives.push_back(it->name + L" " + removeZero(it->free) + L" " + unit + L" (" + removeZero(std::round(it->free / it->cap * 100.0)) + L"%); "); - wsPerf.push_back(L" " + it->name + L"=" + removeZero(it->free) + unit + L";" + + wsPerf.push_back(L" '" + it->name + L"'=" + removeZero(it->free) + unit + L";" + printInfo.warn.pString(it->cap) + L";" + printInfo.crit.pString(it->cap) + L";0;" + removeZero(it->cap)); diff --git a/plugins/check_load.cpp b/plugins/check_load.cpp index 81f2ecfdf..44a99a456 100644 --- a/plugins/check_load.cpp +++ b/plugins/check_load.cpp @@ -171,7 +171,7 @@ static int printOutput(printInfoStruct& printInfo) break; } - std::wcout << " " << printInfo.load << L"% | load=" << printInfo.load << L"%;" + std::wcout << " " << printInfo.load << L"% | 'load'=" << printInfo.load << L"%;" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;100" << '\n'; diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index 46c65649e..8c274c1fe 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -187,7 +187,7 @@ static int printOutput(printInfoStruct& printInfo) else std::wcout << " - " << 100 - printInfo.percentFree << L"% used"; - std::wcout << "| memory=" << currentValue << BunitStr(printInfo.unit) << L";" + std::wcout << "| 'memory'=" << currentValue << BunitStr(printInfo.unit) << L";" << printInfo.warn.pString(printInfo.tRam) << L";" << printInfo.crit.pString(printInfo.tRam) << L";0;" << printInfo.tRam; diff --git a/plugins/check_network.cpp b/plugins/check_network.cpp index e17d7b503..e0c464139 100644 --- a/plugins/check_network.cpp +++ b/plugins/check_network.cpp @@ -190,7 +190,7 @@ static int printOutput(printInfoStruct& printInfo, const std::vector continue; } else { boost::algorithm::replace_all(wsFriendlyName, "'", "''"); - tss << L"\'" << wsFriendlyName << L"_in\'=" << it->BytesInSec << L"B \'" << wsFriendlyName << L"_out\'=" << it->BytesOutSec << L"B "; + tss << L"'" << wsFriendlyName << L"_in'=" << it->BytesInSec << L"B '" << wsFriendlyName << L"_out'=" << it->BytesOutSec << L"B "; } } @@ -214,7 +214,7 @@ static int printOutput(printInfoStruct& printInfo, const std::vector } std::wcout << " " << tIn + tOut << L"B/s | " - << L"network=" << tIn + tOut << L"B;" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";" << L"0; " + << L"'network'=" << tIn + tOut << L"B;" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";" << L"0; " << tss.str() << '\n'; return state; diff --git a/plugins/check_perfmon.cpp b/plugins/check_perfmon.cpp index 7e415f1cd..ad3c8bcc5 100644 --- a/plugins/check_perfmon.cpp +++ b/plugins/check_perfmon.cpp @@ -352,26 +352,27 @@ static int printOutput(const po::variables_map& vm, printInfoStruct& pi) std::wstringstream wssPerfData; if (vm.count("perf-syntax")) - wssPerfData << "\"" << vm["perf-syntax"].as() << "\"="; + wssPerfData << "'" << vm["perf-syntax"].as() << "'="; else - wssPerfData << "\"" << pi.wsFullPath << "\"="; + wssPerfData << "'" << pi.wsFullPath << "'="; wssPerfData << pi.dValue << ';' << pi.tWarn.pString() << ';' << pi.tCrit.pString() << ";;"; if (pi.tCrit.rend(pi.dValue)) { - std::wcout << "PERFMON CRITICAL \"" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) - << "\" = " << pi.dValue << " | " << wssPerfData.str() << '\n'; + std::wcout << "PERFMON CRITICAL for '" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) + << "' = " << pi.dValue << " | " << wssPerfData.str() << "\n"; return 2; } if (pi.tWarn.rend(pi.dValue)) { - std::wcout << "PERFMON WARNING \"" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) - << "\" = " << pi.dValue << " | " << wssPerfData.str() << '\n'; + std::wcout << "PERFMON WARNING for '" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) + << "' = " << pi.dValue << " | " << wssPerfData.str() << "\n"; return 1; } - std::wcout << "PERFMON OK \"" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) - << "\" = " << pi.dValue << " | " << wssPerfData.str() << '\n'; + std::wcout << "PERFMON OK for '" << (vm.count("perf-syntax") ? vm["perf-syntax"].as() : pi.wsFullPath) + << "' = " << pi.dValue << " | " << wssPerfData.str() << "\n"; + return 0; } diff --git a/plugins/check_service.cpp b/plugins/check_service.cpp index e6e12d74e..93e0a58a2 100644 --- a/plugins/check_service.cpp +++ b/plugins/check_service.cpp @@ -124,7 +124,7 @@ static int printOutput(const printInfoStruct& printInfo) state state = OK; if (!printInfo.ServiceState) { - std::wcout << L"SERVICE CRITICAL NOTFOUND | service=" << printInfo.ServiceState << ";;;1;7" << '\n'; + std::wcout << L"SERVICE CRITICAL NOT FOUND | 'service'=" << printInfo.ServiceState << ";;;1;7" << '\n'; return 3; } @@ -133,13 +133,13 @@ static int printOutput(const printInfoStruct& printInfo) switch (state) { case OK: - std::wcout << L"SERVICE \"" << printInfo.service << "\" OK RUNNING | service=4;;;1;7" << '\n'; + std::wcout << L"SERVICE \"" << printInfo.service << "\" OK RUNNING | 'service'=4;;;1;7" << '\n'; break; case WARNING: - std::wcout << L"SERVICE \"" << printInfo.service << "\" WARNING NOT RUNNING | service=" << printInfo.ServiceState << ";;;1;7" << '\n'; + std::wcout << L"SERVICE \"" << printInfo.service << "\" WARNING NOT RUNNING | 'service'=" << printInfo.ServiceState << ";;;1;7" << '\n'; break; case CRITICAL: - std::wcout << L"SERVICE \"" << printInfo.service << "\" CRITICAL NOT RUNNING | service=" << printInfo.ServiceState << ";;;1;7" << '\n'; + std::wcout << L"SERVICE \"" << printInfo.service << "\" CRITICAL NOT RUNNING | 'service'=" << printInfo.ServiceState << ";;;1;7" << '\n'; break; } diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index d405a094f..b06a38c7b 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -166,17 +166,17 @@ static int printOutput(printInfoStruct& printInfo) switch (state) { case OK: - std::wcout << L"SWAP OK - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" + std::wcout << L"SWAP OK - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) << L";0;" << printInfo.tSwap << '\n'; break; case WARNING: - std::wcout << L"SWAP WARNING - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" + std::wcout << L"SWAP WARNING - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) << L";0;" << printInfo.tSwap << '\n'; break; case CRITICAL: - std::wcout << L"SWAP CRITICAL - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" + std::wcout << L"SWAP CRITICAL - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) << L";0;" << printInfo.tSwap << '\n'; break; diff --git a/plugins/check_update.cpp b/plugins/check_update.cpp index 31d98e44b..3543400c0 100644 --- a/plugins/check_update.cpp +++ b/plugins/check_update.cpp @@ -149,7 +149,7 @@ static int printOutput(const printInfoStruct& printInfo) break; } - std::wcout << output << printInfo.numUpdates << L" | update=" << printInfo.numUpdates << L";" + std::wcout << output << printInfo.numUpdates << L" | 'update'=" << printInfo.numUpdates << L";" << printInfo.warn << L";" << printInfo.crit << L";0;" << '\n'; return state; diff --git a/plugins/check_uptime.cpp b/plugins/check_uptime.cpp index 038625ade..27a656ef2 100644 --- a/plugins/check_uptime.cpp +++ b/plugins/check_uptime.cpp @@ -166,17 +166,17 @@ static int printOutput(printInfoStruct& printInfo) switch (state) { case OK: - std::wcout << L"UPTIME OK " << printInfo.time << TunitStr(printInfo.unit) << L" | uptime=" << printInfo.time + std::wcout << L"UPTIME OK " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; case WARNING: - std::wcout << L"UPTIME WARNING " << printInfo.time << TunitStr(printInfo.unit) << L" | uptime=" << printInfo.time + std::wcout << L"UPTIME WARNING " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; case CRITICAL: - std::wcout << L"UPTIME CRITICAL " << printInfo.time << TunitStr(printInfo.unit) << L" | uptime=" << printInfo.time + std::wcout << L"UPTIME CRITICAL " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; diff --git a/plugins/check_users.cpp b/plugins/check_users.cpp index 993a40027..83ab5d05d 100644 --- a/plugins/check_users.cpp +++ b/plugins/check_users.cpp @@ -151,15 +151,15 @@ static int printOutput(printInfoStruct& printInfo) switch (state) { case OK: - std::wcout << L"USERS OK " << printInfo.users << L" User(s) logged in | users=" << printInfo.users << L";" + std::wcout << L"USERS OK " << printInfo.users << L" User(s) logged in | 'users'=" << printInfo.users << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; case WARNING: - std::wcout << L"USERS WARNING " << printInfo.users << L" User(s) logged in | users=" << printInfo.users << L";" + std::wcout << L"USERS WARNING " << printInfo.users << L" User(s) logged in | 'users'=" << printInfo.users << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; case CRITICAL: - std::wcout << L"USERS CRITICAL " << printInfo.users << L" User(s) logged in | users=" << printInfo.users << L";" + std::wcout << L"USERS CRITICAL " << printInfo.users << L" User(s) logged in | 'users'=" << printInfo.users << L";" << printInfo.warn.pString() << L";" << printInfo.crit.pString() << L";0;" << '\n'; break; } From 02645c59ffefe44494a8724c9571a963b77e426c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Jun 2018 14:13:09 +0200 Subject: [PATCH 0048/1162] ObjectLock#Unlock(): don't reset m_Object->m_LockOwner too early --- lib/base/object.hpp | 2 ++ lib/base/objectlock.cpp | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/base/object.hpp b/lib/base/object.hpp index a29e4f73b..7836d2644 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -23,6 +23,7 @@ #include "base/i2-base.hpp" #include "base/debug.hpp" #include +#include #include using boost::intrusive_ptr; @@ -212,6 +213,7 @@ private: # else /* _WIN32 */ mutable DWORD m_LockOwner; # endif /* _WIN32 */ + mutable size_t m_LockCount = 0; #endif /* I2_DEBUG */ friend struct ObjectLock; diff --git a/lib/base/objectlock.cpp b/lib/base/objectlock.cpp index 2abb43fba..c3d3f0522 100644 --- a/lib/base/objectlock.cpp +++ b/lib/base/objectlock.cpp @@ -90,11 +90,13 @@ void ObjectLock::Lock() m_Locked = true; #ifdef I2_DEBUG + if (++m_Object->m_LockCount == 1u) { # ifdef _WIN32 - InterlockedExchange(&m_Object->m_LockOwner, GetCurrentThreadId()); + InterlockedExchange(&m_Object->m_LockOwner, GetCurrentThreadId()); # else /* _WIN32 */ - __sync_lock_test_and_set(&m_Object->m_LockOwner, pthread_self()); + __sync_lock_test_and_set(&m_Object->m_LockOwner, pthread_self()); # endif /* _WIN32 */ + } #endif /* I2_DEBUG */ } @@ -120,7 +122,7 @@ void ObjectLock::Spin(unsigned int it) void ObjectLock::Unlock() { #ifdef I2_DEBUG - if (m_Locked) { + if (m_Locked && !--m_Object->m_LockCount) { # ifdef _WIN32 InterlockedExchange(&m_Object->m_LockOwner, 0); # else /* _WIN32 */ From ab1c8d93e64b754a3bc7505cef0306098f5d64a4 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Tue, 15 May 2018 20:44:34 +0200 Subject: [PATCH 0049/1162] Fix wrong calculation of check_swap windows plugin This fixes the wrong calculation of the check_swap windows plugin. --- plugins/check_swap.cpp | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index d405a094f..4c317dbac 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -21,7 +21,8 @@ #include #include #include -#include +#include +#include #define VERSION 1.0 @@ -37,8 +38,26 @@ struct printInfoStruct Bunit unit = BunitMB; }; +struct pageFileInfo +{ + SIZE_T totalSwap; + SIZE_T availableSpwap; +}; + static bool l_Debug; +BOOL EnumPageFilesProc(LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCTSTR lpFilename) { + std::vector* pageFile = static_cast*>(pContext); + SYSTEM_INFO systemInfo; + + GetSystemInfo(&systemInfo); + + // pPageFileInfo output is in pages, we need to multiply it by the page size + pageFile->push_back({ pPageFileInfo->TotalSize * systemInfo.dwPageSize, (pPageFileInfo->TotalSize - pPageFileInfo->TotalInUse) * systemInfo.dwPageSize }); + + return TRUE; +} + static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoStruct& printInfo) { WCHAR namePath[MAX_PATH]; @@ -187,17 +206,20 @@ static int printOutput(printInfoStruct& printInfo) static int check_swap(printInfoStruct& printInfo) { - MEMORYSTATUSEX MemBuf; - MemBuf.dwLength = sizeof(MemBuf); + PENUM_PAGE_FILE_CALLBACK pageFileCallback = &EnumPageFilesProc; + std::vector pageFiles; - if (!GlobalMemoryStatusEx(&MemBuf)) { + if(!EnumPageFiles(pageFileCallback, &pageFiles)) { printErrorInfo(); return 3; } - printInfo.tSwap = round(MemBuf.ullTotalPageFile / pow(1024.0, printInfo.unit)); - printInfo.aSwap = round(MemBuf.ullAvailPageFile / pow(1024.0, printInfo.unit)); - printInfo.percentFree = 100.0 * MemBuf.ullAvailPageFile / MemBuf.ullTotalPageFile; + for (int i = 0; i < pageFiles.size(); i++) { + printInfo.tSwap += round(pageFiles.at(i).totalSwap / pow(1024.0, printInfo.unit)); + printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit)); + } + + printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; return -1; } From f24342d4ff0055c7939588fbe0910a5fbaa597e8 Mon Sep 17 00:00:00 2001 From: Carsten Koebke Date: Mon, 25 Jun 2018 07:05:49 +0200 Subject: [PATCH 0050/1162] Add missing docs for nscp-local-tasksched --- doc/10-icinga-template-library.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 0da925058..18b555e24 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1893,6 +1893,25 @@ nscp_counter_arguments | **Optional.** Additional arguments. nscp_counter_showall | **Optional.** Shows more details in plugin output, default to false. nscp_counter_perfsyntax | **Optional.** Apply performance data label, e.g. `Total Processor Time` to avoid special character problems. Defaults to `nscp_counter_name`. +### nscp-local-tasksched + +Check Command object for the `check_tasksched` NSClient++ plugin. +You can check for a single task or for a complete folder (and sub folders) of tasks. + +Name | Description +-----------------------|------------------ +nscp_tasksched_name | **Optional.** Name of the task to check. +nscp_tasksched_folder | **Optional.** The folder in which the tasks to check reside. +nscp_tasksched_recursive | **Optional.** Recurse sub folder, defaults to true. +nscp_tasksched_hidden | **Optional.** Look for hidden tasks, defaults to false. +nscp_tasksched_warning | **Optional.** Filter which marks items which generates a warning state, defaults to `exit_code != 0`. +nscp_tasksched_critical | **Optional.** Filter which marks items which generates a critical state, defaults to `exit_code < 0`. +nscp_tasksched_emptystate | **Optional.** An array of NSClient++ modules to load. Defaults to `[ "CheckDisk" ]`. +nscp_tasksched_perfsyntax | **Optional.** Performance alias syntax., defaults to `%(title)` +nscp_tasksched_detailsyntax | **Optional.** Detail level syntax, defaults to `%(folder)/%(title): %(exit_code) != 0` +nscp_tasksched_arguments | **Optional.** Additional arguments. +nscp_tasksched_showall | **Optional.** Shows more details in plugin output, default to false. +nscp_modules | **Optional.** An array of NSClient++ modules to load. Defaults to `[ "CheckTaskSched" ]`. ## Plugin Check Commands for Manubulon SNMP From 0ba86c0a261697f8fb360c2d7f5a206292e475ef Mon Sep 17 00:00:00 2001 From: Carsten Koebke Date: Mon, 25 Jun 2018 07:10:35 +0200 Subject: [PATCH 0051/1162] Change wrong text for emptystate --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 18b555e24..a31ab9445 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1906,7 +1906,7 @@ nscp_tasksched_recursive | **Optional.** Recurse sub folder, defaults to true nscp_tasksched_hidden | **Optional.** Look for hidden tasks, defaults to false. nscp_tasksched_warning | **Optional.** Filter which marks items which generates a warning state, defaults to `exit_code != 0`. nscp_tasksched_critical | **Optional.** Filter which marks items which generates a critical state, defaults to `exit_code < 0`. -nscp_tasksched_emptystate | **Optional.** An array of NSClient++ modules to load. Defaults to `[ "CheckDisk" ]`. +nscp_tasksched_emptystate | **Optional.** Return status to use when nothing matched filter, defaults to warning. nscp_tasksched_perfsyntax | **Optional.** Performance alias syntax., defaults to `%(title)` nscp_tasksched_detailsyntax | **Optional.** Detail level syntax, defaults to `%(folder)/%(title): %(exit_code) != 0` nscp_tasksched_arguments | **Optional.** Additional arguments. From 4159682cf808ca433e862992329b71d0945ab512 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Mon, 25 Jun 2018 10:09:30 +0200 Subject: [PATCH 0052/1162] Remove unused code These methods and types were used only by the Icinga Studio --- lib/remote/apiclient.cpp | 187 --------------------------------------- lib/remote/apiclient.hpp | 69 --------------- 2 files changed, 256 deletions(-) diff --git a/lib/remote/apiclient.cpp b/lib/remote/apiclient.cpp index b0d0a63da..6e507b029 100644 --- a/lib/remote/apiclient.cpp +++ b/lib/remote/apiclient.cpp @@ -33,193 +33,6 @@ ApiClient::ApiClient(const String& host, const String& port, m_Connection->Start(); } -void ApiClient::GetTypes(const TypesCompletionCallback& callback) const -{ - Url::Ptr url = new Url(); - url->SetScheme("https"); - url->SetHost(m_Connection->GetHost()); - url->SetPort(m_Connection->GetPort()); - url->SetPath({ "v1", "types" }); - - try { - std::shared_ptr req = m_Connection->NewRequest(); - req->RequestMethod = "GET"; - req->RequestUrl = url; - req->AddHeader("Authorization", "Basic " + Base64::Encode(m_User + ":" + m_Password)); - req->AddHeader("Accept", "application/json"); - m_Connection->SubmitRequest(req, std::bind(TypesHttpCompletionCallback, _1, _2, callback)); - } catch (const std::exception&) { - callback(boost::current_exception(), std::vector()); - } -} - -void ApiClient::TypesHttpCompletionCallback(HttpRequest& request, HttpResponse& response, - const TypesCompletionCallback& callback) -{ - Dictionary::Ptr result; - - String body; - char buffer[1024]; - size_t count; - - while ((count = response.ReadBody(buffer, sizeof(buffer))) > 0) - body += String(buffer, buffer + count); - - try { - if (response.StatusCode < 200 || response.StatusCode > 299) { - std::string message = "HTTP request failed; Code: " + Convert::ToString(response.StatusCode) + "; Body: " + body; - - BOOST_THROW_EXCEPTION(ScriptError(message)); - } - - std::vector types; - - result = JsonDecode(body); - - Array::Ptr results = result->Get("results"); - - ObjectLock olock(results); - for (const Dictionary::Ptr typeInfo : results) - { - ApiType::Ptr type = new ApiType(); - type->Abstract = typeInfo->Get("abstract"); - type->BaseName = typeInfo->Get("base"); - type->Name = typeInfo->Get("name"); - type->PluralName = typeInfo->Get("plural_name"); - // TODO: attributes - types.emplace_back(std::move(type)); - } - - callback(boost::exception_ptr(), types); - } catch (const std::exception& ex) { - Log(LogCritical, "ApiClient") - << "Error while decoding response: " << DiagnosticInformation(ex); - callback(boost::current_exception(), std::vector()); - } - -} - -void ApiClient::GetObjects(const String& pluralType, const ObjectsCompletionCallback& callback, - const std::vector& names, const std::vector& attrs, const std::vector& joins, bool all_joins) const -{ - Url::Ptr url = new Url(); - url->SetScheme("https"); - url->SetHost(m_Connection->GetHost()); - url->SetPort(m_Connection->GetPort()); - url->SetPath({ "v1", "objects", pluralType }); - - std::map > params; - - for (const String& name : names) { - params[pluralType.ToLower()].push_back(name); - } - - for (const String& attr : attrs) { - params["attrs"].push_back(attr); - } - - for (const String& join : joins) { - params["joins"].push_back(join); - } - - params["all_joins"].emplace_back(all_joins ? "1" : "0"); - - url->SetQuery(params); - - try { - std::shared_ptr req = m_Connection->NewRequest(); - req->RequestMethod = "GET"; - req->RequestUrl = url; - req->AddHeader("Authorization", "Basic " + Base64::Encode(m_User + ":" + m_Password)); - req->AddHeader("Accept", "application/json"); - m_Connection->SubmitRequest(req, std::bind(ObjectsHttpCompletionCallback, _1, _2, callback)); - } catch (const std::exception&) { - callback(boost::current_exception(), std::vector()); - } -} - -void ApiClient::ObjectsHttpCompletionCallback(HttpRequest& request, - HttpResponse& response, const ObjectsCompletionCallback& callback) -{ - Dictionary::Ptr result; - - String body; - char buffer[1024]; - size_t count; - - while ((count = response.ReadBody(buffer, sizeof(buffer))) > 0) - body += String(buffer, buffer + count); - - try { - if (response.StatusCode < 200 || response.StatusCode > 299) { - std::string message = "HTTP request failed; Code: " + Convert::ToString(response.StatusCode) + "; Body: " + body; - - BOOST_THROW_EXCEPTION(ScriptError(message)); - } - - std::vector objects; - - result = JsonDecode(body); - - Array::Ptr results = result->Get("results"); - - if (results) { - ObjectLock olock(results); - for (const Dictionary::Ptr objectInfo : results) { - ApiObject::Ptr object = new ApiObject(); - - object->Name = objectInfo->Get("name"); - object->Type = objectInfo->Get("type"); - - Dictionary::Ptr attrs = objectInfo->Get("attrs"); - - if (attrs) { - ObjectLock olock(attrs); - for (const Dictionary::Pair& kv : attrs) { - object->Attrs[object->Type.ToLower() + "." + kv.first] = kv.second; - } - } - - Dictionary::Ptr joins = objectInfo->Get("joins"); - - if (joins) { - ObjectLock olock(joins); - for (const Dictionary::Pair& kv : joins) { - Dictionary::Ptr attrs = kv.second; - - if (attrs) { - ObjectLock olock(attrs); - for (const Dictionary::Pair& kv2 : attrs) { - object->Attrs[kv.first + "." + kv2.first] = kv2.second; - } - } - } - } - - Array::Ptr used_by = objectInfo->Get("used_by"); - - if (used_by) { - ObjectLock olock(used_by); - for (const Dictionary::Ptr& refInfo : used_by) { - ApiObjectReference ref; - ref.Name = refInfo->Get("name"); - ref.Type = refInfo->Get("type"); - object->UsedBy.emplace_back(std::move(ref)); - } - } - - objects.push_back(object); - } - } - - callback(boost::exception_ptr(), objects); - } catch (const std::exception& ex) { - Log(LogCritical, "ApiClient") - << "Error while decoding response: " << DiagnosticInformation(ex); - callback(boost::current_exception(), std::vector()); - } -} - void ApiClient::ExecuteScript(const String& session, const String& command, bool sandboxed, const ExecuteScriptCompletionCallback& callback) const { diff --git a/lib/remote/apiclient.hpp b/lib/remote/apiclient.hpp index 7507765a0..c6814c02b 100644 --- a/lib/remote/apiclient.hpp +++ b/lib/remote/apiclient.hpp @@ -28,62 +28,6 @@ namespace icinga { -struct ApiFieldAttributes -{ -public: - bool Config; - bool Navigation; - bool NoUserModify; - bool NouserView; - bool Required; - bool State; -}; - -class ApiType; - -struct ApiField -{ -public: - String Name; - int ID; - int ArrayRank; - ApiFieldAttributes FieldAttributes; - String TypeName; - intrusive_ptr Type; -}; - -class ApiType final : public Object -{ -public: - DECLARE_PTR_TYPEDEFS(ApiType); - - String Name; - String PluralName; - String BaseName; - ApiType::Ptr Base; - bool Abstract; - std::map Fields; - std::vector PrototypeKeys; -}; - -struct ApiObjectReference -{ -public: - String Name; - String Type; -}; - -struct ApiObject : public Object -{ -public: - DECLARE_PTR_TYPEDEFS(ApiObject); - - String Name; - String Type; - std::map Attrs; - std::vector UsedBy; -}; - class ApiClient : public Object { public: @@ -92,15 +36,6 @@ public: ApiClient(const String& host, const String& port, String user, String password); - typedef std::function&)> TypesCompletionCallback; - void GetTypes(const TypesCompletionCallback& callback) const; - - typedef std::function&)> ObjectsCompletionCallback; - void GetObjects(const String& pluralType, const ObjectsCompletionCallback& callback, - const std::vector& names = std::vector(), - const std::vector& attrs = std::vector(), - const std::vector& joins = std::vector(), bool all_joins = false) const; - typedef std::function ExecuteScriptCompletionCallback; void ExecuteScript(const String& session, const String& command, bool sandboxed, const ExecuteScriptCompletionCallback& callback) const; @@ -114,10 +49,6 @@ private: String m_User; String m_Password; - static void TypesHttpCompletionCallback(HttpRequest& request, - HttpResponse& response, const TypesCompletionCallback& callback); - static void ObjectsHttpCompletionCallback(HttpRequest& request, - HttpResponse& response, const ObjectsCompletionCallback& callback); static void ExecuteScriptHttpCompletionCallback(HttpRequest& request, HttpResponse& response, const ExecuteScriptCompletionCallback& callback); static void AutocompleteScriptHttpCompletionCallback(HttpRequest& request, From 6c282d617f7a9ef89d5893960b53c4a1d714e881 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Mon, 25 Jun 2018 11:21:44 +0200 Subject: [PATCH 0053/1162] Fix output formatting in windows plugins Adds a newline to check_memory and check_ping now looks up and prints error messages when host resolution fails. --- plugins/check_memory.cpp | 2 +- plugins/check_ping.cpp | 2 +- plugins/thresholds.cpp | 23 +++++++++++++++++++++-- plugins/thresholds.hpp | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index 46c65649e..bbdbd741f 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -189,7 +189,7 @@ static int printOutput(printInfoStruct& printInfo) std::wcout << "| memory=" << currentValue << BunitStr(printInfo.unit) << L";" << printInfo.warn.pString(printInfo.tRam) << L";" << printInfo.crit.pString(printInfo.tRam) - << L";0;" << printInfo.tRam; + << L";0;" << printInfo.tRam << '\n'; return state; } diff --git a/plugins/check_ping.cpp b/plugins/check_ping.cpp index 8be087a8f..18aa1f046 100644 --- a/plugins/check_ping.cpp +++ b/plugins/check_ping.cpp @@ -264,7 +264,7 @@ static bool resolveHostname(const std::wstring& hostname, bool ipv6, std::wstrin DWORD ret = GetAddrInfoW(hostname.c_str(), NULL, &hints, &result); if (ret) { - std::cout << "Failed to resolve hostname. Winsock Error Code: " << ret << '\n'; + std::wcout << L"Failed to resolve hostname. Error " << ret << L": " << formatErrorInfo(ret) << L"\n"; return false; } diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index f80e7d634..18ac8c5de 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -223,7 +223,26 @@ void printErrorInfo(unsigned long err) LPWSTR mBuf = NULL; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&mBuf, 0, NULL)) - std::wcout << "Failed to format error message, last error was: " << err << '\n'; - else + std::wcout << "Failed to format error message, last error was: " << err << '\n'; + else { + boost::trim_right(std::wstring(mBuf)); std::wcout << mBuf << std::endl; + } } + +std::wstring formatErrorInfo(unsigned long err) { + std::wostringstream out; + if (!err) + err = GetLastError(); + LPWSTR mBuf = NULL; + if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&mBuf, 0, NULL)) + out << "Failed to format error message, last error was: " << err; + else { + std::wstring tempOut = std::wstring(mBuf); + boost::trim_right(tempOut); + out << tempOut; + } + + return out.str(); +} \ No newline at end of file diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index 1a63e5a4d..58daedbd4 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -73,5 +73,6 @@ Tunit parseTUnit(const std::wstring&); std::wstring TunitStr(const Tunit&); void printErrorInfo(unsigned long err = 0); +std::wstring formatErrorInfo(unsigned long err); #endif /* THRESHOLDS_H */ From 4f2ca0a324d16ac541452f5888922dfe686f0695 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Mon, 25 Jun 2018 13:39:59 +0200 Subject: [PATCH 0054/1162] Fix table in Livestatus Filters --- doc/14-features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/14-features.md b/doc/14-features.md index d7a41a289..e895a0f38 100644 --- a/doc/14-features.md +++ b/doc/14-features.md @@ -641,7 +641,7 @@ A list of available external commands and their parameters can be found [here](2 and, or, negate Operator | Negate | Description - ----------|------------------------ + ----------|----------|------------- = | != | Equality ~ | !~ | Regex match =~ | !=~ | Equality ignoring case From 5dc900369d21e4ed562b7557d28872a2a8e588de Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 22 Jun 2018 13:01:58 +0200 Subject: [PATCH 0055/1162] Fix wrong UOM in check_uptime windows plugin This fixes the usage of unvalid UOM in the check_uptime windows plugin. The performance data will now provided in seconds. --- plugins/check_uptime.cpp | 22 +++++++++++++--------- plugins/thresholds.cpp | 36 ++++++++++++++++++++++++++++++++++++ plugins/thresholds.hpp | 1 + 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/plugins/check_uptime.cpp b/plugins/check_uptime.cpp index 27a656ef2..2e5997e8c 100644 --- a/plugins/check_uptime.cpp +++ b/plugins/check_uptime.cpp @@ -33,6 +33,7 @@ struct printInfoStruct threshold warn; threshold crit; long long time; + long long timeInSeconds; Tunit unit; }; @@ -166,19 +167,19 @@ static int printOutput(printInfoStruct& printInfo) switch (state) { case OK: - std::wcout << L"UPTIME OK " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time - << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" - << printInfo.crit.pString() << L";0;" << '\n'; + std::wcout << L"UPTIME OK " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.timeInSeconds + << "s" << L";" << printInfo.warn.toSeconds(printInfo.unit).pString() << L";" + << printInfo.crit.toSeconds(printInfo.unit).pString() << L";0;" << '\n'; break; case WARNING: - std::wcout << L"UPTIME WARNING " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time - << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" - << printInfo.crit.pString() << L";0;" << '\n'; + std::wcout << L"UPTIME WARNING " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.timeInSeconds + << "s" << L";" << printInfo.warn.toSeconds(printInfo.unit).pString() << L";" + << printInfo.crit.toSeconds(printInfo.unit).pString() << L";0;" << '\n'; break; case CRITICAL: - std::wcout << L"UPTIME CRITICAL " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.time - << TunitStr(printInfo.unit) << L";" << printInfo.warn.pString() << L";" - << printInfo.crit.pString() << L";0;" << '\n'; + std::wcout << L"UPTIME CRITICAL " << printInfo.time << TunitStr(printInfo.unit) << L" | 'uptime'=" << printInfo.timeInSeconds + << "s" << L";" << printInfo.warn.toSeconds(printInfo.unit).pString() << L";" + << printInfo.crit.toSeconds(printInfo.unit).pString() << L";0;" << '\n'; break; } @@ -209,6 +210,9 @@ static void getUptime(printInfoStruct& printInfo) printInfo.time = uptime.count(); break; } + + // For the Performance Data we need the time in seconds + printInfo.timeInSeconds = boost::chrono::duration_cast(uptime).count(); } int wmain(int argc, WCHAR **argv) diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index f80e7d634..36992f12d 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -28,6 +28,13 @@ threshold::threshold() : set(false) {} +threshold::threshold(const double v, const double c, bool l , bool p ) { + lower = v; + upper = c; + legal = l; + perc = p; +} + threshold::threshold(const std::wstring& stri) { if (stri.empty()) @@ -126,6 +133,35 @@ std::wstring threshold::pString(const double max) return s; } +threshold threshold::toSeconds(const Tunit& fromUnit) { + if (!set) + return *this; + + double lowerAbs = lower; + double upperAbs = upper; + + switch (fromUnit) { + case TunitMS: + lowerAbs = lowerAbs / 1000; + upperAbs = upperAbs / 1000; + break; + case TunitS: + lowerAbs = lowerAbs ; + upperAbs = upperAbs ; + break; + case TunitM: + lowerAbs = lowerAbs * 60; + upperAbs = upperAbs * 60; + break; + case TunitH: + lowerAbs = lowerAbs * 60 * 60; + upperAbs = upperAbs * 60 * 60; + break; + } + + return threshold(lowerAbs, upperAbs, legal, perc); +} + std::wstring removeZero(double val) { std::wstring ret = boost::lexical_cast(val); diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index 1a63e5a4d..bffeb6209 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -62,6 +62,7 @@ public: // returns a printable string of the threshold std::wstring pString(const double max = 100.0); + threshold toSeconds(const Tunit& fromUnit); }; std::wstring removeZero(double); From c577554073c6b4afc65bce3f51debda0f60a1415 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 5 Jun 2018 13:43:10 +0200 Subject: [PATCH 0056/1162] Implement support for the --env command-line argument --- icinga-app/icinga.cpp | 103 +++++++++++++++++++++++- icinga-installer/icinga2.wixpatch.cmake | 6 +- lib/cli/apisetupcommand.cpp | 13 ++- lib/cli/apisetupcommand.hpp | 2 + lib/cli/apisetuputility.cpp | 10 +-- lib/cli/apisetuputility.hpp | 4 +- lib/cli/featureutility.cpp | 14 ++-- lib/cli/featureutility.hpp | 4 +- lib/remote/apilistener.cpp | 49 +++++++++-- lib/remote/apilistener.hpp | 1 + 10 files changed, 179 insertions(+), 27 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 404cedf30..957cea61b 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -32,6 +32,8 @@ #include "base/context.hpp" #include "base/console.hpp" #include "base/process.hpp" +#include "base/json.hpp" +#include "base/tcpsocket.hpp" #include "config.h" #include #include @@ -46,6 +48,9 @@ # include # include # include + +# define popen _popen +# define pclose _pclose #endif /* _WIN32 */ using namespace icinga; @@ -215,8 +220,6 @@ static int Main() Application::DeclareConcurrency(std::thread::hardware_concurrency()); Application::DeclareMaxConcurrentChecks(Application::GetDefaultMaxConcurrentChecks()); - ScriptGlobal::Set("Environment", "production"); - ScriptGlobal::Set("AttachDebugger", false); ScriptGlobal::Set("PlatformKernel", Utility::GetPlatformKernel()); @@ -247,7 +250,8 @@ static int Main() ("include,I", po::value >(), "add include search directory") ("log-level,x", po::value(), "specify the log level for the console log.\n" "The valid value is either debug, notice, information (default), warning, or critical") - ("script-debugger,X", "whether to enable the script debugger"); + ("script-debugger,X", "whether to enable the script debugger") + ("env", po::value(), "the name of the environment, e.g. \"production\""); po::options_description hiddenDesc("Hidden options"); @@ -271,6 +275,99 @@ static int Main() return EXIT_FAILURE; } + if (vm.count("env") && vm["env"].as() != "") { + String env = vm["env"].as(); + ScriptGlobal::Set("Environment", env); + } else { +#ifndef _WIN32 + String cmd = "icinga-envs"; +#else /* _WIN32 */ + String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\""; +#endif /* _WIN32 */ + cmd += " get-default"; +#ifndef _WIN32 + cmd += " 2>/dev/null"; +#else /* _WIN32 */ + cmd += " 2>NUL"; + cmd = "\"" + cmd + "\""; +#endif /* _WIN32 */ + + FILE *fp = popen(cmd.CStr(), "r"); + std::stringstream msgbuf; + while (!ferror(fp) && !feof(fp)) { + char buf[512]; + size_t num = fread(buf, 1, sizeof(buf), fp); + msgbuf << std::string(buf, buf + num); + } + pclose(fp); + + String env = msgbuf.str(); + ScriptGlobal::Set("Environment", env.Trim()); + } + + String env = ScriptGlobal::Get("Environment", NULL); +#ifndef _WIN32 + String cmd = "icinga-envs"; +#else /* _WIN32 */ + String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\""; +#endif /* _WIN32 */ + cmd += " info --json " + Utility::EscapeShellArg(env); +#ifndef _WIN32 + cmd += " 2>/dev/null"; +#else /* _WIN32 */ + cmd += " 2>NUL"; + cmd = "\"" + cmd + "\""; +#endif /* _WIN32 */ + + FILE *fp = popen(cmd.CStr(), "r"); + std::stringstream msgbuf; + while (!ferror(fp) && !feof(fp)) { + char buf[512]; + size_t num = fread(buf, 1, sizeof(buf), fp); + msgbuf << std::string(buf, buf + num); + } + pclose(fp); + + Dictionary::Ptr envInfo; + try { + envInfo = JsonDecode(msgbuf.str()); + } catch (const std::exception&) {} + + if (envInfo) { + Dictionary::Ptr config = envInfo->Get("config"); + + if (!config) { + Log(LogCritical, "app") + << "Invalid JSON returned by icinga-envs: " << msgbuf.str(); + return EXIT_FAILURE; + } + + String configPath = config->Get("config_path"); + String dataPath = config->Get("data_path"); + + ScriptGlobal::Set("SysconfDir", configPath); + ScriptGlobal::Set("RunDir", dataPath + "/run"); + ScriptGlobal::Set("LocalStateDir", dataPath); + + TcpSocket::Ptr agentListener = new TcpSocket(); + agentListener->Bind("127.0.0.1", "0", AF_INET); + auto pieces = agentListener->GetClientAddress().Split(":"); + config->Set("port", Convert::ToLong(pieces[pieces.size() - 1])); + + Dictionary::Ptr envData = new Dictionary({ + { "listener", agentListener }, + { "config", config }, + { "meta_path", envInfo->Get("env_path") + "/config.json" } + }); + + // Make the agent listener available to the ApiListener later on + ScriptGlobal::Set("EnvironmentInfo", envData); + } else if (env != "") { + Log(LogCritical, "app") + << "No such environment exists: " << env; + return EXIT_FAILURE; + } + #ifdef _WIN32 char username[UNLEN + 1]; DWORD usernameLen = UNLEN + 1; diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake index 0666261d2..ab400ed1e 100644 --- a/icinga-installer/icinga2.wixpatch.cmake +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -10,9 +10,9 @@ - $CM_CP_sbin.icinga2_installer.exe>2 - $CM_CP_sbin.icinga2_installer.exe>2 - $CM_CP_sbin.icinga2_installer.exe=2 + $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA + $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA + $CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA diff --git a/lib/cli/apisetupcommand.cpp b/lib/cli/apisetupcommand.cpp index bc832c525..f13b985a1 100644 --- a/lib/cli/apisetupcommand.cpp +++ b/lib/cli/apisetupcommand.cpp @@ -49,6 +49,14 @@ int ApiSetupCommand::GetMaxArguments() const return -1; } +void ApiSetupCommand::InitParameters(boost::program_options::options_description& visibleDesc, + boost::program_options::options_description& hiddenDesc) const +{ + visibleDesc.add_options() + ("quiet,q", "be less verbose") + ; +} + /** * The entry point for the "api setup" CLI command. * @@ -56,12 +64,15 @@ int ApiSetupCommand::GetMaxArguments() const */ int ApiSetupCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { + if (vm.count("quiet")) + Logger::SetConsoleLogSeverity(LogWarning); + String cn = VariableUtility::GetVariable("NodeName"); if (cn.IsEmpty()) cn = Utility::GetFQDN(); - if (!ApiSetupUtility::SetupMaster(cn, true)) + if (!ApiSetupUtility::SetupMaster(cn, true, vm.count("quiet"))) return 1; return 0; diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp index f54da0685..fcdb56428 100644 --- a/lib/cli/apisetupcommand.hpp +++ b/lib/cli/apisetupcommand.hpp @@ -38,6 +38,8 @@ public: String GetDescription() const override; String GetShortDescription() const override; int GetMaxArguments() const override; + void InitParameters(boost::program_options::options_description& visibleDesc, + boost::program_options::options_description& hiddenDesc) const override; int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const override; ImpersonationLevel GetImpersonationLevel() const override; }; diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 070e78cff..d085fffc3 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -48,7 +48,7 @@ String ApiSetupUtility::GetApiUsersConfPath() return ApiSetupUtility::GetConfdPath() + "/api-users.conf"; } -bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart) +bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart, bool quiet) { if (!SetupMasterCertificates(cn)) return false; @@ -56,13 +56,13 @@ bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart) if (!SetupMasterApiUser()) return false; - if (!SetupMasterEnableApi()) + if (!SetupMasterEnableApi(quiet)) return false; if (!SetupMasterUpdateConstants(cn)) return false; - if (prompt_restart) { + if (prompt_restart && !quiet) { std::cout << "Done.\n\n"; std::cout << "Now restart your Icinga 2 daemon to finish the installation!\n\n"; } @@ -196,11 +196,11 @@ bool ApiSetupUtility::SetupMasterApiUser() return true; } -bool ApiSetupUtility::SetupMasterEnableApi() +bool ApiSetupUtility::SetupMasterEnableApi(bool quiet) { Log(LogInformation, "cli", "Enabling the 'api' feature."); - FeatureUtility::EnableFeatures({ "api" }); + FeatureUtility::EnableFeatures({ "api" }, quiet); return true; } diff --git a/lib/cli/apisetuputility.hpp b/lib/cli/apisetuputility.hpp index 9523ebffc..26b163d90 100644 --- a/lib/cli/apisetuputility.hpp +++ b/lib/cli/apisetuputility.hpp @@ -37,11 +37,11 @@ namespace icinga class ApiSetupUtility { public: - static bool SetupMaster(const String& cn, bool prompt_restart = false); + static bool SetupMaster(const String& cn, bool prompt_restart = false, bool quiet = false); static bool SetupMasterCertificates(const String& cn); static bool SetupMasterApiUser(); - static bool SetupMasterEnableApi(); + static bool SetupMasterEnableApi(bool quiet = false); static bool SetupMasterUpdateConstants(const String& cn); static String GetConfdPath(); diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index 9056b60fe..e06690f0d 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -56,7 +56,7 @@ std::vector FeatureUtility::GetFieldCompletionSuggestions(const String& return suggestions; } -int FeatureUtility::EnableFeatures(const std::vector& features) +int FeatureUtility::EnableFeatures(const std::vector& features, bool quiet) { String features_available_dir = GetFeaturesAvailablePath(); String features_enabled_dir = GetFeaturesEnabledPath(); @@ -93,8 +93,9 @@ int FeatureUtility::EnableFeatures(const std::vector& features) continue; } - std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature - << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; + if (!quiet) + std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature + << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; #ifndef _WIN32 String relativeSource = "../features-available/" + feature + ".conf"; @@ -131,7 +132,7 @@ int FeatureUtility::EnableFeatures(const std::vector& features) return 0; } -int FeatureUtility::DisableFeatures(const std::vector& features) +int FeatureUtility::DisableFeatures(const std::vector& features, bool quiet) { String features_enabled_dir = GetFeaturesEnabledPath(); @@ -160,8 +161,9 @@ int FeatureUtility::DisableFeatures(const std::vector& features) continue; } - std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature - << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; + if (!quiet) + std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature + << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; } if (!errors.empty()) { diff --git a/lib/cli/featureutility.hpp b/lib/cli/featureutility.hpp index 38f91cce0..23115ccca 100644 --- a/lib/cli/featureutility.hpp +++ b/lib/cli/featureutility.hpp @@ -40,8 +40,8 @@ public: static std::vector GetFieldCompletionSuggestions(const String& word, bool enable); - static int EnableFeatures(const std::vector& features); - static int DisableFeatures(const std::vector& features); + static int EnableFeatures(const std::vector& features, bool quiet = false); + static int DisableFeatures(const std::vector& features, bool quiet = false); static int ListFeatures(std::ostream& os = std::cout); static bool GetFeatures(std::vector& features, bool enable); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c1546710d..d1190a703 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -224,11 +224,23 @@ void ApiListener::Start(bool runtimeCreated) OpenLogFile(); } - /* create the primary JSON-RPC listener */ - if (!AddListener(GetBindHost(), GetBindPort())) { - Log(LogCritical, "ApiListener") - << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'."; - Application::Exit(EXIT_FAILURE); + Dictionary::Ptr envData = ScriptGlobal::Get("EnvironmentInfo", &Empty); + if (envData) { + ScriptGlobal::Set("EnvironmentInfo", Empty); + TcpSocket::Ptr listener = envData->Get("listener"); + if (!AddListener(listener)) { + Log(LogCritical, "ApiListener") + << "Failed to set up pre-configured agent listener."; + Application::Exit(EXIT_FAILURE); + } + Utility::SaveJsonFile(envData->Get("meta_path"), 0600, envData->Get("config")); + } else { + /* create the primary JSON-RPC listener */ + if (!AddListener(GetBindHost(), GetBindPort())) { + Log(LogCritical, "ApiListener") + << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'."; + Application::Exit(EXIT_FAILURE); + } } m_Timer = new Timer(); @@ -301,6 +313,33 @@ bool ApiListener::IsMaster() const return master == GetLocalEndpoint(); } +/** + * Creates a new JSON-RPC listener using the specified TCP socket object. + * + * @param listener The TCP socket to use. + */ +bool ApiListener::AddListener(const TcpSocket::Ptr& listener) +{ + ObjectLock olock(this); + + std::shared_ptr sslContext = m_SSLContext; + + if (!sslContext) { + Log(LogCritical, "ApiListener", "SSL context is required for AddListener()"); + return false; + } + + Log(LogInformation, "ApiListener") + << "Adding pre-configured listener on address " << listener->GetClientAddress(); + + std::thread thread(std::bind(&ApiListener::ListenerThreadProc, this, listener)); + thread.detach(); + + m_Servers.insert(listener); + + return true; +} + /** * Creates a new JSON-RPC listener on the specified port. * diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index b3894992a..41c4c3d23 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -138,6 +138,7 @@ private: void CleanupCertificateRequestsTimerHandler(); bool AddListener(const String& node, const String& service); + bool AddListener(const TcpSocket::Ptr& listener); void AddConnection(const Endpoint::Ptr& endpoint); void NewClientHandler(const Socket::Ptr& client, const String& hostname, ConnectionRole role); From 9d9d3f77dfb88eb23deb564797dfb8b06e698653 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 27 Jun 2018 08:14:48 +0200 Subject: [PATCH 0057/1162] Update documentation --- doc/06-distributed-monitoring.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 985e23fd9..6402a1a3e 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -2793,3 +2793,35 @@ Add the global zone `global-templates` in case it did not exist. global = true } EOF + +## Using Multiple Environments + +In some cases it might be useful to run multiple Icinga instance on the same host. Two potential scenarios include: + +* running different versions of the same monitoring configuration (e.g. production and testing) +* running disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) + +Icinga supports these scenarios by providing a global variable called `Environment`. It can be set like any other +global variable, e.g. in the `constants.conf` file or in a file in a global template zone. + +The `Environment` variable can also be set using the `--env` command-line option. Setting the variable this way +has the added effect that Icinga tries to determine if the `Icinga Environments` add-on is available and +if so uses its CLI commands to determine the configuration and data paths. This command-line option also has the +effect of changing the listener port for cluster feature to a random port which is made available to the +`Icinga Environments` add-on through its `config.json` file. + +When Icinga establishes a TLS connection to another cluster instance it automatically uses the SNI extension +to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple +Icinga instances behind a load balancer. + +SNI example: `icinga2-client1.localdomain` + +However, if the `Environment` variable is non-empty Icinga will append the environment name to the SNI hostname +like this: + +SNI example with environment: `icinga2-client1.localdomain:production` + +The Icinga Environments add-on provides a reverse proxy which does SNI-based port multiplexing. I.e., it uses a +single externally-visible TCP port (usually 5665) and forwards connections to one or more Icinga instances +which are bound to a local TCP port. It does so by inspecting the environment name that is sent as part of the +SNI extension. From f499743ef2b744cddac980f730799e60cc1e3003 Mon Sep 17 00:00:00 2001 From: Carsten Koebke Date: Thu, 28 Jun 2018 07:18:57 +0200 Subject: [PATCH 0058/1162] Its catalogued not cataloged :) --- doc/10-icinga-template-library.md | 4 ++-- itl/plugins-contrib.d/databases.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index d57d42352..208732936 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2181,7 +2181,7 @@ Custom attributes passed as [command parameters](03-monitoring-basics.md#command Name | Description ---------------------------------|------------------------------------------------------------------------------------------------------------------------------ -db2_health_database | **Required.** The name of the database. (If it was catalogued locally, this parameter and `db2_health_not_cataloged = false` are the only you need. Otherwise you must specify database, hostname and port) +db2_health_database | **Required.** The name of the database. (If it was catalogued locally, this parameter and `db2_health_not_catalogued = false` are the only you need. Otherwise you must specify database, hostname and port) db2_health_username | **Optional.** The username for the database connection. db2_health_password | **Optional.** The password for the database connection. db2_health_port | **Optional.** The port where DB2 is listening. @@ -2197,7 +2197,7 @@ db2_health_maxinactivity | **Optional.** Used for the maximum amount of tim db2_health_mitigation | **Optional.** Classifies the severity of an offline tablespace. db2_health_lookback | **Optional.** How many days in the past db2_health check should look back to calculate exitcode. db2_health_report | **Optional.** Report can be used to output only the bad news. Possible values are "short", "long", "html". Defaults to `short`. -db2_health_not_cataloged | **Optional.** Set this variable to false if you want to use a catalogued locally database. Defaults to `true`. +db2_health_not_catalogued | **Optional.** Set this variable to false if you want to use a catalogued locally database. Defaults to `true`. db2_health_env_db2_home | **Required.** Specifies the location of the db2 client libraries as environment variable `DB2_HOME`. Defaults to "/opt/ibm/db2/V10.5". db2_health_env_db2_version | **Optional.** Specifies the DB2 version as environment variable `DB2_VERSION`. diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index 7e5a30e11..e1fbbfc9d 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -344,7 +344,7 @@ object CheckCommand "db2_health" { arguments = { "--hostname" = { value = "$db2_health_hostname$" - set_if = "$db2_health_not_cataloged$" + set_if = "$db2_health_not_catalogued$" description = "the host to connect" order = -2 } @@ -425,7 +425,7 @@ object CheckCommand "db2_health" { } vars.db2_health_regexp = false - vars.db2_health_not_cataloged = true + vars.db2_health_not_catalogued = true vars.db2_health_hostname = "$check_address$" vars.db2_health_report = "short" From 601c54e44e9c6651ba843d823fd683d7a543e320 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 2 Jul 2018 16:17:33 +0200 Subject: [PATCH 0059/1162] Add more debug logging for check scheduling --- lib/checker/checkercomponent.cpp | 14 +++++++++++++- lib/icinga/checkable-check.cpp | 9 ++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index c26db9de1..89426f8a1 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -174,6 +174,9 @@ void CheckerComponent::CheckThreadProc() m_IdleCheckables.insert(GetCheckableScheduleInfo(checkable)); lock.unlock(); + Log(LogDebug, "CheckerComponent") + << "Checks for checkable '" << checkable->GetName() << "' are disabled. Rescheduling check."; + checkable->UpdateNextCheck(); lock.lock(); @@ -181,7 +184,16 @@ void CheckerComponent::CheckThreadProc() continue; } - m_PendingCheckables.insert(GetCheckableScheduleInfo(checkable)); + + csi = GetCheckableScheduleInfo(checkable); + + Log(LogDebug, "CheckerComponent") + << "Scheduling info for checkable '" << checkable->GetName() << "' (" + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", checkable->GetNextCheck()) << "): Object '" + << csi.Object->GetName() << "', Next Check: " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", csi.NextCheck) << "(" << csi.NextCheck << ")."; + + m_PendingCheckables.insert(csi); lock.unlock(); diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 719611aba..619e3c0ee 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -81,7 +81,14 @@ void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); - SetNextCheck(now - adj + interval, false, origin); + double nextCheck = now - adj + interval; + + Log(LogDebug, "Checkable") + << "Update checkable '" << GetName() << "' with check interval '" << GetCheckInterval() + << "' from last check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", GetLastCheck()) + << " (" << GetLastCheck() << ") to next check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", nextCheck) << "(" << nextCheck << ")."; + + SetNextCheck(nextCheck, false, origin); } bool Checkable::HasBeenChecked() const From ab9a32d67d3cde5cd246c053627604bb32c1e99b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 2 Jul 2018 16:17:53 +0200 Subject: [PATCH 0060/1162] Fix missing next check update causing the scheduler to execute checks too often Regression from #6217, only in git master. fixes #6421 --- lib/icinga/checkable-check.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 619e3c0ee..faf50694a 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -438,6 +438,12 @@ void Checkable::ExecuteCheck() double scheduled_start = GetNextCheck(); double before_check = Utility::GetTime(); + /* This calls SetNextCheck() which updates the CheckerComponent's idle/pending + * queues and ensures that checks are not fired multiple times. ProcessCheckResult() + * is called too late. See #6421. + */ + UpdateNextCheck(); + bool reachable = IsReachable(); { From 2eb46f120340256cb8d31f6c79a83231b378a203 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 3 Jul 2018 11:02:45 +0200 Subject: [PATCH 0061/1162] Implement support for optionally specifying the 'var' keyword in 'for' loops --- doc/17-language-reference.md | 7 +++++-- lib/config/config_parser.yy | 38 ++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index d2a865811..9bd31d6b7 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -830,7 +830,7 @@ Example: var list = [ "a", "b", "c" ] - for (item in list) { + for (var item in list) { log("Item: " + item) } @@ -841,7 +841,7 @@ Iterating over dictionaries can be accomplished in a similar manner: var dict = { a = 3, b = 7 } - for (key => value in dict) { + for (var key => var value in dict) { log("Key: " + key + ", Value: " + value) } @@ -849,6 +849,9 @@ The `continue` and `break` keywords can be used to control how the loop is execu skips over the remaining expressions for the loop body and begins the next loop evaluation. The `break` keyword breaks out of the loop. +The `var` keyword is optional when declaring variables in the loop's header. Variables declared without the `var` +keyword are nonetheless local to the function. + ## Constructors In order to create a new value of a specific type constructor calls may be used. diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 70f309bd3..1a47c6932 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -469,6 +469,10 @@ combined_set_op: T_SET | T_SET_BINARY_OR ; +optional_var: /* empty */ + | T_VAR + ; + lterm: T_LIBRARY rterm { $$ = new LibraryExpression(std::unique_ptr($2), @$); @@ -603,7 +607,7 @@ lterm: T_LIBRARY rterm } | apply | object - | T_FOR '(' identifier T_FOLLOWS identifier T_IN rterm ')' + | T_FOR '(' optional_var identifier T_FOLLOWS optional_var identifier T_IN rterm ')' { BeginFlowControlBlock(context, FlowControlContinue | FlowControlBreak, true); } @@ -611,11 +615,11 @@ lterm: T_LIBRARY rterm { EndFlowControlBlock(context); - $$ = new ForExpression(*$3, *$5, std::unique_ptr($7), std::unique_ptr($10), @$); - delete $3; - delete $5; + $$ = new ForExpression(*$4, *$7, std::unique_ptr($9), std::unique_ptr($12), @$); + delete $4; + delete $7; } - | T_FOR '(' identifier T_IN rterm ')' + | T_FOR '(' optional_var identifier T_IN rterm ')' { BeginFlowControlBlock(context, FlowControlContinue | FlowControlBreak, true); } @@ -623,8 +627,8 @@ lterm: T_LIBRARY rterm { EndFlowControlBlock(context); - $$ = new ForExpression(*$3, "", std::unique_ptr($5), std::unique_ptr($8), @$); - delete $3; + $$ = new ForExpression(*$4, "", std::unique_ptr($6), std::unique_ptr($9), @$); + delete $4; } | T_FUNCTION identifier '(' identifier_items ')' use_specifier { @@ -1103,24 +1107,24 @@ use_specifier_item: identifier ; apply_for_specifier: /* empty */ - | T_FOR '(' identifier T_FOLLOWS identifier T_IN rterm ')' + | T_FOR '(' optional_var identifier T_FOLLOWS optional_var identifier T_IN rterm ')' { - context->m_FKVar.top() = *$3; - delete $3; + context->m_FKVar.top() = *$4; + delete $4; - context->m_FVVar.top() = *$5; - delete $5; + context->m_FVVar.top() = *$7; + delete $7; - context->m_FTerm.top() = $7; + context->m_FTerm.top() = $9; } - | T_FOR '(' identifier T_IN rterm ')' + | T_FOR '(' optional_var identifier T_IN rterm ')' { - context->m_FKVar.top() = *$3; - delete $3; + context->m_FKVar.top() = *$4; + delete $4; context->m_FVVar.top() = ""; - context->m_FTerm.top() = $5; + context->m_FTerm.top() = $6; } ; From 547065d6e89326e6aad02565f03e8e8551121687 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 4 Jul 2018 09:55:19 +0200 Subject: [PATCH 0062/1162] Update 'Upgrading to 2.9' docs --- doc/16-upgrading-icinga-2.md | 64 +++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index cf509cf33..5f4a2fcef 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -9,20 +9,76 @@ follow the instructions for v2.7 too. ## Upgrading to v2.9 -### Configuration Changes +### Deprecation and Removal Notes -The CORS attributes `access_control_allow_credentials`, `access_control_allow_headers` and -`access_control_allow_methods` are now controlled by Icinga 2 and cannot be changed anymore. +- Deprecation of 1.x compatibility features: `StatusDataWriter`, `CompatLogger`, `CheckResultReader`. Their removal is scheduled for 2.11. +Icinga 1.x is EOL and will be out of support by the end of 2018. +- Removal of Icinga Studio. It always has been experimental and did not satisfy our high quality standards. We've therefore removed it. + +### Sysconfig Changes + +The security fixes in v2.8.2 required moving specific runtime settings +into the Sysconfig file and environment. This included that Icinga 2 +would itself parse this file and read the required variables. This has generated +numerous false-positive log messages and led to many support questions. v2.9.0 +changes this in the standard way to read these variables from the environment, and use +sane compile-time defaults. + +If you want to adjust the number of open files for the Icinga application +for example, you would just add this setting like this on RHEL 7: + +``` +vim /etc/sysconfig/icinga2 + +ICINGA2_RLIMIT_FILES=50000 +``` + +Restart Icinga 2 afterwards, the Systemd service file automatically puts the +value into the application's environment where this is read on startup. + +### Setup Wizard Changes + +Client and satellite setups previously had the example configuration in `conf.d` included +by default. This caused trouble on config sync, or with locally executed checks generating +wrong check results for command endpoint clients. + +In v2.9.0 `node wizard`, `node setup` and the graphical Windows wizard will disable +the inclusion by default. You can opt-out and explicitly enable it again if needed. + +In addition to the default global zones `global-templates` and `director-global`, +the setup wizards also offer to specify your own custom global zones and generate +the required configuration automatically. + +The setup wizards also use full qualified names for Zone and Endpoint object generation, +either the default values (FQDN for clients) or the user supplied input. This removes +the dependency on the `NodeName` and `ZoneName` constant and helps to immediately see +the parent-child relationship. Those doing support will also see the benefit in production. ### CLI Command Changes -The `node setup` parameter `--master_host` was deprecated and replaced with `--parent_host`. This parameter is now optional to allow connection-less client setups similar to the `node wizard` CLI command. The `parent_zone` parameter has been added to modify the parent zone name e.g. for client-to-satellite setups. +The [node setup](06-distributed-monitoring.md#distributed-monitoring-automation-cli-node-setup) +parameter `--master_host` was deprecated and replaced with `--parent_host`. +This parameter is now optional to allow connection-less client setups similar to the `node wizard` +CLI command. The `parent_zone` parameter has been added to modify the parent zone name e.g. +for client-to-satellite setups. The `api user` command which was released in v2.8.2 turned out to cause huge problems with configuration validation, windows restarts and OpenSSL versions. It is therefore removed in 2.9, the `password_hash` attribute for the ApiUser object stays intact but has no effect. This is to ensure that clients don't break on upgrade. We will revise this feature in future development iterations. +### Configuration Changes + +The CORS attributes `access_control_allow_credentials`, `access_control_allow_headers` and +`access_control_allow_methods` are now controlled by Icinga 2 and cannot be changed anymore. + +### Unique Generated Names + +With the removal of RHEL 5 as supported platform, we can finally use real unique IDs. +This is reflected in generating names for e.g. API stage names. Previously it was a handcrafted +mix of local FQDN, timestamps and random numbers. + + ## Upgrading to v2.8.2 With version 2.8.2 the location of settings formerly found in `/etc/icinga2/init.conf` has changed. They are now From ac6afadb5a686df2cf6459e6f2f2c1d6eed86633 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 9 Jul 2018 14:40:32 +0200 Subject: [PATCH 0063/1162] Make HttpServerConnection#m_DataHandlerMutex a boost::recursive_mutex refs #6428 --- lib/remote/httpserverconnection.cpp | 4 ++-- lib/remote/httpserverconnection.hpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 6e8ea1c58..497ce7b83 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -77,7 +77,7 @@ TlsStream::Ptr HttpServerConnection::GetStream() const void HttpServerConnection::Disconnect() { - boost::mutex::scoped_try_lock lock(m_DataHandlerMutex); + boost::recursive_mutex::scoped_try_lock lock(m_DataHandlerMutex); if (!lock.owns_lock()) { Log(LogInformation, "HttpServerConnection", "Unable to disconnect Http client, I/O thread busy"); return; @@ -342,7 +342,7 @@ void HttpServerConnection::DataAvailableHandler() bool close = false; if (!m_Stream->IsEof()) { - boost::mutex::scoped_lock lock(m_DataHandlerMutex); + boost::recursive_mutex::scoped_lock lock(m_DataHandlerMutex); m_Stream->SetCorked(true); diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index 5f959b8a0..6d1c3bd46 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -25,6 +25,7 @@ #include "remote/apiuser.hpp" #include "base/tlsstream.hpp" #include "base/workqueue.hpp" +#include namespace icinga { @@ -55,7 +56,7 @@ private: TlsStream::Ptr m_Stream; double m_Seen; HttpRequest m_CurrentRequest; - boost::mutex m_DataHandlerMutex; + boost::recursive_mutex m_DataHandlerMutex; WorkQueue m_RequestQueue; int m_PendingRequests; From 4170bd5205948a81d0f7f99cdd042b2ffe0ad07e Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Tue, 10 Jul 2018 19:12:12 +0200 Subject: [PATCH 0064/1162] Fix negative 'empty in' value in WorkQueue log message This fixes a negative 'empty in' value in WorkQueue log messages. --- lib/base/workqueue.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/base/workqueue.cpp b/lib/base/workqueue.cpp index ae3dad9b0..7e8ad5890 100644 --- a/lib/base/workqueue.cpp +++ b/lib/base/workqueue.cpp @@ -24,6 +24,7 @@ #include "base/application.hpp" #include "base/exception.hpp" #include +#include using namespace icinga; @@ -221,7 +222,7 @@ void WorkQueue::StatusTimerHandler() if (pending > GetTaskCount(5)) { timeInfo = " empty in "; - if (timeToZero < 0) + if (timeToZero < 0 || std::isinf(timeToZero)) timeInfo += "infinite time, your task handler isn't able to keep up"; else timeInfo += Utility::FormatDuration(timeToZero); From 461c610cffd6298b4e248d9110fff620521bb640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20B=C3=A4ck?= Date: Sat, 14 Jul 2018 20:29:53 +0200 Subject: [PATCH 0065/1162] Docs: Fix typos in 03-monitoring-basics.md --- doc/03-monitoring-basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/03-monitoring-basics.md b/doc/03-monitoring-basics.md index 8e8e59839..95c0ce234 100644 --- a/doc/03-monitoring-basics.md +++ b/doc/03-monitoring-basics.md @@ -939,7 +939,7 @@ In the example above the notification template `mail-host-notification` contains all relevant notification settings. The apply rule is applied on all host objects where the `host.address` is defined. -If the host object as a specific custom attributed set, its value is inherited +If the host object has a specific custom attribute set, its value is inherited into the local notification object scope, e.g. `host.vars.notification_interval`, `host.vars.notification_period` and `host.vars.notification_type`. This overwrites attributes already specified in the imported `mail-host-notification` From bf4a83819ed99701d20528d67123c2c6046a6948 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 16 Jul 2018 14:22:07 +0200 Subject: [PATCH 0066/1162] Add note on sysconfig shell variables for Systemd to the Upgrading docs refs #6434 --- doc/16-upgrading-icinga-2.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 5f4a2fcef..870b09d69 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -24,6 +24,25 @@ numerous false-positive log messages and led to many support questions. v2.9.0 changes this in the standard way to read these variables from the environment, and use sane compile-time defaults. +> **Note** +> +> In order to upgrade, remove everything in the sysconfig file and re-apply +> your changes. + +There is a bug with existing sysconfig files where path variables are not expanded +because Systemd [does not support](https://github.com/systemd/systemd/issues/2123) +shell variable expansion. This worked with SysVInit though. + +Edit the sysconfig file and either remove everything, or edit this line +on RHEL 7. Modify the path for other distributions. + +``` +vim /etc/sysconfig/icinga2 + +-ICINGA2_PID_FILE=$ICINGA2_RUN_DIR/icinga2/icinga2.pid ++ICINGA2_PID_FILE=/run/icinga2/icinga2.pid +``` + If you want to adjust the number of open files for the Icinga application for example, you would just add this setting like this on RHEL 7: From a502e1a306871e7d46d7c0d44cd80a886d71e39b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 16 Jul 2018 16:44:47 +0200 Subject: [PATCH 0067/1162] Update tested Elasticsearch version --- doc/14-features.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/14-features.md b/doc/14-features.md index e895a0f38..378161acd 100644 --- a/doc/14-features.md +++ b/doc/14-features.md @@ -403,7 +403,10 @@ The check results include parsed performance data metrics if enabled. > **Note** > -> Elasticsearch 5.x or 6.x are required. This feature has been successfully tested with Elasticsearch 5.6.7 and 6.2.3. +> Elasticsearch 5.x or 6.x are required. This feature has been successfully tested with +> Elasticsearch 5.6.7 and 6.3.1. + + Enable the feature and restart Icinga 2. From 61ea81ab6e34e63319d8b5a4e042e5aea61dfe75 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 16 Jul 2018 17:00:39 +0200 Subject: [PATCH 0068/1162] Update AUTHORS --- .mailmap | 4 ++++ AUTHORS | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/.mailmap b/.mailmap index ab70551b8..bdb19d322 100644 --- a/.mailmap +++ b/.mailmap @@ -12,6 +12,10 @@ Jean Flach Jean Flach Markus Waldmüller Claudio Kuenzler +Carsten Köbke Carsten Koebke +Thomas Gelf +Michael Insel +Michael Insel diff --git a/AUTHORS b/AUTHORS index 7d85ded0d..7fce7ce2a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -4,6 +4,7 @@ Alexander A. Klimov Alexander Fuhr Alexander Schomburg Alexander Wirt +Andrea Kao Andreas Scherbaum Andres Ivanov Andrew Meyer @@ -47,7 +48,9 @@ Edvin Seferovic Eric Lippmann Evgeni Golov Ewoud Kohl van Wijngaarden +Fabian Röhl Federico Cuello +Federico Pires Ferdi Gueran Francesco Colista Gaël Beaudoin @@ -59,6 +62,7 @@ Glauco Vinicius Gunnar Beutner Hannes Happle Hannes Van de Vel +Harald Laabs Heike Jurzik Hendrik Röder Ian Kelling @@ -85,12 +89,13 @@ Konstantin Kelemen Kálmán Szalai - KAMI Lars Engels Lars Krüger +Leah Oswald Lee Clemens Lennart Betz -lihan Louis Sautier Luca Lesinigo Lucas Fairchild-Madar +Magnus Bäck Malte Rabenseifner Manuel Reiter Marcus van Dam @@ -112,9 +117,9 @@ Mhd Sulhan Micha Ahrweiler Michael Friedrich Michael Insel -Michael Insel Michael Kraus Michael Newton +Michal Moravec Mikesch-mp Mirco Bauer Mirko Nardin @@ -156,7 +161,8 @@ Steve McMaster Strajan Sebastian Ioan Strix <660956+MrStrix@users.noreply.github.com> Sven Nierlein -Thomas Gelf +T. Mulyana +Thomas Gelf Thomas Niedermeier Thomas Widhalm Tim Hardeck @@ -175,13 +181,18 @@ Yannick Charton Yohan Jarosz Zachary McGibbon Zoltan Nagy +akrus bascarsija cstegm ctrlaltca +fbachmann gitmopp +jre3brg krishna +lihan mocruz noobahoi <20069422+noobahoi@users.noreply.github.com> pv2b ryanohnemus +sah Élie Bouttier From c4c6f2064da8390d57a2e6d617570a239caa2441 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 17 Jul 2018 09:59:59 +0200 Subject: [PATCH 0069/1162] Revert "Fix obsolete parameter in Systemd script" This reverts commit 592fb22c7fe4d291e630a2b6126312d088ce60d7. We have the problem that Systemd doesn't expand shell variables into our environment. During the upgrade cycle this would maybe render a wrong PID file location, thus resulting in wrong 'safe-reload' behaviour. This is only for a clean upgrade path from 2.8.x to 2.9.0, the proper fix is to ensure that the sysconfig file is empty and keep our own defaults, or modified from the user. refs #6434 --- etc/initsystem/icinga2.service.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 27744e5aa..771c98f7b 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -5,10 +5,10 @@ After=syslog.target network-online.target postgresql.service mariadb.service car [Service] Type=notify EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ -ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs +ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon -e ${ICINGA2_ERROR_LOG} PIDFile=@ICINGA2_RUNDIR@/icinga2/icinga2.pid -ExecReload=@CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload +ExecReload=@CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload @ICINGA2_SYSCONFIGFILE@ TimeoutStartSec=30m # Systemd >228 enforces a lower process number for services. From 030afee8b04ab0016d97d4931225c24b6bf4d162 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 17 Jul 2018 14:23:20 +0200 Subject: [PATCH 0070/1162] Fix typo --- lib/cli/apisetuputility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 070e78cff..1b60a2c1a 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -171,7 +171,7 @@ bool ApiSetupUtility::SetupMasterApiUser() String tempFilename = Utility::CreateTempFile(apiUsersPath + ".XXXXXX", 0644, fp); fp << "/**\n" - << " * The APIUser objects are used for authentication against the API.\n" + << " * The ApiUser objects are used for authentication against the API.\n" << " */\n" << "object ApiUser \"" << api_username << "\" {\n" << " password = \"" << api_password << "\"\n" From 7593d15e95a7579e1f5e0f3fe24f7ffd53ffd9d0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 17 Jul 2018 14:27:32 +0200 Subject: [PATCH 0071/1162] Release version 2.9.0 Signed-off-by: Michael Friedrich --- .gitignore | 1 + CHANGELOG.md | 345 +++++++++++++++++++++++++++++++++++++++++++++++++++ RELEASE.md | 20 +-- VERSION | 2 +- 4 files changed, 357 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 0f798cb79..b3d357ecc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.patch *.playground .vagrant +tickets.pickle ## Build artifacts build/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a01c42c5..83cd848e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,350 @@ # Icinga 2.x CHANGELOG +## 2.9.0 (2018-07-17) + +### Notes + +- Elasticsearch 6 Support +- icinga health check supports minimum version parameter, ido thresholds for query rate, dummy check is executed in-memory, avoids plugin call +- `ApplicationVersion` constant in the configuration +- Setup wizards: global zone, disable conf.d inclusion, unified parameter handling +- TTL support for check results, pretty formatting for REST API queries +- TLS support for IDO PostgreSQL +- Improvements for check scheduling, concurrent checks with command endpoints, downtime notification handling, scheduled downtimes and memory handling with many API requests + +### Enhancement + +* [#6400](https://github.com/icinga/icinga2/issues/6400) (Plugins, Windows, PR): Enhance debug logging for check\_nscp\_api +* [#6321](https://github.com/icinga/icinga2/issues/6321) (Log, PR): Update log message for skipped certificate renewal +* [#6305](https://github.com/icinga/icinga2/issues/6305) (PR): Introduce the 'Environment' variable +* [#6299](https://github.com/icinga/icinga2/issues/6299) (Check Execution, Log, PR): Change log level for failed event command execution +* [#6285](https://github.com/icinga/icinga2/issues/6285) (CLI, Log, PR): Add support for config validation log timestamps +* [#6270](https://github.com/icinga/icinga2/issues/6270) (Configuration, PR): Add activation priority for config object types +* [#6236](https://github.com/icinga/icinga2/issues/6236) (DB IDO, PR): Add TLS support for DB IDO PostgreSQL feature +* [#6219](https://github.com/icinga/icinga2/issues/6219) (Elasticsearch, PR): Add support for Elasticsearch 6 +* [#6211](https://github.com/icinga/icinga2/issues/6211) (DB IDO): IDO pgsql with TLS support +* [#6209](https://github.com/icinga/icinga2/issues/6209) (CLI, PR): Unify zone name settings in node setup/wizard; add connection-less mode for node setup +* [#6208](https://github.com/icinga/icinga2/issues/6208) (CLI): Add connection-less support for node setup CLI command +* [#6206](https://github.com/icinga/icinga2/issues/6206) (Configuration, PR): Add ApplicationVersion built-in constant +* [#6205](https://github.com/icinga/icinga2/issues/6205) (API, PR): API: Unify verbose error messages +* [#6194](https://github.com/icinga/icinga2/issues/6194) (Elasticsearch, Graylog, PR): Elasticsearch/GELF: Add metric unit to performance data fields +* [#6170](https://github.com/icinga/icinga2/issues/6170) (Configuration, Windows, PR): Add option to windows installer to add global zones +* [#6158](https://github.com/icinga/icinga2/issues/6158) (API, Log): Review API debugging: verboseErrors and diagnostic information +* [#6136](https://github.com/icinga/icinga2/issues/6136) (Check Execution, PR): Add counter for current concurrent checks to Icinga check +* [#6131](https://github.com/icinga/icinga2/issues/6131) (Log, PR): Log which ticket was invalid on the master +* [#6109](https://github.com/icinga/icinga2/issues/6109) (Plugins, PR): Add 'used' feature to check\_memory +* [#6090](https://github.com/icinga/icinga2/issues/6090) (Notifications, PR): Fixed URL encoding for HOSTNAME and SERVICENAME in mail notification +* [#6078](https://github.com/icinga/icinga2/issues/6078) (Check Execution, PR): Add more metrics and details to built-in 'random' check +* [#6039](https://github.com/icinga/icinga2/issues/6039) (Configuration, PR): Improve location info for some error messages +* [#6033](https://github.com/icinga/icinga2/issues/6033) (Compat): Deprecate StatusDataWriter +* [#6032](https://github.com/icinga/icinga2/issues/6032) (Compat): Deprecate CompatLogger +* [#6010](https://github.com/icinga/icinga2/issues/6010) (Cluster, PR): Move the endpoint list into a new line for the 'cluster' check +* [#5996](https://github.com/icinga/icinga2/issues/5996) (PR): Add systemd watchdog and adjust reload behaviour +* [#5985](https://github.com/icinga/icinga2/issues/5985) (DB IDO, PR): Add query thresholds for the 'ido' check: Rate and pending queries +* [#5979](https://github.com/icinga/icinga2/issues/5979) (CLI, PR): Add quit, exit and help +* [#5973](https://github.com/icinga/icinga2/issues/5973) (API, Check Execution, PR): Add 'ttl' support for check result freshness via REST API +* [#5959](https://github.com/icinga/icinga2/issues/5959) (API, PR): API: Add 'pretty' parameter for beautified JSON response bodies +* [#5905](https://github.com/icinga/icinga2/issues/5905) (Elasticsearch): Add support for Elasticsearch 6 +* [#5888](https://github.com/icinga/icinga2/issues/5888) (DB IDO, PR): FindMySQL: Support mariadbclient implementation +* [#5877](https://github.com/icinga/icinga2/issues/5877) (API): Add pretty format to REST API parameters \(for debugging\) +* [#5811](https://github.com/icinga/icinga2/issues/5811) (CLI, PR): Update NodeName/ZoneName constants with 'api setup' +* [#5767](https://github.com/icinga/icinga2/issues/5767) (CLI, PR): Implement ability to make global zones configurable during node wizard/setup +* [#5733](https://github.com/icinga/icinga2/issues/5733) (Plugins, Windows, PR): Make --perf-syntax also change short message +* [#5729](https://github.com/icinga/icinga2/issues/5729) (CLI, Cluster, PR): Correct node wizard output formatting +* [#5675](https://github.com/icinga/icinga2/issues/5675) (InfluxDB, PR): Add pdv unit to influxdbwriter if not empty + doc +* [#5627](https://github.com/icinga/icinga2/issues/5627) (InfluxDB, Metrics): InfluxDBWriter: Send metric unit \(perfdata\) +* [#5605](https://github.com/icinga/icinga2/issues/5605) (CLI, Cluster, Configuration): Disable conf.d inclusion in node setup wizards +* [#5509](https://github.com/icinga/icinga2/issues/5509) (Cluster, wishlist): Add metrics about communication between endpoints +* [#5444](https://github.com/icinga/icinga2/issues/5444) (Cluster): Display endpoints in the second line of the ClusterCheckTask output +* [#5426](https://github.com/icinga/icinga2/issues/5426) (CLI, Configuration, PR): Add the ability to disable the conf.d inclusion through the node wizard +* [#5418](https://github.com/icinga/icinga2/issues/5418) (Plugins, Windows): Feature request: check\_perfmon.exe - Change name of counter in output +* [#4966](https://github.com/icinga/icinga2/issues/4966) (CLI, Cluster): Unify setting of master zones name +* [#4508](https://github.com/icinga/icinga2/issues/4508) (CLI): node wizard/setup: allow to disable conf.d inclusion +* [#3455](https://github.com/icinga/icinga2/issues/3455) (API, Log): startup.log in stage dir has no timestamps +* [#3245](https://github.com/icinga/icinga2/issues/3245) (CLI, help wanted, wishlist): Add option to Windows installer to add global zone during setup +* [#2287](https://github.com/icinga/icinga2/issues/2287) (help wanted, wishlist): Please support systemd startup notification + +### Bug + +* [#6429](https://github.com/icinga/icinga2/issues/6429) (PR): Make HttpServerConnection\#m\_DataHandlerMutex a boost::recursive\_mutex +* [#6428](https://github.com/icinga/icinga2/issues/6428) (API): Director kickstart wizard querying the API results in TLS stream disconnected infinite loop +* [#6411](https://github.com/icinga/icinga2/issues/6411) (Plugins, Windows, PR): Windows: Conform to the Plugin API spec for performance label quoting +* [#6407](https://github.com/icinga/icinga2/issues/6407) (Windows, PR): Fix wrong UOM in check\_uptime windows plugin +* [#6405](https://github.com/icinga/icinga2/issues/6405) (Windows, PR): TcpSocket\#Bind\(\): reuse socket addresses on Windows, too +* [#6403](https://github.com/icinga/icinga2/issues/6403) (API, PR): Conform to RFC for CRLF in HTTP requests +* [#6401](https://github.com/icinga/icinga2/issues/6401) (Elasticsearch, InfluxDB, PR): Fix connection error handling in Elasticsearch and InfluxDB features +* [#6397](https://github.com/icinga/icinga2/issues/6397) (Plugins, Windows, PR): TlsStream\#IsEof\(\): fix false positive EOF indicator +* [#6394](https://github.com/icinga/icinga2/issues/6394) (Crash, Elasticsearch): Icinga will throw an exception, if ElasticSearch is not reachable +* [#6393](https://github.com/icinga/icinga2/issues/6393) (API, Elasticsearch, PR): Stream\#ReadLine\(\): fix false positive buffer underflow indicator +* [#6387](https://github.com/icinga/icinga2/issues/6387) (Configuration, Crash, Windows, PR): Remove ApiUser password\_hash functionality +* [#6383](https://github.com/icinga/icinga2/issues/6383) (API, CLI, PR): HttpRequest\#ParseBody\(\): indicate success on complete body +* [#6378](https://github.com/icinga/icinga2/issues/6378) (Windows): Analyze Windows reload behaviour +* [#6371](https://github.com/icinga/icinga2/issues/6371) (API, Cluster, PR): ApiListener\#NewClientHandlerInternal\(\): Explicitly close the TLS stream on any failure +* [#6368](https://github.com/icinga/icinga2/issues/6368) (CLI, PR): Fix program option parsing +* [#6365](https://github.com/icinga/icinga2/issues/6365) (CLI): Different behavior between `icinga2 -V` and `icinga2 --version` +* [#6355](https://github.com/icinga/icinga2/issues/6355) (API): HTTP header size too low: Long URLs and session cookies cause bad requests +* [#6354](https://github.com/icinga/icinga2/issues/6354) (Elasticsearch): ElasticsearchWriter not writing to ES +* [#6336](https://github.com/icinga/icinga2/issues/6336) (Log, PR): Fix unnecessary blank in log message +* [#6324](https://github.com/icinga/icinga2/issues/6324) (Crash, PR): Ensure that password hash generation from OpenSSL is atomic +* [#6319](https://github.com/icinga/icinga2/issues/6319) (Windows): Windows service restart fails and config validate runs forever +* [#6297](https://github.com/icinga/icinga2/issues/6297) (Cluster, PR): Execute event commands only on actively checked host/service objects in an HA zone +* [#6294](https://github.com/icinga/icinga2/issues/6294) (API, Configuration, PR): Ensure that group memberships on API object creation are unique +* [#6292](https://github.com/icinga/icinga2/issues/6292) (Notifications, PR): Fix problem with reminder notifications if the checkable is flapping +* [#6290](https://github.com/icinga/icinga2/issues/6290) (OpenTSDB, PR): Fixed opentsdb metric name with colon chars +* [#6282](https://github.com/icinga/icinga2/issues/6282) (Configuration): Issue when using excludes in TimePeriod Objects +* [#6279](https://github.com/icinga/icinga2/issues/6279) (Crash): segfault with sha1\_block\_data\_order\_avx of libcrypto +* [#6255](https://github.com/icinga/icinga2/issues/6255) (Configuration): On debian based systems /etc/default/icinga2 is not read/used +* [#6242](https://github.com/icinga/icinga2/issues/6242) (Plugins, Windows): Sporadic check\_nscp\_api timeouts +* [#6239](https://github.com/icinga/icinga2/issues/6239) (Plugins, Windows, PR): Fix Windows check\_memory rounding +* [#6231](https://github.com/icinga/icinga2/issues/6231) (Notifications): icinga2.8 - Notifications are sent even in downtime +* [#6218](https://github.com/icinga/icinga2/issues/6218) (PR): attempt to fix issue \#5277 +* [#6217](https://github.com/icinga/icinga2/issues/6217) (Check Execution, PR): Fix check behavior on restart +* [#6204](https://github.com/icinga/icinga2/issues/6204) (API, PR): API: Check if objects exists and return proper error message +* [#6195](https://github.com/icinga/icinga2/issues/6195) (API, Crash, PR): Fix crash in remote api console +* [#6193](https://github.com/icinga/icinga2/issues/6193) (Crash, Graylog, PR): GelfWriter: Fix crash on invalid performance data metrics +* [#6184](https://github.com/icinga/icinga2/issues/6184) (API): debug console with API connection sometimes hangs since 2.8.2 +* [#6125](https://github.com/icinga/icinga2/issues/6125) (Configuration, PR): Fix description of the NotificationComponent in notification.conf +* [#6077](https://github.com/icinga/icinga2/issues/6077) (API, PR): Allow to pass raw performance data in 'process-check-result' API action +* [#6057](https://github.com/icinga/icinga2/issues/6057) (Notifications): Icinga2 sends notifications without logging about it and despite having a downtime +* [#6020](https://github.com/icinga/icinga2/issues/6020) (CLI, PR): Fix crash when running 'icinga2 console' without HOME environment variable +* [#6019](https://github.com/icinga/icinga2/issues/6019): icinga2 console -r crashes when run without a HOME environment variable +* [#6016](https://github.com/icinga/icinga2/issues/6016) (Notifications, PR): Check notification state filters for problems only, not for Custom, etc. +* [#5988](https://github.com/icinga/icinga2/issues/5988) (Check Execution, Cluster, PR): Fix concurrent checks limit while using command\_endpoint +* [#5964](https://github.com/icinga/icinga2/issues/5964) (Metrics, OpenTSDB, PR): OpenTSDB writer - Fix function for escaping host tag chars. +* [#5963](https://github.com/icinga/icinga2/issues/5963) (Metrics, OpenTSDB): OpenTSDB writer is escaping wrong chars for host names. +* [#5952](https://github.com/icinga/icinga2/issues/5952) (Notifications): Custom notifications are filtered by object state +* [#5940](https://github.com/icinga/icinga2/issues/5940) (PR): Remove deprecated Chocolatey functions +* [#5928](https://github.com/icinga/icinga2/issues/5928) (PR): Fix build problem with MSVC +* [#5908](https://github.com/icinga/icinga2/issues/5908) (Windows): Icinga2 fails to build on Windows +* [#5901](https://github.com/icinga/icinga2/issues/5901) (PR): Do not replace colons in plugin output +* [#5885](https://github.com/icinga/icinga2/issues/5885) (PR): Workaround for GCC bug 61321 +* [#5884](https://github.com/icinga/icinga2/issues/5884): Icinga2 fails to build +* [#5872](https://github.com/icinga/icinga2/issues/5872) (PR): Replace incorrect fclose\(\) call with pclose\(\) +* [#5863](https://github.com/icinga/icinga2/issues/5863) (PR): Fix glob error handling +* [#5861](https://github.com/icinga/icinga2/issues/5861) (PR): Fix incorrect memory access +* [#5860](https://github.com/icinga/icinga2/issues/5860) (PR): Fix memory leaks in the unit tests +* [#5853](https://github.com/icinga/icinga2/issues/5853) (Plugins, Windows, PR): Fix missing space in check\_service output +* [#5840](https://github.com/icinga/icinga2/issues/5840) (Elasticsearch, PR): Fix newline terminator for bulk requests in ElasticsearchWriter +* [#5796](https://github.com/icinga/icinga2/issues/5796) (CLI, PR): Fix error reporting for 'icinga2 console -r' +* [#5795](https://github.com/icinga/icinga2/issues/5795) (Elasticsearch): ElasticsearchWriter gives "Unexpected response code 400" with Elasticsearch 6.x +* [#5763](https://github.com/icinga/icinga2/issues/5763) (API): "icinga2 api setup" should explicitly set the NodeName constant in constants.conf +* [#5753](https://github.com/icinga/icinga2/issues/5753) (API, Cluster, Metrics, PR): Fix that RingBuffer does not get updated and add metrics about communication between endpoints +* [#5718](https://github.com/icinga/icinga2/issues/5718) (API, PR): API: Fix http status codes +* [#5550](https://github.com/icinga/icinga2/issues/5550) (API): Verify error codes and returned log messages in API actions +* [#5277](https://github.com/icinga/icinga2/issues/5277) (Notifications): Flexible downtime is expired at end\_time, not trigger\_time+duration +* [#5095](https://github.com/icinga/icinga2/issues/5095) (API): Wrong HTTP status code when API request fails +* [#5083](https://github.com/icinga/icinga2/issues/5083) (Check Execution): Initial checks are not executed immediately +* [#4786](https://github.com/icinga/icinga2/issues/4786) (API): API: Command process-check-result fails if it contains performance data +* [#4785](https://github.com/icinga/icinga2/issues/4785) (Compat): Semicolons in plugin output are converted to colon +* [#4732](https://github.com/icinga/icinga2/issues/4732) (API, Configuration): Duplicate groups allowed when creating host +* [#4436](https://github.com/icinga/icinga2/issues/4436) (Check Execution): New objects not scheduled to check immediately +* [#4272](https://github.com/icinga/icinga2/issues/4272) (Cluster, Configuration): Duplicating downtime from ScheduledDowntime object on each restart +* [#3431](https://github.com/icinga/icinga2/issues/3431) (Cluster): Eventhandler trigger on all endpoints in high available zone + +### ITL + +* [#6389](https://github.com/icinga/icinga2/issues/6389) (ITL, PR): New ITL command nscp-local-tasksched +* [#6348](https://github.com/icinga/icinga2/issues/6348) (ITL, PR): Fix for catalogued locally databases. Fixes \#6338 +* [#6338](https://github.com/icinga/icinga2/issues/6338) (ITL): db2\_health not working with catalogued databases, as --hostname is always used +* [#6308](https://github.com/icinga/icinga2/issues/6308) (ITL, PR): Update lsi-raid ITL command +* [#6263](https://github.com/icinga/icinga2/issues/6263) (ITL, PR): ITL: Add default thresholds to windows check commands +* [#6139](https://github.com/icinga/icinga2/issues/6139) (ITL, PR): itl/disk: Ignore overlay and netfs filesystems +* [#6045](https://github.com/icinga/icinga2/issues/6045) (ITL, PR): Move the "passive" check command to command-icinga.conf +* [#6043](https://github.com/icinga/icinga2/issues/6043) (ITL): ITL "plugins" has an implicit dependency on "itl" +* [#6034](https://github.com/icinga/icinga2/issues/6034) (ITL, PR): ITL by\_ssh add -E parameter +* [#5958](https://github.com/icinga/icinga2/issues/5958) (ITL, PR): Add minimum version check to the built-in icinga command +* [#5954](https://github.com/icinga/icinga2/issues/5954) (ITL, PR): ITL: Add mongodb --authdb parameter support +* [#5951](https://github.com/icinga/icinga2/issues/5951) (ITL, PR): itl: Add command parameters for snmp-memory +* [#5921](https://github.com/icinga/icinga2/issues/5921) (ITL, PR): Add icingacli-director check to ITL +* [#5920](https://github.com/icinga/icinga2/issues/5920) (ITL): Add Check for Director Jobs to ITL +* [#5914](https://github.com/icinga/icinga2/issues/5914) (ITL, PR): Fix for wrong attribute in ITL mongodb CheckCommand +* [#5906](https://github.com/icinga/icinga2/issues/5906) (ITL, PR): Add check\_openmanage command to ITL. +* [#5902](https://github.com/icinga/icinga2/issues/5902) (ITL, PR): Add parameter --octetlength to snmp-storage command. +* [#5817](https://github.com/icinga/icinga2/issues/5817) (ITL): mongodb\_address vs mongodb\_host +* [#5812](https://github.com/icinga/icinga2/issues/5812) (ITL): Better way to check required parameters in notification scripts +* [#5805](https://github.com/icinga/icinga2/issues/5805) (ITL, PR): Add support for LD\_LIBRARY\_PATH env variable in oracle\_health ITL CheckCommand +* [#5792](https://github.com/icinga/icinga2/issues/5792) (ITL, PR): ITL: Add check\_rpc +* [#5787](https://github.com/icinga/icinga2/issues/5787) (Check Execution, ITL): random check should provide performance data metrics +* [#5744](https://github.com/icinga/icinga2/issues/5744) (Check Execution, ITL, PR): Implement DummyCheckTask and move dummy into embedded in-memory checks +* [#5717](https://github.com/icinga/icinga2/issues/5717) (ITL, PR): add order tags to disk check +* [#5714](https://github.com/icinga/icinga2/issues/5714) (ITL): disk check in icinga2/itl/command-plugins.conf lacks order tags +* [#5260](https://github.com/icinga/icinga2/issues/5260) (ITL): CheckCommand mongodb does not expose authdb option + +### Documentation + +* [#6436](https://github.com/icinga/icinga2/issues/6436) (Documentation, PR): Update tested Elasticsearch version +* [#6435](https://github.com/icinga/icinga2/issues/6435) (Documentation, PR): Add note on sysconfig shell variables for Systemd to the Upgrading docs +* [#6433](https://github.com/icinga/icinga2/issues/6433) (Documentation, PR): Docs: Fix typos in 03-monitoring-basics.md +* [#6426](https://github.com/icinga/icinga2/issues/6426) (Documentation, PR): Update 'Upgrading to 2.9' docs +* [#6413](https://github.com/icinga/icinga2/issues/6413) (Documentation, PR): Fix table in Livestatus Filters +* [#6391](https://github.com/icinga/icinga2/issues/6391) (Documentation, PR): Docs: Fix icinga.com link +* [#6390](https://github.com/icinga/icinga2/issues/6390) (Documentation, Windows, PR): Docs: Update Windows wizard images +* [#6375](https://github.com/icinga/icinga2/issues/6375) (Documentation, PR): some minor fixes in the flapping documentation +* [#6374](https://github.com/icinga/icinga2/issues/6374) (Documentation, PR): Docs: Add an additional note for VMWare timeouts on Ubuntu 16.04 LTS +* [#6373](https://github.com/icinga/icinga2/issues/6373) (Documentation, PR): Drop command template imports for versions \< 2.6 in the docs +* [#6372](https://github.com/icinga/icinga2/issues/6372) (Documentation, PR): Remove the import of 'legacy-timeperiod' in the docs +* [#6350](https://github.com/icinga/icinga2/issues/6350) (Documentation, PR): clarify the permision system of the api in the docs +* [#6344](https://github.com/icinga/icinga2/issues/6344) (Documentation, PR): README: Fix broken community link +* [#6330](https://github.com/icinga/icinga2/issues/6330) (Documentation, PR): Fix $ipaddress6$ attribute name typo in the docs +* [#6317](https://github.com/icinga/icinga2/issues/6317) (Documentation, PR): Add a note on Windows NSClient++ CPU checks to the docs +* [#6289](https://github.com/icinga/icinga2/issues/6289) (Documentation, PR): Update release documentation with git tag signing key configuration +* [#6286](https://github.com/icinga/icinga2/issues/6286) (Documentation): Update Windows wizard screenshots in the docs +* [#6283](https://github.com/icinga/icinga2/issues/6283) (Documentation, PR): edit Icinga license info so that GitHub recognizes it +* [#6271](https://github.com/icinga/icinga2/issues/6271) (Documentation, PR): Enhance advanced topics with \(scheduled\) downtimes +* [#6267](https://github.com/icinga/icinga2/issues/6267) (Documentation, PR): Update docs to reflect required user\* attributes for notification objects +* [#6265](https://github.com/icinga/icinga2/issues/6265) (Documentation): Notifications user/user\_groups required +* [#6264](https://github.com/icinga/icinga2/issues/6264) (Documentation, PR): Enhance "Getting Started" chapter +* [#6262](https://github.com/icinga/icinga2/issues/6262) (Documentation, PR): Enhance the environment variables chapter +* [#6254](https://github.com/icinga/icinga2/issues/6254) (Documentation, PR): Enhance release documentation +* [#6253](https://github.com/icinga/icinga2/issues/6253) (Documentation, PR): Doc: Add note for not fully supported Plugin collections +* [#6243](https://github.com/icinga/icinga2/issues/6243) (Documentation, PR): Update PostgreSQL documentation +* [#6226](https://github.com/icinga/icinga2/issues/6226) (Documentation, PR): Fix broken SELinux anchor in the documentation +* [#6224](https://github.com/icinga/icinga2/issues/6224) (Documentation, PR): Update volatile docs +* [#6216](https://github.com/icinga/icinga2/issues/6216) (Documentation): Volatile service explanation +* [#6180](https://github.com/icinga/icinga2/issues/6180) (Documentation, PR): Doc: fixed wrong information about defaulting +* [#6128](https://github.com/icinga/icinga2/issues/6128) (Documentation, PR): Adding documentation for configurable global zones during setup +* [#6067](https://github.com/icinga/icinga2/issues/6067) (Documentation, Windows, PR): Improve Windows builds and testing +* [#6022](https://github.com/icinga/icinga2/issues/6022) (Configuration, Documentation, PR): Update default config and documentation for the "library" keyword +* [#6018](https://github.com/icinga/icinga2/issues/6018) (Documentation): Move init configuration from getting-started +* [#6000](https://github.com/icinga/icinga2/issues/6000) (Documentation, PR): Add newline to COPYING to fix Github license detection +* [#5948](https://github.com/icinga/icinga2/issues/5948) (Documentation, PR): doc: Improve INSTALL documentation +* [#4958](https://github.com/icinga/icinga2/issues/4958) (Check Execution, Documentation): How to set the HOME environment variable + +### Support + +* [#6439](https://github.com/icinga/icinga2/issues/6439) (PR): Revert "Fix obsolete parameter in Systemd script" +* [#6423](https://github.com/icinga/icinga2/issues/6423) (PR): Fix missing next check update causing the scheduler to execute checks too often +* [#6421](https://github.com/icinga/icinga2/issues/6421) (Check Execution): High CPU load due to seemingly ignored check\_interval +* [#6412](https://github.com/icinga/icinga2/issues/6412) (Plugins, Windows, PR): Fix output formatting in windows plugins +* [#6402](https://github.com/icinga/icinga2/issues/6402) (Cluster, code-quality, PR): Use SSL\_pending\(\) for remaining TLS stream data +* [#6384](https://github.com/icinga/icinga2/issues/6384) (PR): Remove leftover for sysconfig file parsing +* [#6381](https://github.com/icinga/icinga2/issues/6381) (Packages, PR): Fix sysconfig not being handled correctly by sysvinit +* [#6377](https://github.com/icinga/icinga2/issues/6377) (code-quality, PR): Fix missing name for workqueue while creating runtime objects via API +* [#6364](https://github.com/icinga/icinga2/issues/6364) (code-quality): lib/base/workqueue.cpp:212: assertion failed: !m\_Name.IsEmpty\(\) +* [#6361](https://github.com/icinga/icinga2/issues/6361) (API, Cluster): Analyse socket IO handling with HTTP/JSON-RPC +* [#6359](https://github.com/icinga/icinga2/issues/6359) (Configuration, PR): Fix ScheduledDowntimes replicating on restart +* [#6357](https://github.com/icinga/icinga2/issues/6357) (API, PR): Increase header size to 8KB for HTTP requests +* [#6347](https://github.com/icinga/icinga2/issues/6347) (Packages, PR): SELinux: Allow notification plugins to read local users +* [#6343](https://github.com/icinga/icinga2/issues/6343) (Check Execution, Cluster, PR): Fix that checks with command\_endpoint don't return any check results +* [#6337](https://github.com/icinga/icinga2/issues/6337): Checks via command\_endpoint are not executed \(snapshot packages only\) +* [#6328](https://github.com/icinga/icinga2/issues/6328) (Installation, Packages, PR): Rework sysconfig file/startup environment +* [#6320](https://github.com/icinga/icinga2/issues/6320) (PR): Ensure that icinga\_min\_version parameter is optional +* [#6309](https://github.com/icinga/icinga2/issues/6309) (PR): Fix compiler warning in checkercomponent.ti +* [#6306](https://github.com/icinga/icinga2/issues/6306) (code-quality, PR): Adjust message for CheckResultReader deprecation +* [#6301](https://github.com/icinga/icinga2/issues/6301) (Documentation, code-quality, PR): Adjust deprecation removal for compat features +* [#6295](https://github.com/icinga/icinga2/issues/6295) (Compat, PR): Deprecate compatlog feature +* [#6238](https://github.com/icinga/icinga2/issues/6238) (Notifications, PR): Implement better way to check parameters in notification scripts +* [#6233](https://github.com/icinga/icinga2/issues/6233) (Check Execution): Verify next check execution on daemon reload +* [#6229](https://github.com/icinga/icinga2/issues/6229) (Packages, PR): Don't use shell variables in sysconfig +* [#6214](https://github.com/icinga/icinga2/issues/6214) (Packages): Reload-internal with unresolved shell variable +* [#6201](https://github.com/icinga/icinga2/issues/6201) (Windows, PR): Handle exceptions from X509Certificate2 +* [#6199](https://github.com/icinga/icinga2/issues/6199) (API, PR): Return 500 when no api action is successful +* [#6198](https://github.com/icinga/icinga2/issues/6198) (Compat, PR): Deprecate Statusdatawriter +* [#6187](https://github.com/icinga/icinga2/issues/6187) (code-quality, PR): Remove Icinga Studio Screenshots +* [#6181](https://github.com/icinga/icinga2/issues/6181) (Tests, PR): tests: Ensure IcingaApplication is initialized before adding config +* [#6174](https://github.com/icinga/icinga2/issues/6174) (API, PR): Fix crash without CORS setting +* [#6173](https://github.com/icinga/icinga2/issues/6173) (API, Crash): Using the API crashes Icinga2 in v2.8.1-537-g064fc80 +* [#6171](https://github.com/icinga/icinga2/issues/6171) (code-quality, PR): Update copyright of the Windows Agent to 2018 +* [#6163](https://github.com/icinga/icinga2/issues/6163) (PR): Fix reload handling by updating the PID file before process overtake +* [#6160](https://github.com/icinga/icinga2/issues/6160) (code-quality, PR): Replace std::vector:push\_back calls with initializer list +* [#6126](https://github.com/icinga/icinga2/issues/6126) (PR): Require systemd headers +* [#6113](https://github.com/icinga/icinga2/issues/6113) (Tests, PR): appveyor: Disable artifacts until we use them +* [#6107](https://github.com/icinga/icinga2/issues/6107) (code-quality, PR): Allow MYSQL\_LIB to be specified by ENV variable +* [#6105](https://github.com/icinga/icinga2/issues/6105) (Tests): Snapshot builds fail on livestatus tests +* [#6098](https://github.com/icinga/icinga2/issues/6098) (API, code-quality, PR): Clean up CORS implementation +* [#6085](https://github.com/icinga/icinga2/issues/6085) (Cluster, Crash, PR): Fix crash with anonymous clients on certificate signing request and storing sent bytes +* [#6083](https://github.com/icinga/icinga2/issues/6083) (Log, code-quality, PR): Fix wrong type logging in ConfigItem::Commit +* [#6082](https://github.com/icinga/icinga2/issues/6082) (Installation, Packages): PID file removed after reload +* [#6063](https://github.com/icinga/icinga2/issues/6063) (Compat, PR): Deprecate CheckResultReader +* [#6062](https://github.com/icinga/icinga2/issues/6062) (code-quality, PR): Remove the obsolete 'make-agent-config.py' script +* [#6061](https://github.com/icinga/icinga2/issues/6061) (code-quality, PR): Remove jenkins test scripts +* [#6060](https://github.com/icinga/icinga2/issues/6060) (code-quality, PR): Remove Icinga development docker scripts +* [#6059](https://github.com/icinga/icinga2/issues/6059) (code-quality, PR): Remove Icinga Studio +* [#6058](https://github.com/icinga/icinga2/issues/6058) (code-quality, PR): Clean up the Icinga plugins a bit +* [#6055](https://github.com/icinga/icinga2/issues/6055) (Check Execution, Windows, code-quality, PR): methods: Remove unused clrchecktask feature +* [#6054](https://github.com/icinga/icinga2/issues/6054) (Check Execution, Windows, code-quality): Remove unused clrchecktask +* [#6051](https://github.com/icinga/icinga2/issues/6051) (code-quality, PR): Set FOLDER cmake property for the icingaloader target +* [#6050](https://github.com/icinga/icinga2/issues/6050) (code-quality, PR): Replace boost::algorithm::split calls with String::Split +* [#6044](https://github.com/icinga/icinga2/issues/6044) (code-quality, PR): Implement support for frozen arrays and dictionaries +* [#6038](https://github.com/icinga/icinga2/issues/6038) (PR): Fix missing include for boost::split +* [#6037](https://github.com/icinga/icinga2/issues/6037) (PR): Fix build error on Windows +* [#6029](https://github.com/icinga/icinga2/issues/6029) (code-quality, PR): Remove duplicate semicolons +* [#6028](https://github.com/icinga/icinga2/issues/6028) (Packages): python notification not running when icinga ran as a service +* [#6026](https://github.com/icinga/icinga2/issues/6026) (Check Execution, Windows, PR): Fix flapping support for Windows +* [#6025](https://github.com/icinga/icinga2/issues/6025) (Windows): Implement Flapping on Windows +* [#6023](https://github.com/icinga/icinga2/issues/6023): Icinga should check whether the libsystemd library is available +* [#6017](https://github.com/icinga/icinga2/issues/6017) (PR): Remove build breaking include +* [#6015](https://github.com/icinga/icinga2/issues/6015) (code-quality, PR): Fix whitespaces in CMakeLists files +* [#6009](https://github.com/icinga/icinga2/issues/6009) (PR): Build fix for ancient versions of GCC +* [#6008](https://github.com/icinga/icinga2/issues/6008) (PR): Fix compatibility with CMake \< 3.1 +* [#6007](https://github.com/icinga/icinga2/issues/6007) (PR): Fix missing include +* [#6005](https://github.com/icinga/icinga2/issues/6005) (PR): Fix incorrect dependencies for mkunity targets +* [#5999](https://github.com/icinga/icinga2/issues/5999) (PR): Build fix +* [#5998](https://github.com/icinga/icinga2/issues/5998) (code-quality, PR): Build all remaining libraries as object libraries +* [#5997](https://github.com/icinga/icinga2/issues/5997) (PR): Use gcc-ar and gcc-ranlib when building with -flto +* [#5994](https://github.com/icinga/icinga2/issues/5994) (InfluxDB, PR): InfluxDBWriter: Fix macro in template +* [#5993](https://github.com/icinga/icinga2/issues/5993) (code-quality, PR): Use CMake object libraries for our libs +* [#5992](https://github.com/icinga/icinga2/issues/5992) (code-quality, PR): Remove unused includes +* [#5984](https://github.com/icinga/icinga2/issues/5984) (DB IDO, PR): Fix missing static libraries for DB IDO +* [#5983](https://github.com/icinga/icinga2/issues/5983) (code-quality, PR): Use initializer lists for arrays and dictionaries +* [#5980](https://github.com/icinga/icinga2/issues/5980) (code-quality, PR): Explicitly pass 1 or 0 for notification filters in DB IDO +* [#5974](https://github.com/icinga/icinga2/issues/5974) (PR): Fix non-unity builds with the icinga check +* [#5971](https://github.com/icinga/icinga2/issues/5971) (code-quality, PR): Remove libdemo and libhello +* [#5970](https://github.com/icinga/icinga2/issues/5970) (code-quality, PR): Allocate ConfigItemBuilder objects on the stack +* [#5969](https://github.com/icinga/icinga2/issues/5969) (code-quality, PR): Remove the WorkQueue::m\_StatsMutex instance variable +* [#5968](https://github.com/icinga/icinga2/issues/5968) (code-quality, PR): Update the RingBuffer class to use a regular mutex instead of ObjectLock +* [#5967](https://github.com/icinga/icinga2/issues/5967) (code-quality, PR): Avoid accessing attributes for validators where not necessary +* [#5965](https://github.com/icinga/icinga2/issues/5965) (code-quality, PR): Avoid unnecessary casts in the JSON encoder +* [#5961](https://github.com/icinga/icinga2/issues/5961) (PR): Fix macro warning from the icinga check +* [#5960](https://github.com/icinga/icinga2/issues/5960): Macro warning from the icinga check +* [#5957](https://github.com/icinga/icinga2/issues/5957) (code-quality, PR): Change a bunch more copyright headers for 2018 +* [#5955](https://github.com/icinga/icinga2/issues/5955) (Configuration, code-quality, PR): Avoid mutex contention in the config parser +* [#5946](https://github.com/icinga/icinga2/issues/5946) (code-quality, PR): Use clang-tidy to add some more C++11 features +* [#5945](https://github.com/icinga/icinga2/issues/5945) (code-quality, PR): Fix incorrect indentation for code generated by mkclass +* [#5944](https://github.com/icinga/icinga2/issues/5944) (code-quality, PR): Add the final keyword to classes +* [#5939](https://github.com/icinga/icinga2/issues/5939) (PR): Build fix for Debian wheezy +* [#5937](https://github.com/icinga/icinga2/issues/5937) (code-quality, PR): Remove inline methods and use explicit template instantiation to minimize the number of weak symbols +* [#5936](https://github.com/icinga/icinga2/issues/5936) (code-quality, PR): Clean up source lists in the CMakeLists.txt files +* [#5935](https://github.com/icinga/icinga2/issues/5935) (code-quality, PR): Implement support for precompiled headers +* [#5934](https://github.com/icinga/icinga2/issues/5934) (code-quality, PR): Add more include/library paths for MySQL and PostgreSQL +* [#5933](https://github.com/icinga/icinga2/issues/5933) (code-quality, PR): Change copyright headers for 2018 +* [#5932](https://github.com/icinga/icinga2/issues/5932) (code-quality, PR): Fix copyright header in cli/troubleshootcommand.hpp +* [#5931](https://github.com/icinga/icinga2/issues/5931) (code-quality, PR): Improve detection for linker flags +* [#5930](https://github.com/icinga/icinga2/issues/5930) (code-quality, PR): Replace boost::function with std::function +* [#5929](https://github.com/icinga/icinga2/issues/5929) (code-quality, PR): Get rid of boost::assign::list\_of in mkclass +* [#5927](https://github.com/icinga/icinga2/issues/5927) (code-quality, PR): Build libraries as static libraries +* [#5909](https://github.com/icinga/icinga2/issues/5909) (code-quality, PR): WIP: Improve build times +* [#5903](https://github.com/icinga/icinga2/issues/5903) (code-quality, PR): Cleanup CompatUtility class and features +* [#5897](https://github.com/icinga/icinga2/issues/5897) (code-quality, PR): Remove unnecessary inline statements +* [#5894](https://github.com/icinga/icinga2/issues/5894) (code-quality, PR): Remove string\_iless +* [#5891](https://github.com/icinga/icinga2/issues/5891) (code-quality, PR): Update .gitignore +* [#5889](https://github.com/icinga/icinga2/issues/5889) (code-quality, PR): execvpe: Fixup indention for readability +* [#5887](https://github.com/icinga/icinga2/issues/5887) (PR): Windows build fix +* [#5886](https://github.com/icinga/icinga2/issues/5886) (code-quality): Remove unnecessary 'inline' keyword +* [#5882](https://github.com/icinga/icinga2/issues/5882) (code-quality, PR): Avoid unnecessary allocations +* [#5871](https://github.com/icinga/icinga2/issues/5871) (code-quality, PR): Unit tests for the LegacyTimePeriod class +* [#5868](https://github.com/icinga/icinga2/issues/5868) (Configuration, code-quality, PR): Use std::unique\_ptr for Expression objects +* [#5865](https://github.com/icinga/icinga2/issues/5865) (code-quality, PR): Add missing initializer in Utility::NewUniqueID\(\) +* [#5862](https://github.com/icinga/icinga2/issues/5862) (code-quality, PR): Replace a few more NULLs with nullptr +* [#5858](https://github.com/icinga/icinga2/issues/5858) (Tests, code-quality, PR): Travis: Add support for Coverity +* [#5857](https://github.com/icinga/icinga2/issues/5857) (code-quality, PR): Fix compiler warnings +* [#5855](https://github.com/icinga/icinga2/issues/5855) (PR): Fix build problems with Visual Studio 2017 +* [#5848](https://github.com/icinga/icinga2/issues/5848) (code-quality, PR): Fix COPYING format +* [#5846](https://github.com/icinga/icinga2/issues/5846) (code-quality, PR): Fix compiler warnings +* [#5831](https://github.com/icinga/icinga2/issues/5831) (Check Execution, Configuration): No checks were launched on snapshot version 2.8.0.71 \(RHEL6\) +* [#5827](https://github.com/icinga/icinga2/issues/5827) (code-quality, PR): Replace StatsFunction with Function +* [#5825](https://github.com/icinga/icinga2/issues/5825) (code-quality, PR): Replace boost::assign::list\_of with initializer lists +* [#5824](https://github.com/icinga/icinga2/issues/5824) (code-quality, PR): Replace a few Boost features with equivalent C++11 features +* [#5821](https://github.com/icinga/icinga2/issues/5821) (Packages, Windows): check\_disk build error +* [#5819](https://github.com/icinga/icinga2/issues/5819) (code-quality, PR): Avoid unnecessary allocations in the FunctionCallExpression class +* [#5816](https://github.com/icinga/icinga2/issues/5816) (code-quality, PR): Re-implement WrapFunction\(\) using C++11 features +* [#5809](https://github.com/icinga/icinga2/issues/5809) (Documentation, Installation, PR): Raise required OpenSSL version to 1.0.1 +* [#5758](https://github.com/icinga/icinga2/issues/5758) (Documentation, Packages): Completely remove the spec file from the icinga2 repository +* [#5743](https://github.com/icinga/icinga2/issues/5743) (CLI, Configuration, Installation): node setup: Deprecate --master\_host and use --parent\_host instead +* [#5725](https://github.com/icinga/icinga2/issues/5725) (code-quality, PR): Use real UUIDs for Utility::NewUniqueID +* [#5388](https://github.com/icinga/icinga2/issues/5388) (Packages, PR): Handle mis-detection with clang on RHEL/CentOS 7 +* [#3246](https://github.com/icinga/icinga2/issues/3246) (Installation): Add option to windows installer to disable inclusion of conf.d directory + ## 2.8.4 (2018-04-25) ### Bug diff --git a/RELEASE.md b/RELEASE.md index 44a32cfa3..d446c7007 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.8.3 +VERSION=2.9.0 ``` Add your signing key to your Git configuration file, if not already there. @@ -159,12 +159,12 @@ sed -i "s/Version: .*/Version: $VERSION/g" icinga2.spec vim icinga2.spec %changelog -* Tue Apr 24 2018 Jean Flach 2.8.3-1 -- Update to 2.8.3 +* Tue Jul 17 2018 Michael Friedrich 2.9.0-1 +- Update to 2.9.0 ``` ``` -git commit -av -m "Release 2.8.3-1" +git commit -av -m "Release 2.9.0-1" git push ``` @@ -200,16 +200,16 @@ git checkout release && git pull Set the `Version`, `Revision` and `changelog` inside the spec file. ``` -./dch 2.8.3-1 "Update to 2.8.3" +./dch 2.9.0-1 "Update to 2.9.0" ``` ``` -git commit -av -m "Release 2.8.3-1" +git commit -av -m "Release 2.9.0-1" git push ``` ``` -git commit -av -m "Release 2.8.3-1" +git commit -av -m "Release 2.9.0-1" ``` **Note for major releases**: Update release branch to latest. @@ -225,13 +225,13 @@ git commit -av -m "Release 2.8.3-1" docker run -v `pwd`:/mnt/packaging -ti ubuntu:xenial bash apt-get update -apt-get install git dev-tools vim +apt-get install git ubuntu-dev-tools vim cd /mnt/packaging git config --global user.name "Michael Friedrich" git config --global user.email "michael.friedrich@icinga.com" -./dch 2.8.3-1 "Update to 2.8.3" +./dch 2.9.0-1 "Update to 2.9.0" ``` @@ -277,7 +277,7 @@ cpack Install the created icinga2 package locally: ``` -choco install icinga2 -version 2.8.3 -fdv "%cd%" -source "'%cd%;https://chocolatey.org/api/v2/'" +choco install icinga2 -version 2.9.0 -fdv "%cd%" -source "'%cd%;https://chocolatey.org/api/v2/'" ``` Upload the package to [chocolatey](https://chocolatey.org/packages/upload). diff --git a/VERSION b/VERSION index 0abdb3cf0..7be4b3e01 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.8.4 +Version: 2.9.0 Revision: 1 From 4c803db80c65b276dd14fcbeb70b8dec41eb1178 Mon Sep 17 00:00:00 2001 From: Dirk Goetz Date: Wed, 18 Jul 2018 06:49:24 +0000 Subject: [PATCH 0072/1162] SELinux: allow systemd notify fixes #6443 --- tools/selinux/icinga2.te | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/selinux/icinga2.te b/tools/selinux/icinga2.te index 19e99c69d..1eea26a10 100644 --- a/tools/selinux/icinga2.te +++ b/tools/selinux/icinga2.te @@ -1,4 +1,4 @@ -policy_module(icinga2, 0.1.6) +policy_module(icinga2, 0.1.7) ######################################## # @@ -122,6 +122,7 @@ corecmd_exec_bin(icinga2_t) kernel_read_system_state(icinga2_t) kernel_read_network_state(icinga2_t) +kernel_dgram_send(icinga2_t) # should be moved to nagios_plugin_template in nagios.if icinga2_execstrans(nagios_admin_plugin_exec_t, nagios_admin_plugin_t) From 92056c592ed4cee6cd1949d76fbbd81cde7b3173 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 18 Jul 2018 13:35:27 +0200 Subject: [PATCH 0073/1162] Use . instead of source fixes #6450 --- etc/initsystem/prepare-dirs.cmake | 2 +- etc/initsystem/safe-reload.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake index d9b644b7a..ce155424d 100644 --- a/etc/initsystem/prepare-dirs.cmake +++ b/etc/initsystem/prepare-dirs.cmake @@ -6,7 +6,7 @@ # Load sysconf on systems where the initsystem does not pass the environment if [ "$1" != "" ]; then if [ -r "$1" ]; then - source "$1" + . "$1" else echo "Unable to read sysconf from '$1'. Exiting." && exit 6 fi diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake index 44b261eae..c42994a30 100644 --- a/etc/initsystem/safe-reload.cmake +++ b/etc/initsystem/safe-reload.cmake @@ -3,7 +3,7 @@ # Load sysconf on systems where the initsystem does not pass the environment if [ "$1" != "" ]; then if [ -r "$1" ]; then - source "$1" + . "$1" else echo "Unable to read sysconf from '$1'. Exiting." && exit 6 fi From 383ca5011cf6e29461f908083671826991a542c5 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 18 Jul 2018 13:36:37 +0200 Subject: [PATCH 0074/1162] Load functions first refs #6449 --- etc/initsystem/icinga2.init.d.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/etc/initsystem/icinga2.init.d.cmake b/etc/initsystem/icinga2.init.d.cmake index c37977f57..f0698726f 100644 --- a/etc/initsystem/icinga2.init.d.cmake +++ b/etc/initsystem/icinga2.init.d.cmake @@ -15,6 +15,13 @@ # Description: Icinga 2 is a monitoring and management system for hosts, services and networks. ### END INIT INFO +# Get function from functions library +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions +elif [ -f /etc/init.d/functions ]; then + . /etc/init.d/functions +fi + # load system specific defines SYSCONFIGFILE=@ICINGA2_SYSCONFIGFILE@ if [ -f $SYSCONFIGFILE ]; then @@ -50,13 +57,6 @@ getent passwd $ICINGA2_USER >/dev/null 2>&1 || (echo "Icinga user '$ICINGA2_USER getent group $ICINGA2_GROUP >/dev/null 2>&1 || (echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." && exit 6) getent group $ICINGA2_COMMAND_GROUP >/dev/null 2>&1 || (echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting." && exit 6) -# Get function from functions library -if [ -f /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -elif [ -f /etc/init.d/functions ]; then - . /etc/init.d/functions -fi - # Start Icinga 2 start() { printf "Starting Icinga 2: " From 7c2e999f1f4e53f251bf8f9d57d0c692669539f6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 19 Jul 2018 12:48:01 +0200 Subject: [PATCH 0075/1162] Log something when the Filelogger has been started Helps to see whether the logger object is active, spotted during #6445 --- lib/base/filelogger.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/base/filelogger.cpp b/lib/base/filelogger.cpp index 5ae739d2e..28d1eac8d 100644 --- a/lib/base/filelogger.cpp +++ b/lib/base/filelogger.cpp @@ -51,6 +51,9 @@ void FileLogger::Start(bool runtimeCreated) Application::OnReopenLogs.connect(std::bind(&FileLogger::ReopenLogFile, this)); ObjectImpl::Start(runtimeCreated); + + Log(LogInformation, "FileLogger") + << "'" << GetName() << "' started."; } void FileLogger::ReopenLogFile() From fd381ff5e069b1b94558716f49ceb1d371dd36b3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 19 Jul 2018 12:51:30 +0200 Subject: [PATCH 0076/1162] Keep notes for immediately log flushing Disabled, but kept for future debugging sessions. Helps with things like #6455 --- lib/base/logger.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index 8c20231fb..376296ada 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -238,6 +238,11 @@ Log::~Log() if (entry.Severity >= logger->GetMinSeverity()) logger->ProcessLogEntry(entry); + +#ifdef I2_DEBUG /* I2_DEBUG */ + /* Always flush, don't depend on the timer. Enable this for development sprints. */ + //logger->Flush(); +#endif /* I2_DEBUG */ } if (Logger::IsConsoleLogEnabled() && entry.Severity >= Logger::GetConsoleLogSeverity()) From fc2da5047c1702e902ff1d3f0007f879119876dc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 19 Jul 2018 12:53:28 +0200 Subject: [PATCH 0077/1162] Fix debug build log entry for ConfigItem activation priority This is not visible in release builds, minor fix. --- lib/config/configitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index c790f8794..4e4eacc29 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -625,7 +625,7 @@ bool ConfigItem::ActivateItems(WorkQueue& upq, const std::vectorGetName() << "' of type '" - << objectType->GetName() << "' with priority '" + << objectType->GetName() << "' with priority " << objectType->GetActivationPriority(); #endif /* I2_DEBUG */ From 75947c96d5e699d449c544cbcc5e27975bb3aa80 Mon Sep 17 00:00:00 2001 From: Dirk Goetz Date: Wed, 18 Jul 2018 06:49:24 +0000 Subject: [PATCH 0078/1162] SELinux: allow systemd notify fixes #6443 --- tools/selinux/icinga2.te | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/selinux/icinga2.te b/tools/selinux/icinga2.te index 19e99c69d..1eea26a10 100644 --- a/tools/selinux/icinga2.te +++ b/tools/selinux/icinga2.te @@ -1,4 +1,4 @@ -policy_module(icinga2, 0.1.6) +policy_module(icinga2, 0.1.7) ######################################## # @@ -122,6 +122,7 @@ corecmd_exec_bin(icinga2_t) kernel_read_system_state(icinga2_t) kernel_read_network_state(icinga2_t) +kernel_dgram_send(icinga2_t) # should be moved to nagios_plugin_template in nagios.if icinga2_execstrans(nagios_admin_plugin_exec_t, nagios_admin_plugin_t) From d15e1006f385eb4f297b14b7df618c033d7d76ca Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 19 Jul 2018 12:49:27 +0200 Subject: [PATCH 0079/1162] Re-introduce Timer::Initialize() refs #6445 --- lib/base/application.cpp | 2 ++ lib/base/timer.cpp | 25 +++++++------------------ lib/base/timer.hpp | 1 + 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index dec962e08..cfa728caa 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -140,6 +140,8 @@ void Application::InitializeBase() /* make sure the thread pool gets initialized */ GetTP().Start(); + + Timer::Initialize(); } void Application::UninitializeBase() diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 0eb03f754..95e3f5b6d 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -71,7 +71,6 @@ static boost::condition_variable l_TimerCV; static std::thread l_TimerThread; static bool l_StopTimerThread; static TimerSet l_Timers; -static int l_AliveTimers; /** * Destructor for the Timer class. @@ -81,6 +80,13 @@ Timer::~Timer() Stop(true); } +void Timer::Initialize() +{ + boost::mutex::scoped_lock lock(l_TimerMutex); + l_StopTimerThread = false; + l_TimerThread = std::thread(&Timer::TimerThreadProc); +} + void Timer::Uninitialize() { { @@ -139,11 +145,6 @@ void Timer::Start() { boost::mutex::scoped_lock lock(l_TimerMutex); m_Started = true; - - if (l_AliveTimers++ == 0) { - l_StopTimerThread = false; - l_TimerThread = std::thread(&Timer::TimerThreadProc); - } } InternalReschedule(false); @@ -159,18 +160,6 @@ void Timer::Stop(bool wait) boost::mutex::scoped_lock lock(l_TimerMutex); - if (m_Started && --l_AliveTimers == 0) { - l_StopTimerThread = true; - l_TimerCV.notify_all(); - - lock.unlock(); - - if (l_TimerThread.joinable() && l_TimerThread.get_id() != std::this_thread::get_id()) - l_TimerThread.join(); - - lock.lock(); - } - m_Started = false; l_Timers.erase(this); diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 6d5e115ef..0c661593d 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -40,6 +40,7 @@ public: ~Timer() override; + static void Initialize(); static void Uninitialize(); void SetInterval(double interval); From 7519d23892c3478148ff297d63cc535a88dfc382 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 19 Jul 2018 13:34:12 +0200 Subject: [PATCH 0080/1162] Add debug logging for daemonize/timers The previous commit is 1:1 the same I've implemented here already. Great teamwork with Alex :) refs #6445 --- lib/base/application.cpp | 4 ++-- lib/base/timer.cpp | 3 +++ lib/cli/daemoncommand.cpp | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index cfa728caa..4287c7687 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -138,9 +138,10 @@ void Application::InitializeBase() Loader::ExecuteDeferredInitializers(); - /* make sure the thread pool gets initialized */ + /* Make sure the thread pool gets initialized. */ GetTP().Start(); + /* Make sure the timer thread gets initialized. */ Timer::Initialize(); } @@ -302,7 +303,6 @@ void Application::SetArgV(char **argv) */ void Application::RunEventLoop() { - #ifdef HAVE_SYSTEMD sd_notify(0, "READY=1"); #endif /* HAVE_SYSTEMD */ diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 95e3f5b6d..65c7ee626 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -19,6 +19,7 @@ #include "base/timer.hpp" #include "base/debug.hpp" +#include "base/logger.hpp" #include "base/utility.hpp" #include #include @@ -259,6 +260,8 @@ void Timer::AdjustTimers(double adjustment) */ void Timer::TimerThreadProc() { + Log(LogDebug, "Timer", "TimerThreadProc started."); + Utility::SetThreadName("Timer Thread"); for (;;) { diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index f663d1046..ba2dade47 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -88,6 +88,9 @@ static bool Daemonize() _exit(EXIT_SUCCESS); } + Log(LogDebug, "Daemonize()") + << "Child process with PID " << Utility::GetPid() << " continues; re-initializing base."; + Application::InitializeBase(); #endif /* _WIN32 */ From f71bad96d5a5997ec666a8c0873292501a988250 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 20 Jul 2018 15:36:15 +0200 Subject: [PATCH 0081/1162] Start and stop the timer thread lazily refs #6461 --- lib/base/timer.cpp | 35 ++++++++++++++++++++++++++++++++--- lib/base/timer.hpp | 2 ++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 65c7ee626..d5e748cfa 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -72,6 +72,7 @@ static boost::condition_variable l_TimerCV; static std::thread l_TimerThread; static bool l_StopTimerThread; static TimerSet l_Timers; +static int l_AliveTimers = 0; /** * Destructor for the Timer class. @@ -84,20 +85,40 @@ Timer::~Timer() void Timer::Initialize() { boost::mutex::scoped_lock lock(l_TimerMutex); - l_StopTimerThread = false; - l_TimerThread = std::thread(&Timer::TimerThreadProc); + + if (l_AliveTimers > 0) { + InitializeThread(); + } } void Timer::Uninitialize() +{ + boost::mutex::scoped_lock lock(l_TimerMutex); + + if (l_AliveTimers > 0) { + UninitializeThread(); + } +} + +void Timer::InitializeThread() +{ + l_StopTimerThread = false; + l_TimerThread = std::thread(&Timer::TimerThreadProc); +} + +void Timer::UninitializeThread() { { - boost::mutex::scoped_lock lock(l_TimerMutex); l_StopTimerThread = true; l_TimerCV.notify_all(); } + l_TimerMutex.unlock(); + if (l_TimerThread.joinable()) l_TimerThread.join(); + + l_TimerMutex.lock(); } /** @@ -146,6 +167,10 @@ void Timer::Start() { boost::mutex::scoped_lock lock(l_TimerMutex); m_Started = true; + + if (++l_AliveTimers == 1) { + InitializeThread(); + } } InternalReschedule(false); @@ -161,6 +186,10 @@ void Timer::Stop(bool wait) boost::mutex::scoped_lock lock(l_TimerMutex); + if (m_Started && --l_AliveTimers == 0) { + UninitializeThread(); + } + m_Started = false; l_Timers.erase(this); diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 0c661593d..7a0c1f981 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -42,6 +42,8 @@ public: static void Initialize(); static void Uninitialize(); + static void InitializeThread(); + static void UninitializeThread(); void SetInterval(double interval); double GetInterval() const; From 0891380789dcd31ee504d5038c04b0a23143dee9 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Sat, 21 Jul 2018 10:38:09 +0200 Subject: [PATCH 0082/1162] Fix spelling errors. * occured -> occurred * dosen't -> doesn't --- lib/base/socket.cpp | 2 +- lib/checker/checkercomponent.cpp | 2 +- lib/cli/nodesetupcommand.cpp | 2 +- lib/icinga/checkable-check.cpp | 2 +- lib/icinga/checkable-notification.cpp | 2 +- lib/icinga/clusterevents-check.cpp | 2 +- lib/icinga/notification.cpp | 2 +- lib/notification/notificationcomponent.cpp | 2 +- third-party/yajl/src/api/yajl_parse.h | 6 +++--- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/base/socket.cpp b/lib/base/socket.cpp index fae5665f3..97946f5ee 100644 --- a/lib/base/socket.cpp +++ b/lib/base/socket.cpp @@ -94,7 +94,7 @@ void Socket::Close() } /** - * Retrieves the last error that occured for the socket. + * Retrieves the last error that occurred for the socket. * * @returns An error code. */ diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index 89426f8a1..5a4aa6157 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -221,7 +221,7 @@ void CheckerComponent::ExecuteCheckHelper(const Checkable::Ptr& checkable) CheckResult::Ptr cr = new CheckResult(); cr->SetState(ServiceUnknown); - String output = "Exception occured while checking '" + checkable->GetName() + "': " + DiagnosticInformation(ex); + String output = "Exception occurred while checking '" + checkable->GetName() + "': " + DiagnosticInformation(ex); cr->SetOutput(output); double now = Utility::GetTime(); diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index fa188e7f0..d0289b4fb 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -262,7 +262,7 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v NodeUtility::UpdateConfiguration("\"conf.d/api-users.conf\"", true, false); } else { Log(LogWarning, "cli") - << "Included file dosen't exist " << apiUsersFilePath; + << "Included file doesn't exist " << apiUsersFilePath; } } diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index faf50694a..35c406d06 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -293,7 +293,7 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig bool send_notification = false; if (notification_reachable && !in_downtime && !IsAcknowledged()) { - /* Send notifications whether when a hard state change occured. */ + /* Send notifications whether when a hard state change occurred. */ if (hardChange && !(old_stateType == StateTypeSoft && IsStateOK(new_state))) send_notification = true; /* Or if the checkable is volatile and in a HARD state. */ diff --git a/lib/icinga/checkable-notification.cpp b/lib/icinga/checkable-notification.cpp index 021b3f964..3dad5a7af 100644 --- a/lib/icinga/checkable-notification.cpp +++ b/lib/icinga/checkable-notification.cpp @@ -76,7 +76,7 @@ void Checkable::SendNotifications(NotificationType type, const CheckResult::Ptr& notification->BeginExecuteNotification(type, cr, force, false, author, text); } catch (const std::exception& ex) { Log(LogWarning, "Checkable") - << "Exception occured during notification for service '" + << "Exception occurred during notification for service '" << GetName() << "': " << DiagnosticInformation(ex); } } diff --git a/lib/icinga/clusterevents-check.cpp b/lib/icinga/clusterevents-check.cpp index 58d983eb8..9ad1c798f 100644 --- a/lib/icinga/clusterevents-check.cpp +++ b/lib/icinga/clusterevents-check.cpp @@ -179,7 +179,7 @@ void ClusterEvents::ExecuteCheckFromQueue(const MessageOrigin::Ptr& origin, cons CheckResult::Ptr cr = new CheckResult(); cr->SetState(ServiceUnknown); - String output = "Exception occured while checking '" + host->GetName() + "': " + DiagnosticInformation(ex); + String output = "Exception occurred while checking '" + host->GetName() + "': " + DiagnosticInformation(ex); cr->SetOutput(output); double now = Utility::GetTime(); diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 0e8d6dac2..ea3fdc90e 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -524,7 +524,7 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User:: << "' and user '" << user->GetName() << "'."; } catch (const std::exception& ex) { Log(LogWarning, "Notification") - << "Exception occured during notification for checkable '" + << "Exception occurred during notification for checkable '" << GetCheckable()->GetName() << "': " << DiagnosticInformation(ex); } } diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index 3d7fbc60b..bbe6ad480 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -130,7 +130,7 @@ void NotificationComponent::NotificationTimerHandler() notification->BeginExecuteNotification(NotificationProblem, checkable->GetLastCheckResult(), false, true); } catch (const std::exception& ex) { Log(LogWarning, "NotificationComponent") - << "Exception occured during notification for object '" + << "Exception occurred during notification for object '" << GetName() << "': " << DiagnosticInformation(ex); } } diff --git a/third-party/yajl/src/api/yajl_parse.h b/third-party/yajl/src/api/yajl_parse.h index 1c25a60d5..fd5b9a067 100644 --- a/third-party/yajl/src/api/yajl_parse.h +++ b/third-party/yajl/src/api/yajl_parse.h @@ -35,7 +35,7 @@ extern "C" { yajl_status_ok, /** a client callback returned zero, stopping the parse */ yajl_status_client_canceled, - /** An error occured during the parse. Call yajl_get_error for + /** An error occurred during the parse. Call yajl_get_error for * more information about the encountered error */ yajl_status_error } yajl_status; @@ -192,7 +192,7 @@ extern "C" { * parse. * * If verbose is non-zero, the message will include the JSON - * text where the error occured, along with an arrow pointing to + * text where the error occurred, along with an arrow pointing to * the specific char. * * \returns A dynamically allocated string will be returned which should @@ -211,7 +211,7 @@ extern "C" { * * In the event an error is encountered during parsing, this function * affords the client a way to get the offset into the most recent - * chunk where the error occured. 0 will be returned if no error + * chunk where the error occurred. 0 will be returned if no error * was encountered. */ YAJL_API size_t yajl_get_bytes_consumed(yajl_handle hand); From 91ead3a3b76229f4c25d1fc2cea5b3ffea49cd13 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 20 Jul 2018 21:46:23 +0200 Subject: [PATCH 0083/1162] Fix Windows Agent resize behavior This fixes the Windows Agent behavior when resizing refs #4959 --- agent/windows-setup-agent/SetupWizard.Designer.cs | 2 +- agent/windows-setup-agent/SetupWizard.cs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/agent/windows-setup-agent/SetupWizard.Designer.cs b/agent/windows-setup-agent/SetupWizard.Designer.cs index 258139224..e32c55eba 100644 --- a/agent/windows-setup-agent/SetupWizard.Designer.cs +++ b/agent/windows-setup-agent/SetupWizard.Designer.cs @@ -746,7 +746,7 @@ this.tabError.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.picBanner)).EndInit(); this.ResumeLayout(false); - + this.Load += new System.EventHandler(this.SetupWizard_Load); } #endregion diff --git a/agent/windows-setup-agent/SetupWizard.cs b/agent/windows-setup-agent/SetupWizard.cs index 6aceaf16b..018b2abab 100644 --- a/agent/windows-setup-agent/SetupWizard.cs +++ b/agent/windows-setup-agent/SetupWizard.cs @@ -576,6 +576,12 @@ namespace Icinga { } + + private void SetupWizard_Load(object sender, EventArgs e) + { + this.MinimumSize = this.Size; + this.MaximumSize = this.Size; + } } } From d9d701a05c922917353588d5979b22338a261c77 Mon Sep 17 00:00:00 2001 From: "dh.harald" Date: Mon, 23 Jul 2018 22:28:09 +0100 Subject: [PATCH 0084/1162] lib->compat->statusdatawriter: fix notifications_enabled --- lib/compat/statusdatawriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index 6b1610b0e..407a14d9a 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -394,7 +394,7 @@ void StatusDataWriter::DumpCheckableStatusAttrs(std::ostream& fp, const Checkabl "\t" "last_state_change=" << static_cast(checkable->GetLastStateChange()) << "\n" "\t" "last_hard_state_change=" << static_cast(checkable->GetLastHardStateChange()) << "\n" "\t" "last_update=" << static_cast(Utility::GetTime()) << "\n" - "\t" "notifications_enabled" "\t" << Convert::ToLong(checkable->GetEnableNotifications()) << "\n" + "\t" "notifications_enabled=" << Convert::ToLong(checkable->GetEnableNotifications()) << "\n" "\t" "active_checks_enabled=" << Convert::ToLong(checkable->GetEnableActiveChecks()) << "\n" "\t" "passive_checks_enabled=" << Convert::ToLong(checkable->GetEnablePassiveChecks()) << "\n" "\t" "flap_detection_enabled=" << Convert::ToLong(checkable->GetEnableFlapping()) << "\n" From 6d474b7870a9697e0a0e4f83327370f3dde040be Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 24 Jul 2018 12:48:12 +0200 Subject: [PATCH 0085/1162] Release version 2.9.1 --- AUTHORS | 1 + CHANGELOG.md | 18 ++++++++++++++++++ VERSION | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 7fce7ce2a..d906dc728 100644 --- a/AUTHORS +++ b/AUTHORS @@ -11,6 +11,7 @@ Andrew Meyer Andy Grunwald Arnd Hannemann Assaf Flatto +Bas Couwenberg Bastian Guse Benedikt Heine Bernd Erk diff --git a/CHANGELOG.md b/CHANGELOG.md index 83cd848e2..24db33fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Icinga 2.x CHANGELOG +## 2.9.1 (2018-07-24) + +### Bug + +* [#6457](https://github.com/icinga/icinga2/issues/6457) (PR): Ensure that timer thread is initialized after Daemonize\(\) +* [#6449](https://github.com/icinga/icinga2/issues/6449): icinga r2.9.0-1 init.d script overrides PATH variable +* [#6445](https://github.com/icinga/icinga2/issues/6445): Problem with daemonize \(init scripts, -d\) on Debian 8 / CentOS 6 / Ubuntu 14 / SLES 11 in 2.9 +* [#6444](https://github.com/icinga/icinga2/issues/6444) (PR): SELinux: allow systemd notify +* [#6443](https://github.com/icinga/icinga2/issues/6443): selinux and 2.9 + +### Support + +* [#6470](https://github.com/icinga/icinga2/issues/6470) (code-quality, PR): Fix spelling errors. +* [#6467](https://github.com/icinga/icinga2/issues/6467) (Tests, PR): Start and stop the timer thread lazily +* [#6461](https://github.com/icinga/icinga2/issues/6461) (Tests): Broken tests with fix from \#6457 +* [#6451](https://github.com/icinga/icinga2/issues/6451) (Packages, PR): Fix initscripts +* [#6450](https://github.com/icinga/icinga2/issues/6450) (Packages): init script helpers - source: not found + ## 2.9.0 (2018-07-17) ### Notes diff --git a/VERSION b/VERSION index 7be4b3e01..be4e22190 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.9.0 +Version: 2.9.1 Revision: 1 From d946f8b668f0299cad10c63b7f12791571c9ab94 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 24 Jul 2018 12:48:12 +0200 Subject: [PATCH 0086/1162] Release version 2.9.1 --- AUTHORS | 1 + CHANGELOG.md | 18 ++++++++++++++++++ VERSION | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 7fce7ce2a..d906dc728 100644 --- a/AUTHORS +++ b/AUTHORS @@ -11,6 +11,7 @@ Andrew Meyer Andy Grunwald Arnd Hannemann Assaf Flatto +Bas Couwenberg Bastian Guse Benedikt Heine Bernd Erk diff --git a/CHANGELOG.md b/CHANGELOG.md index 83cd848e2..24db33fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Icinga 2.x CHANGELOG +## 2.9.1 (2018-07-24) + +### Bug + +* [#6457](https://github.com/icinga/icinga2/issues/6457) (PR): Ensure that timer thread is initialized after Daemonize\(\) +* [#6449](https://github.com/icinga/icinga2/issues/6449): icinga r2.9.0-1 init.d script overrides PATH variable +* [#6445](https://github.com/icinga/icinga2/issues/6445): Problem with daemonize \(init scripts, -d\) on Debian 8 / CentOS 6 / Ubuntu 14 / SLES 11 in 2.9 +* [#6444](https://github.com/icinga/icinga2/issues/6444) (PR): SELinux: allow systemd notify +* [#6443](https://github.com/icinga/icinga2/issues/6443): selinux and 2.9 + +### Support + +* [#6470](https://github.com/icinga/icinga2/issues/6470) (code-quality, PR): Fix spelling errors. +* [#6467](https://github.com/icinga/icinga2/issues/6467) (Tests, PR): Start and stop the timer thread lazily +* [#6461](https://github.com/icinga/icinga2/issues/6461) (Tests): Broken tests with fix from \#6457 +* [#6451](https://github.com/icinga/icinga2/issues/6451) (Packages, PR): Fix initscripts +* [#6450](https://github.com/icinga/icinga2/issues/6450) (Packages): init script helpers - source: not found + ## 2.9.0 (2018-07-17) ### Notes diff --git a/VERSION b/VERSION index 7be4b3e01..be4e22190 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.9.0 +Version: 2.9.1 Revision: 1 From 2b44eff8da8650997c6044100c1f65f2c9d8e842 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Thu, 26 Jul 2018 09:39:03 +0200 Subject: [PATCH 0087/1162] Fix "Discard" message being warning --- lib/remote/apilistener-configsync.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index 12c91065e..361cb2790 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -223,7 +223,7 @@ Value ApiListener::ConfigDeleteObjectAPIHandler(const MessageOrigin::Ptr& origin /* discard messages if the sender is in a child zone */ if (!Zone::GetLocalZone()->IsChildOf(endpoint->GetZone())) { - Log(LogWarning, "ApiListener") + Log(LogNotice, "ApiListener") << "Discarding 'config update object' message from '" << origin->FromClient->GetIdentity() << "'."; return Empty; From 09147fad15628739d18068f2e7811156d77ba242 Mon Sep 17 00:00:00 2001 From: Sebastian Eikenberg Date: Thu, 26 Jul 2018 15:00:56 +0200 Subject: [PATCH 0088/1162] Fix typo with the CheckCommand cert ITL plugin uses ssl_cert --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index bf91bf596..eec15526a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5111,7 +5111,7 @@ apache_status_warning | **Optional.** Warning threshold (number of open slots, b apache_status_critical | **Optional.** Critical threshold (number of open slots, busy workers and idle workers that will cause a CRITICAL) like ':10,25,:20'. -### cert +### ssl_cert The [check_ssl_cert](https://github.com/matteocorti/check_ssl_cert) plugin uses the openssl binary (and optional curl) to check a X.509 certificate. From ddc5b951b3a692a4be02bb2d551327db65f65468 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 26 Jul 2018 17:09:06 +0200 Subject: [PATCH 0089/1162] Revert "Implement support for the --env command-line argument" --- doc/06-distributed-monitoring.md | 32 -------- icinga-app/icinga.cpp | 103 +----------------------- icinga-installer/icinga2.wixpatch.cmake | 6 +- lib/cli/apisetupcommand.cpp | 13 +-- lib/cli/apisetupcommand.hpp | 2 - lib/cli/apisetuputility.cpp | 10 +-- lib/cli/apisetuputility.hpp | 4 +- lib/cli/featureutility.cpp | 14 ++-- lib/cli/featureutility.hpp | 4 +- lib/remote/apilistener.cpp | 49 ++--------- lib/remote/apilistener.hpp | 1 - 11 files changed, 27 insertions(+), 211 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 6402a1a3e..985e23fd9 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -2793,35 +2793,3 @@ Add the global zone `global-templates` in case it did not exist. global = true } EOF - -## Using Multiple Environments - -In some cases it might be useful to run multiple Icinga instance on the same host. Two potential scenarios include: - -* running different versions of the same monitoring configuration (e.g. production and testing) -* running disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) - -Icinga supports these scenarios by providing a global variable called `Environment`. It can be set like any other -global variable, e.g. in the `constants.conf` file or in a file in a global template zone. - -The `Environment` variable can also be set using the `--env` command-line option. Setting the variable this way -has the added effect that Icinga tries to determine if the `Icinga Environments` add-on is available and -if so uses its CLI commands to determine the configuration and data paths. This command-line option also has the -effect of changing the listener port for cluster feature to a random port which is made available to the -`Icinga Environments` add-on through its `config.json` file. - -When Icinga establishes a TLS connection to another cluster instance it automatically uses the SNI extension -to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple -Icinga instances behind a load balancer. - -SNI example: `icinga2-client1.localdomain` - -However, if the `Environment` variable is non-empty Icinga will append the environment name to the SNI hostname -like this: - -SNI example with environment: `icinga2-client1.localdomain:production` - -The Icinga Environments add-on provides a reverse proxy which does SNI-based port multiplexing. I.e., it uses a -single externally-visible TCP port (usually 5665) and forwards connections to one or more Icinga instances -which are bound to a local TCP port. It does so by inspecting the environment name that is sent as part of the -SNI extension. diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 957cea61b..404cedf30 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -32,8 +32,6 @@ #include "base/context.hpp" #include "base/console.hpp" #include "base/process.hpp" -#include "base/json.hpp" -#include "base/tcpsocket.hpp" #include "config.h" #include #include @@ -48,9 +46,6 @@ # include # include # include - -# define popen _popen -# define pclose _pclose #endif /* _WIN32 */ using namespace icinga; @@ -220,6 +215,8 @@ static int Main() Application::DeclareConcurrency(std::thread::hardware_concurrency()); Application::DeclareMaxConcurrentChecks(Application::GetDefaultMaxConcurrentChecks()); + ScriptGlobal::Set("Environment", "production"); + ScriptGlobal::Set("AttachDebugger", false); ScriptGlobal::Set("PlatformKernel", Utility::GetPlatformKernel()); @@ -250,8 +247,7 @@ static int Main() ("include,I", po::value >(), "add include search directory") ("log-level,x", po::value(), "specify the log level for the console log.\n" "The valid value is either debug, notice, information (default), warning, or critical") - ("script-debugger,X", "whether to enable the script debugger") - ("env", po::value(), "the name of the environment, e.g. \"production\""); + ("script-debugger,X", "whether to enable the script debugger"); po::options_description hiddenDesc("Hidden options"); @@ -275,99 +271,6 @@ static int Main() return EXIT_FAILURE; } - if (vm.count("env") && vm["env"].as() != "") { - String env = vm["env"].as(); - ScriptGlobal::Set("Environment", env); - } else { -#ifndef _WIN32 - String cmd = "icinga-envs"; -#else /* _WIN32 */ - String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\""; -#endif /* _WIN32 */ - cmd += " get-default"; -#ifndef _WIN32 - cmd += " 2>/dev/null"; -#else /* _WIN32 */ - cmd += " 2>NUL"; - cmd = "\"" + cmd + "\""; -#endif /* _WIN32 */ - - FILE *fp = popen(cmd.CStr(), "r"); - std::stringstream msgbuf; - while (!ferror(fp) && !feof(fp)) { - char buf[512]; - size_t num = fread(buf, 1, sizeof(buf), fp); - msgbuf << std::string(buf, buf + num); - } - pclose(fp); - - String env = msgbuf.str(); - ScriptGlobal::Set("Environment", env.Trim()); - } - - String env = ScriptGlobal::Get("Environment", NULL); -#ifndef _WIN32 - String cmd = "icinga-envs"; -#else /* _WIN32 */ - String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\""; -#endif /* _WIN32 */ - cmd += " info --json " + Utility::EscapeShellArg(env); -#ifndef _WIN32 - cmd += " 2>/dev/null"; -#else /* _WIN32 */ - cmd += " 2>NUL"; - cmd = "\"" + cmd + "\""; -#endif /* _WIN32 */ - - FILE *fp = popen(cmd.CStr(), "r"); - std::stringstream msgbuf; - while (!ferror(fp) && !feof(fp)) { - char buf[512]; - size_t num = fread(buf, 1, sizeof(buf), fp); - msgbuf << std::string(buf, buf + num); - } - pclose(fp); - - Dictionary::Ptr envInfo; - try { - envInfo = JsonDecode(msgbuf.str()); - } catch (const std::exception&) {} - - if (envInfo) { - Dictionary::Ptr config = envInfo->Get("config"); - - if (!config) { - Log(LogCritical, "app") - << "Invalid JSON returned by icinga-envs: " << msgbuf.str(); - return EXIT_FAILURE; - } - - String configPath = config->Get("config_path"); - String dataPath = config->Get("data_path"); - - ScriptGlobal::Set("SysconfDir", configPath); - ScriptGlobal::Set("RunDir", dataPath + "/run"); - ScriptGlobal::Set("LocalStateDir", dataPath); - - TcpSocket::Ptr agentListener = new TcpSocket(); - agentListener->Bind("127.0.0.1", "0", AF_INET); - auto pieces = agentListener->GetClientAddress().Split(":"); - config->Set("port", Convert::ToLong(pieces[pieces.size() - 1])); - - Dictionary::Ptr envData = new Dictionary({ - { "listener", agentListener }, - { "config", config }, - { "meta_path", envInfo->Get("env_path") + "/config.json" } - }); - - // Make the agent listener available to the ApiListener later on - ScriptGlobal::Set("EnvironmentInfo", envData); - } else if (env != "") { - Log(LogCritical, "app") - << "No such environment exists: " << env; - return EXIT_FAILURE; - } - #ifdef _WIN32 char username[UNLEN + 1]; DWORD usernameLen = UNLEN + 1; diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake index ab400ed1e..0666261d2 100644 --- a/icinga-installer/icinga2.wixpatch.cmake +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -10,9 +10,9 @@ - $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA - $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA - $CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA + $CM_CP_sbin.icinga2_installer.exe>2 + $CM_CP_sbin.icinga2_installer.exe>2 + $CM_CP_sbin.icinga2_installer.exe=2 diff --git a/lib/cli/apisetupcommand.cpp b/lib/cli/apisetupcommand.cpp index f13b985a1..bc832c525 100644 --- a/lib/cli/apisetupcommand.cpp +++ b/lib/cli/apisetupcommand.cpp @@ -49,14 +49,6 @@ int ApiSetupCommand::GetMaxArguments() const return -1; } -void ApiSetupCommand::InitParameters(boost::program_options::options_description& visibleDesc, - boost::program_options::options_description& hiddenDesc) const -{ - visibleDesc.add_options() - ("quiet,q", "be less verbose") - ; -} - /** * The entry point for the "api setup" CLI command. * @@ -64,15 +56,12 @@ void ApiSetupCommand::InitParameters(boost::program_options::options_description */ int ApiSetupCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - if (vm.count("quiet")) - Logger::SetConsoleLogSeverity(LogWarning); - String cn = VariableUtility::GetVariable("NodeName"); if (cn.IsEmpty()) cn = Utility::GetFQDN(); - if (!ApiSetupUtility::SetupMaster(cn, true, vm.count("quiet"))) + if (!ApiSetupUtility::SetupMaster(cn, true)) return 1; return 0; diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp index fcdb56428..f54da0685 100644 --- a/lib/cli/apisetupcommand.hpp +++ b/lib/cli/apisetupcommand.hpp @@ -38,8 +38,6 @@ public: String GetDescription() const override; String GetShortDescription() const override; int GetMaxArguments() const override; - void InitParameters(boost::program_options::options_description& visibleDesc, - boost::program_options::options_description& hiddenDesc) const override; int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const override; ImpersonationLevel GetImpersonationLevel() const override; }; diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 3c7336c16..1b60a2c1a 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -48,7 +48,7 @@ String ApiSetupUtility::GetApiUsersConfPath() return ApiSetupUtility::GetConfdPath() + "/api-users.conf"; } -bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart, bool quiet) +bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart) { if (!SetupMasterCertificates(cn)) return false; @@ -56,13 +56,13 @@ bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart, bool qu if (!SetupMasterApiUser()) return false; - if (!SetupMasterEnableApi(quiet)) + if (!SetupMasterEnableApi()) return false; if (!SetupMasterUpdateConstants(cn)) return false; - if (prompt_restart && !quiet) { + if (prompt_restart) { std::cout << "Done.\n\n"; std::cout << "Now restart your Icinga 2 daemon to finish the installation!\n\n"; } @@ -196,11 +196,11 @@ bool ApiSetupUtility::SetupMasterApiUser() return true; } -bool ApiSetupUtility::SetupMasterEnableApi(bool quiet) +bool ApiSetupUtility::SetupMasterEnableApi() { Log(LogInformation, "cli", "Enabling the 'api' feature."); - FeatureUtility::EnableFeatures({ "api" }, quiet); + FeatureUtility::EnableFeatures({ "api" }); return true; } diff --git a/lib/cli/apisetuputility.hpp b/lib/cli/apisetuputility.hpp index 26b163d90..9523ebffc 100644 --- a/lib/cli/apisetuputility.hpp +++ b/lib/cli/apisetuputility.hpp @@ -37,11 +37,11 @@ namespace icinga class ApiSetupUtility { public: - static bool SetupMaster(const String& cn, bool prompt_restart = false, bool quiet = false); + static bool SetupMaster(const String& cn, bool prompt_restart = false); static bool SetupMasterCertificates(const String& cn); static bool SetupMasterApiUser(); - static bool SetupMasterEnableApi(bool quiet = false); + static bool SetupMasterEnableApi(); static bool SetupMasterUpdateConstants(const String& cn); static String GetConfdPath(); diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index e06690f0d..9056b60fe 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -56,7 +56,7 @@ std::vector FeatureUtility::GetFieldCompletionSuggestions(const String& return suggestions; } -int FeatureUtility::EnableFeatures(const std::vector& features, bool quiet) +int FeatureUtility::EnableFeatures(const std::vector& features) { String features_available_dir = GetFeaturesAvailablePath(); String features_enabled_dir = GetFeaturesEnabledPath(); @@ -93,9 +93,8 @@ int FeatureUtility::EnableFeatures(const std::vector& features, boo continue; } - if (!quiet) - std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature - << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; + std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature + << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; #ifndef _WIN32 String relativeSource = "../features-available/" + feature + ".conf"; @@ -132,7 +131,7 @@ int FeatureUtility::EnableFeatures(const std::vector& features, boo return 0; } -int FeatureUtility::DisableFeatures(const std::vector& features, bool quiet) +int FeatureUtility::DisableFeatures(const std::vector& features) { String features_enabled_dir = GetFeaturesEnabledPath(); @@ -161,9 +160,8 @@ int FeatureUtility::DisableFeatures(const std::vector& features, bo continue; } - if (!quiet) - std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature - << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; + std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature + << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n"; } if (!errors.empty()) { diff --git a/lib/cli/featureutility.hpp b/lib/cli/featureutility.hpp index 23115ccca..38f91cce0 100644 --- a/lib/cli/featureutility.hpp +++ b/lib/cli/featureutility.hpp @@ -40,8 +40,8 @@ public: static std::vector GetFieldCompletionSuggestions(const String& word, bool enable); - static int EnableFeatures(const std::vector& features, bool quiet = false); - static int DisableFeatures(const std::vector& features, bool quiet = false); + static int EnableFeatures(const std::vector& features); + static int DisableFeatures(const std::vector& features); static int ListFeatures(std::ostream& os = std::cout); static bool GetFeatures(std::vector& features, bool enable); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index d1190a703..c1546710d 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -224,23 +224,11 @@ void ApiListener::Start(bool runtimeCreated) OpenLogFile(); } - Dictionary::Ptr envData = ScriptGlobal::Get("EnvironmentInfo", &Empty); - if (envData) { - ScriptGlobal::Set("EnvironmentInfo", Empty); - TcpSocket::Ptr listener = envData->Get("listener"); - if (!AddListener(listener)) { - Log(LogCritical, "ApiListener") - << "Failed to set up pre-configured agent listener."; - Application::Exit(EXIT_FAILURE); - } - Utility::SaveJsonFile(envData->Get("meta_path"), 0600, envData->Get("config")); - } else { - /* create the primary JSON-RPC listener */ - if (!AddListener(GetBindHost(), GetBindPort())) { - Log(LogCritical, "ApiListener") - << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'."; - Application::Exit(EXIT_FAILURE); - } + /* create the primary JSON-RPC listener */ + if (!AddListener(GetBindHost(), GetBindPort())) { + Log(LogCritical, "ApiListener") + << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'."; + Application::Exit(EXIT_FAILURE); } m_Timer = new Timer(); @@ -313,33 +301,6 @@ bool ApiListener::IsMaster() const return master == GetLocalEndpoint(); } -/** - * Creates a new JSON-RPC listener using the specified TCP socket object. - * - * @param listener The TCP socket to use. - */ -bool ApiListener::AddListener(const TcpSocket::Ptr& listener) -{ - ObjectLock olock(this); - - std::shared_ptr sslContext = m_SSLContext; - - if (!sslContext) { - Log(LogCritical, "ApiListener", "SSL context is required for AddListener()"); - return false; - } - - Log(LogInformation, "ApiListener") - << "Adding pre-configured listener on address " << listener->GetClientAddress(); - - std::thread thread(std::bind(&ApiListener::ListenerThreadProc, this, listener)); - thread.detach(); - - m_Servers.insert(listener); - - return true; -} - /** * Creates a new JSON-RPC listener on the specified port. * diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 41c4c3d23..b3894992a 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -138,7 +138,6 @@ private: void CleanupCertificateRequestsTimerHandler(); bool AddListener(const String& node, const String& service); - bool AddListener(const TcpSocket::Ptr& listener); void AddConnection(const Endpoint::Ptr& endpoint); void NewClientHandler(const Socket::Ptr& client, const String& hostname, ConnectionRole role); From dd8cb429694bc77d4363f37307ca9e42c869fbce Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 5 Jun 2018 15:01:43 +0200 Subject: [PATCH 0090/1162] Implement object packer for consistent hashing --- lib/base/CMakeLists.txt | 1 + lib/base/object-packer.cpp | 268 +++++++++++++++++++++++++++++++++++++ lib/base/object-packer.hpp | 35 +++++ 3 files changed, 304 insertions(+) create mode 100644 lib/base/object-packer.cpp create mode 100644 lib/base/object-packer.hpp diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 29daa94a0..c02001ccc 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -57,6 +57,7 @@ set(base_SOURCES number.cpp number.hpp number-script.cpp object.cpp object.hpp object-script.cpp objectlock.cpp objectlock.hpp + object-packer.cpp object-packer.hpp objecttype.cpp objecttype.hpp perfdatavalue.cpp perfdatavalue.hpp perfdatavalue-ti.hpp primitivetype.cpp primitivetype.hpp diff --git a/lib/base/object-packer.cpp b/lib/base/object-packer.cpp new file mode 100644 index 000000000..988504fe7 --- /dev/null +++ b/lib/base/object-packer.cpp @@ -0,0 +1,268 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/object-packer.hpp" +#include "base/debug.hpp" +#include "base/dictionary.hpp" +#include "base/array.hpp" +#include "base/objectlock.hpp" +#include +#include +#include +#include +#include + +using namespace icinga; + +// Just for the sake of code readability +typedef std::vector StringBuilder; + +union EndiannessDetector +{ + EndiannessDetector() + { + i = 1; + } + + int i; + char buf[sizeof(int)]; +}; + +static const EndiannessDetector l_EndiannessDetector; + +// Assumption: The compiler will optimize (away) if/else statements using this. +#define MACHINE_LITTLE_ENDIAN (l_EndiannessDetector.buf[0]) + +static void PackAny(const Value& value, StringBuilder& builder); + +/** + * std::swap() seems not to work + */ +static inline void SwapBytes(char& a, char& b) +{ + char c = a; + a = b; + b = c; +} + +#if CHAR_MIN != 0 +union CharU2SConverter +{ + CharU2SConverter() + { + s = 0; + } + + unsigned char u; + signed char s; +}; +#endif + +/** + * Avoid implementation-defined overflows during unsigned to signed casts + */ +static inline char UIntToByte(unsigned i) +{ +#if CHAR_MIN == 0 + return i; +#else + CharU2SConverter converter; + + converter.u = i; + return converter.s; +#endif +} + +/** + * Append the given int as big-endian 64-bit unsigned int + */ +static inline void PackUInt64BE(uint_least64_t i, StringBuilder& builder) +{ + char buf[8] = { + UIntToByte(i >> 56u), + UIntToByte((i >> 48u) & 255u), + UIntToByte((i >> 40u) & 255u), + UIntToByte((i >> 32u) & 255u), + UIntToByte((i >> 24u) & 255u), + UIntToByte((i >> 16u) & 255u), + UIntToByte((i >> 8u) & 255u), + UIntToByte(i & 255u) + }; + + builder.insert(builder.end(), (char*)buf, (char*)buf + 8); +} + +union Double2BytesConverter +{ + Double2BytesConverter() + { + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + buf[4] = 0; + buf[5] = 0; + buf[6] = 0; + buf[7] = 0; + } + + double f; + char buf[8]; +}; + +/** + * Append the given double as big-endian IEEE 754 binary64 + */ +static inline void PackFloat64BE(double f, StringBuilder& builder) +{ + Double2BytesConverter converter; + + converter.f = f; + + if (MACHINE_LITTLE_ENDIAN) { + SwapBytes(converter.buf[0], converter.buf[7]); + SwapBytes(converter.buf[1], converter.buf[6]); + SwapBytes(converter.buf[2], converter.buf[5]); + SwapBytes(converter.buf[3], converter.buf[4]); + } + + builder.insert(builder.end(), (char*)converter.buf, (char*)converter.buf + 8); +} + +/** + * Append the given string's length (BE uint64) and the string itself + */ +static inline void PackString(const String& string, StringBuilder& builder) +{ + PackUInt64BE(string.GetLength(), builder); + builder.insert(builder.end(), string.Begin(), string.End()); +} + +/** + * Append the given array + */ +static inline void PackArray(const Array::Ptr& arr, StringBuilder& builder) +{ + ObjectLock olock(arr); + + builder.emplace_back(5); + PackUInt64BE(arr->GetLength(), builder); + + for (const Value& value : arr) { + PackAny(value, builder); + } +} + +/** + * Append the given dictionary + */ +static inline void PackDictionary(const Dictionary::Ptr& dict, StringBuilder& builder) +{ + ObjectLock olock(dict); + + builder.emplace_back(6); + PackUInt64BE(dict->GetLength(), builder); + + for (const Dictionary::Pair& kv : dict) { + PackString(kv.first, builder); + PackAny(kv.second, builder); + } +} + +/** + * Append any JSON-encodable value + */ +static void PackAny(const Value& value, StringBuilder& builder) +{ + switch (value.GetType()) { + case ValueString: + builder.emplace_back(4); + PackString(value.Get(), builder); + break; + + case ValueNumber: + builder.emplace_back(3); + PackFloat64BE(value.Get(), builder); + break; + + case ValueBoolean: + builder.emplace_back(value.ToBool() ? 2 : 1); + break; + + case ValueEmpty: + builder.emplace_back(0); + break; + + case ValueObject: + { + const Object::Ptr& obj = value.Get(); + + Dictionary::Ptr dict = dynamic_pointer_cast(obj); + if (dict) { + PackDictionary(dict, builder); + break; + } + + Array::Ptr arr = dynamic_pointer_cast(obj); + if (arr) { + PackArray(arr, builder); + break; + } + } + + builder.emplace_back(0); + break; + + default: + VERIFY(!"Invalid variant type."); + } +} + +/** + * Pack any JSON-encodable value to a BSON-similar structure suitable for consistent hashing + * + * Spec: + * null: 0x00 + * false: 0x01 + * true: 0x02 + * number: 0x03 (ieee754_binary64_bigendian)payload + * string: 0x04 (uint64_bigendian)payload.length (char[])payload + * array: 0x05 (uint64_bigendian)payload.length (any[])payload + * object: 0x06 (uint64_bigendian)payload.length (keyvalue[])payload.sort() + * + * any: null|false|true|number|string|array|object + * keyvalue: (uint64_bigendian)key.length (char[])key (any)value + * + * Assumptions: + * - double is IEEE 754 binary64 + * - all int types (signed and unsigned) and all float types share the same endianness + * - char is exactly 8 bits wide and one char is exactly one byte affected by the machine endianness + * - all input strings, arrays and dictionaries are at most 2^64-1 long + * + * If not, this function will silently produce invalid results. + */ +String icinga::PackObject(const Value& value) +{ + StringBuilder builder; + PackAny(value, builder); + + String result; + result.insert(result.End(), builder.begin(), builder.end()); + return std::move(result); +} diff --git a/lib/base/object-packer.hpp b/lib/base/object-packer.hpp new file mode 100644 index 000000000..420a43979 --- /dev/null +++ b/lib/base/object-packer.hpp @@ -0,0 +1,35 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#ifndef OBJECT_PACKER +#define OBJECT_PACKER + +#include "base/i2-base.hpp" + +namespace icinga +{ + +class String; +class Value; + +String PackObject(const Value& value); + +} + +#endif /* OBJECT_PACKER */ From e4defe674fe70f9f7f56745a9e048dfa34d89c5e Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 26 Jul 2018 20:33:49 +0200 Subject: [PATCH 0091/1162] Fix heading level for ITL ssl_cert documentation Use heading level four instead of three. --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index eec15526a..2eaf89944 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5111,7 +5111,7 @@ apache_status_warning | **Optional.** Warning threshold (number of open slots, b apache_status_critical | **Optional.** Critical threshold (number of open slots, busy workers and idle workers that will cause a CRITICAL) like ':10,25,:20'. -### ssl_cert +#### ssl_cert The [check_ssl_cert](https://github.com/matteocorti/check_ssl_cert) plugin uses the openssl binary (and optional curl) to check a X.509 certificate. From 44efa90e47f760e69d7713eb890f6178424fdf0b Mon Sep 17 00:00:00 2001 From: chrostek Date: Thu, 26 Jul 2018 20:41:56 +0200 Subject: [PATCH 0092/1162] Add exclude/include to vmware-esx-soap-host-runtime --- itl/plugins-contrib.d/vmware.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/itl/plugins-contrib.d/vmware.conf b/itl/plugins-contrib.d/vmware.conf index 2663ca5e2..8e6c1061f 100644 --- a/itl/plugins-contrib.d/vmware.conf +++ b/itl/plugins-contrib.d/vmware.conf @@ -686,6 +686,11 @@ object CheckCommand "vmware-esx-soap-host-runtime" { arguments += { "--select" = "runtime" + "--exclude" = "$vmware_exclude$" + "--include" = "$vmware_include$" + "--isregexp" = { + set_if = "$vmware_isregexp$" + } } } From c0679001cc8c51c58633a11a4ae1a6499c220dbc Mon Sep 17 00:00:00 2001 From: chrostek Date: Thu, 26 Jul 2018 20:43:04 +0200 Subject: [PATCH 0093/1162] Add exclude/include to vmware-esx-soap-host-runtime docs --- doc/10-icinga-template-library.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index bf91bf596..10551b4ee 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -4139,6 +4139,9 @@ vmware_nosession | **Optional.** No auth session -- IT SHOULD BE USED FOR vmware_username | **Optional.** The username to connect to Host or vCenter server. No value defined as default. vmware_password | **Optional.** The username's password. No value defined as default. vmware_authfile | **Optional.** Use auth file instead username/password to session connect. No effect if **vmware_username** and **vmware_password** are defined
**Authentication file content:**
username=vmuser
password=p@ssw0rd +vmware_exclude | **Optional.** Blacklist VMs name. No value defined as default. +vmware_include | **Optional.** Whitelist VMs name. No value defined as default. +vmware_isregexp | **Optional.** Treat blacklist and whitelist expressions as regexp. **vmware-esx-soap-host-runtime-con** From d21a218527f196931358c5f7e52b78adb8fe153a Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 6 Jun 2018 16:27:33 +0200 Subject: [PATCH 0094/1162] Test PackObject --- test/CMakeLists.txt | 8 + test/base-object-packer.cpp | 281 ++++++++++++++++++++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 test/base-object-packer.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 789550052..df291e6dc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,6 +28,7 @@ set(base_test_SOURCES base-match.cpp base-netstring.cpp base-object.cpp + base-object-packer.cpp base-serialize.cpp base-shellescape.cpp base-stacktrace.cpp @@ -81,6 +82,13 @@ add_boost_test(base base_fifo/construct base_fifo/io base_json/invalid1 + base_object_packer/pack_null + base_object_packer/pack_false + base_object_packer/pack_true + base_object_packer/pack_number + base_object_packer/pack_string + base_object_packer/pack_array + base_object_packer/pack_object base_match/tolong base_netstring/netstring base_object/construct diff --git a/test/base-object-packer.cpp b/test/base-object-packer.cpp new file mode 100644 index 000000000..dbfd12a00 --- /dev/null +++ b/test/base-object-packer.cpp @@ -0,0 +1,281 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/object-packer.hpp" +#include "base/value.hpp" +#include "base/string.hpp" +#include "base/array.hpp" +#include "base/dictionary.hpp" +#include +#include +#include +#include +#include + +using namespace icinga; + +#if CHAR_MIN != 0 +union CharU2SConverter +{ + CharU2SConverter() + { + s = 0; + } + + unsigned char u; + signed char s; +}; +#endif + +/** + * Avoid implementation-defined overflows during unsigned to signed casts + */ +static inline char UIntToByte(unsigned i) +{ +#if CHAR_MIN == 0 + return i; +#else + CharU2SConverter converter; + + converter.u = i; + return converter.s; +#endif +} + +#if CHAR_MIN != 0 +union CharS2UConverter +{ + CharS2UConverter() + { + u = 0; + } + + unsigned char u; + signed char s; +}; +#endif + +/** + * Avoid implementation-defined underflows during signed to unsigned casts + */ +static inline unsigned ByteToUInt(char c) +{ +#if CHAR_MIN == 0 + return c; +#else + CharS2UConverter converter; + + converter.s = c; + return converter.u; +#endif +} + +/** + * Compare the expected output with the actual output + */ +static inline bool ComparePackObjectResult(const String& actualOutput, const std::initializer_list& out) +{ + if (actualOutput.GetLength() != out.size()) + return false; + + auto actualOutputPos = actualOutput.Begin(); + for (auto byte : out) { + if (*actualOutputPos != UIntToByte(byte)) + return false; + + ++actualOutputPos; + } + + return true; +} + +/** + * Pack the given input and compare with the expected output + */ +static inline bool AssertPackObjectResult(Value in, std::initializer_list out) +{ + auto actualOutput = PackObject(in); + bool equal = ComparePackObjectResult(actualOutput, out); + + if (!equal) { + std::ostringstream buf; + buf << std::setw(2) << std::setfill('0') << std::setbase(16); + + buf << "--- "; + for (int c : out) { + buf << c; + } + buf << std::endl; + + buf << "+++ "; + for (char c : actualOutput) { + buf << ByteToUInt(c); + } + buf << std::endl; + + BOOST_TEST_MESSAGE(buf.str()); + } + + return equal; +} + +BOOST_AUTO_TEST_SUITE(object_packer) + +BOOST_AUTO_TEST_CASE(pack_null) +{ + BOOST_CHECK(AssertPackObjectResult(Empty, {0})); +} + +BOOST_AUTO_TEST_CASE(pack_false) +{ + BOOST_CHECK(AssertPackObjectResult(false, {1})); +} + +BOOST_AUTO_TEST_CASE(pack_true) +{ + BOOST_CHECK(AssertPackObjectResult(true, {2})); +} + +BOOST_AUTO_TEST_CASE(pack_number) +{ + BOOST_CHECK(AssertPackObjectResult(42.125, { + // type + 3, + // IEEE 754 + 64, 69, 16, 0, 0, 0, 0, 0 + })); +} + +BOOST_AUTO_TEST_CASE(pack_string) +{ + BOOST_CHECK(AssertPackObjectResult( + String( + // ASCII (1 to 127) + "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" + "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f" + "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f" + "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f" + "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f" + "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f" + // some keyboard-independent non-ASCII unicode characters + "áéíóú" + ), + { + // type + 4, + // length + 0, 0, 0, 0, 0, 0, 0, 137, + // ASCII + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + // UTF-8 + 195, 161, 195, 169, 195, 173, 195, 179, 195, 186 + } + )); +} + +BOOST_AUTO_TEST_CASE(pack_array) +{ + BOOST_CHECK(AssertPackObjectResult( + (Array::Ptr)new Array({Empty, false, true, 42.125, "foobar"}), + { + // type + 5, + // length + 0, 0, 0, 0, 0, 0, 0, 5, + // Empty + 0, + // false + 1, + // true + 2, + // 42.125 + 3, + 64, 69, 16, 0, 0, 0, 0, 0, + // "foobar" + 4, + 0, 0, 0, 0, 0, 0, 0, 6, + 102, 111, 111, 98, 97, 114 + } + )); +} + +BOOST_AUTO_TEST_CASE(pack_object) +{ + BOOST_CHECK(AssertPackObjectResult( + (Dictionary::Ptr)new Dictionary({ + {"null", Empty}, + {"false", false}, + {"true", true}, + {"42.125", 42.125}, + {"foobar", "foobar"}, + {"[]", (Array::Ptr)new Array()} + }), + { + // type + 6, + // length + 0, 0, 0, 0, 0, 0, 0, 6, + // "42.125" + 0, 0, 0, 0, 0, 0, 0, 6, + 52, 50, 46, 49, 50, 53, + // 42.125 + 3, + 64, 69, 16, 0, 0, 0, 0, 0, + // "[]" + 0, 0, 0, 0, 0, 0, 0, 2, + 91, 93, + // (Array::Ptr)new Array() + 5, + 0, 0, 0, 0, 0, 0, 0, 0, + // "false" + 0, 0, 0, 0, 0, 0, 0, 5, + 102, 97, 108, 115, 101, + // false + 1, + // "foobar" + 0, 0, 0, 0, 0, 0, 0, 6, + 102, 111, 111, 98, 97, 114, + // "foobar" + 4, + 0, 0, 0, 0, 0, 0, 0, 6, + 102, 111, 111, 98, 97, 114, + // "null" + 0, 0, 0, 0, 0, 0, 0, 4, + 110, 117, 108, 108, + // Empty + 0, + // "true" + 0, 0, 0, 0, 0, 0, 0, 4, + 116, 114, 117, 101, + // true + 2 + } + )); +} + +BOOST_AUTO_TEST_SUITE_END() From 4c55a5c6cfb49566de2176a4c620cc87abe9ec2c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 6 Jun 2018 17:32:40 +0200 Subject: [PATCH 0095/1162] Fix prefix in unit tests for object packer --- test/base-object-packer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/base-object-packer.cpp b/test/base-object-packer.cpp index dbfd12a00..b453d6901 100644 --- a/test/base-object-packer.cpp +++ b/test/base-object-packer.cpp @@ -135,7 +135,7 @@ static inline bool AssertPackObjectResult(Value in, std::initializer_list o return equal; } -BOOST_AUTO_TEST_SUITE(object_packer) +BOOST_AUTO_TEST_SUITE(base_object_packer) BOOST_AUTO_TEST_CASE(pack_null) { From 8e682ce9b162ccbf71b1ff65727e43b91c77ec5c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 27 Jul 2018 16:34:50 +0200 Subject: [PATCH 0096/1162] Improve error logging for match/regex/cidr_match functions and unsupported dictionary usage fixes #6442 --- lib/base/scriptutils.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index cbedd9f97..2c65fae3b 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -108,10 +108,14 @@ bool ScriptUtils::CastBool(const Value& value) bool ScriptUtils::Regex(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("Regular expression and text must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("Regular expression and text must be specified for regex().")); String pattern = args[0]; const Value& argTexts = args[1]; + + if (argTexts.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by regex().")); + MatchType mode; if (args.size() > 2) @@ -158,10 +162,14 @@ bool ScriptUtils::Regex(const std::vector& args) bool ScriptUtils::Match(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("Pattern and text must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("Pattern and text must be specified for match().")); String pattern = args[0]; const Value& argTexts = args[1]; + + if (argTexts.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by match().")); + MatchType mode; if (args.size() > 2) @@ -199,10 +207,14 @@ bool ScriptUtils::Match(const std::vector& args) bool ScriptUtils::CidrMatch(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("CIDR and IP address must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("CIDR and IP address must be specified for cidr_match().")); String pattern = args[0]; const Value& argIps = args[1]; + + if (argIps.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by cidr_match().")); + MatchType mode; if (args.size() > 2) From 72c0f07661fd214bbb41df996c9d0f7c3187f4f8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 27 Jul 2018 16:55:37 +0200 Subject: [PATCH 0097/1162] Fix regression with MatchAny false conditions on match/regex/cidr_match fixes #6496 --- lib/base/scriptutils.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index cbedd9f97..f8ab8ce00 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -147,7 +147,8 @@ bool ScriptUtils::Regex(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String text = argTexts; boost::smatch what; @@ -189,7 +190,8 @@ bool ScriptUtils::Match(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String text = argTexts; return Utility::Match(pattern, argTexts); @@ -230,7 +232,8 @@ bool ScriptUtils::CidrMatch(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String ip = argIps; return Utility::CidrMatch(pattern, ip); From 8f7c033ed9e094421dce8652f12038985180ab0c Mon Sep 17 00:00:00 2001 From: Jens Link Date: Sat, 28 Jul 2018 11:57:17 +0200 Subject: [PATCH 0098/1162] Update 03-monitoring-basics.md Changed ::1 to 2001:db8:1234::42. RFC 3849 reserves 2001:db8/32 for use in documentation and something that looks like a "real" global IPv6 address is much better in an example than using ::1 (localhost). --- doc/03-monitoring-basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/03-monitoring-basics.md b/doc/03-monitoring-basics.md index 95c0ce234..627423e62 100644 --- a/doc/03-monitoring-basics.md +++ b/doc/03-monitoring-basics.md @@ -984,7 +984,7 @@ types. This could look like the following example: ``` object Host "router-v6" { check_command = "hostalive" - address6 = "::1" + address6 = "2001:db8:1234::42" vars.oids["if01"] = "1.1.1.1.1" vars.oids["temp"] = "1.1.1.1.2" From 1613a855e78047a8620ecf091705cb70ac727c55 Mon Sep 17 00:00:00 2001 From: Jens Link Date: Sat, 28 Jul 2018 12:00:35 +0200 Subject: [PATCH 0099/1162] Update 17-language-reference.md Changed ::1 to 2001:db8:1234::42. RFC 3849 reserves 2001:db8/32 for use in documentation and something that looks like a "real" global IPv6 address is much better in an example than using ::1 (localhost). Using a private IPv4 address and IPv6 localhost in an example make no sense to me. --- doc/17-language-reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 9bd31d6b7..9f6be99af 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -9,7 +9,7 @@ objects using the `object` keyword: display_name = "host1" address = "192.168.0.1" - address6 = "::1" + address6 = "2001:db8:1234::42" } In general you need to write each statement on a new line. Expressions started @@ -22,7 +22,7 @@ them with a semicolon: object Host "host1.example.org" { display_name = "host1" - address = "192.168.0.1"; address6 = "::1" + address = "192.168.0.1"; address6 = "2001:db8:1234::42" } Each object is uniquely identified by its type (`Host`) and name From f788795415b9735f994c2169303b2bc2d95d4c13 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Sun, 29 Jul 2018 15:08:12 +0200 Subject: [PATCH 0100/1162] Reduce the log level for missing env macros to debug refs #6460 --- lib/icinga/pluginutility.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 0dcc70997..47ff52eb9 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -70,10 +70,17 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab for (const Dictionary::Pair& kv : env) { String name = kv.second; + String missingMacro; Value value = MacroProcessor::ResolveMacros(name, macroResolvers, cr, - nullptr, MacroProcessor::EscapeCallback(), resolvedMacros, + &missingMacro, MacroProcessor::EscapeCallback(), resolvedMacros, useResolvedMacros); +#ifdef I2_DEBUG + if (!missingMacro.IsEmpty()) + Log(LogDebug, "PluginUtility") + << "Macro '" << name << "' is not defined."; +#endif /* I2_DEBUG */ + if (value.IsObjectType()) value = Utility::Join(value, ';'); From b5a7af126dfc12edaff1ffd33de9d8f7bad7ad11 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Sun, 29 Jul 2018 15:39:02 +0200 Subject: [PATCH 0101/1162] Fixed indentation --- lib/icinga/pluginutility.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 47ff52eb9..e3963b24e 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -70,13 +70,13 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab for (const Dictionary::Pair& kv : env) { String name = kv.second; - String missingMacro; + String missingMacro; Value value = MacroProcessor::ResolveMacros(name, macroResolvers, cr, &missingMacro, MacroProcessor::EscapeCallback(), resolvedMacros, useResolvedMacros); #ifdef I2_DEBUG - if (!missingMacro.IsEmpty()) + if (!missingMacro.IsEmpty()) Log(LogDebug, "PluginUtility") << "Macro '" << name << "' is not defined."; #endif /* I2_DEBUG */ From b9f26bc59fc4019a757a35d23c9269abcbc8903d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 27 Jul 2018 16:55:37 +0200 Subject: [PATCH 0102/1162] Fix regression with MatchAny false conditions on match/regex/cidr_match fixes #6496 refs #6498 --- lib/base/scriptutils.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index cbedd9f97..f8ab8ce00 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -147,7 +147,8 @@ bool ScriptUtils::Regex(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String text = argTexts; boost::smatch what; @@ -189,7 +190,8 @@ bool ScriptUtils::Match(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String text = argTexts; return Utility::Match(pattern, argTexts); @@ -230,7 +232,8 @@ bool ScriptUtils::CidrMatch(const std::vector& args) return false; } - return true; + /* MatchAny: Nothing matched. MatchAll: Everything matched. */ + return mode == MatchAll; } else { String ip = argIps; return Utility::CidrMatch(pattern, ip); From acfef7c10d4ea2d3a610d65b7a097cf6d02ecc3d Mon Sep 17 00:00:00 2001 From: Robert Lindgren Date: Mon, 30 Jul 2018 18:22:22 +0200 Subject: [PATCH 0103/1162] squashfs ignored Add squashfs to check_disk ignore list, used on Ubuntu for snaps. --- doc/10-icinga-template-library.md | 2 +- itl/command-plugins.conf | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a080bb275..1ce1cd45a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -345,7 +345,7 @@ disk\_ignore\_eregi\_path | **Optional.** Regular expression to ignore selected disk\_ignore\_ereg\_path | **Optional.** Regular expression to ignore selected path or partition. Multiple regular expression strings must be defined as array. disk\_timeout | **Optional.** Seconds before connection times out (default: 10). disk\_units | **Optional.** Choose bytes, kB, MB, GB, TB (default: MB). -disk\_exclude\_type | **Optional.** Ignore all filesystems of indicated type. Multiple regular expression strings must be defined as array. Defaults to "none", "tmpfs", "sysfs", "proc", "configfs", "devtmpfs", "devfs", "mtmfs", "tracefs", "cgroup", "fuse.gvfsd-fuse", "fuse.gvfs-fuse-daemon", "fdescfs", "overlay", "nsfs". +disk\_exclude\_type | **Optional.** Ignore all filesystems of indicated type. Multiple regular expression strings must be defined as array. Defaults to "none", "tmpfs", "sysfs", "proc", "configfs", "devtmpfs", "devfs", "mtmfs", "tracefs", "cgroup", "fuse.gvfsd-fuse", "fuse.gvfs-fuse-daemon", "fdescfs", "overlay", "nsfs", "squashfs". ### disk_smb diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 0bf297fd1..89308e913 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1495,7 +1495,8 @@ object CheckCommand "disk" { "fuse.gvfs-fuse-daemon", "fdescfs", "overlay", - "nsfs" + "nsfs", + "squashfs" ] } From 35038f72d61ff064eb2ded76bdc8d406cc8e1dcc Mon Sep 17 00:00:00 2001 From: Christopher Schirner Date: Tue, 31 Jul 2018 10:40:54 +0200 Subject: [PATCH 0104/1162] Invert connected check --- lib/methods/clusterzonechecktask.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 76a6fb2b2..b5a317f8b 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -122,12 +122,12 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che bytesReceivedPerSecond += endpoint->GetBytesReceivedPerSecond(); } - if (!connected) { - cr->SetState(ServiceCritical); - cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); - } else { + if (connected) { cr->SetState(ServiceOK); cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); + } else { + cr->SetState(ServiceCritical); + cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); } /* Check whether the thresholds have been resolved and compare them */ From b870e84904f0dbae1d597a81b5de44effecf4010 Mon Sep 17 00:00:00 2001 From: Christopher Schirner Date: Tue, 31 Jul 2018 10:41:14 +0200 Subject: [PATCH 0105/1162] Only check lag if connected --- lib/methods/clusterzonechecktask.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index b5a317f8b..04056f7c3 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -125,22 +125,22 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che if (connected) { cr->SetState(ServiceOK); cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); + + /* Check whether the thresholds have been resolved and compare them */ + if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) { + cr->SetState(ServiceCritical); + cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) + + " greater than critical threshold: " + Utility::FormatDuration(lagCritical)); + } else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) { + cr->SetState(ServiceWarning); + cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) + + " greater than warning threshold: " + Utility::FormatDuration(lagWarning)); + } } else { cr->SetState(ServiceCritical); cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); } - /* Check whether the thresholds have been resolved and compare them */ - if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) { - cr->SetState(ServiceCritical); - cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) - + " greater than critical threshold: " + Utility::FormatDuration(lagCritical)); - } else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) { - cr->SetState(ServiceWarning); - cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) - + " greater than warning threshold: " + Utility::FormatDuration(lagWarning)); - } - cr->SetPerformanceData(new Array({ new PerfdataValue("slave_lag", zoneLag, false, "s", lagWarning, lagCritical), new PerfdataValue("last_messages_sent", lastMessageSent), From 7231e9db9f119cdcff685c0dddfc974420250eac Mon Sep 17 00:00:00 2001 From: Christopher Schirner Date: Tue, 31 Jul 2018 10:40:54 +0200 Subject: [PATCH 0106/1162] Invert connected check refs #6505 --- lib/methods/clusterzonechecktask.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 76a6fb2b2..b5a317f8b 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -122,12 +122,12 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che bytesReceivedPerSecond += endpoint->GetBytesReceivedPerSecond(); } - if (!connected) { - cr->SetState(ServiceCritical); - cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); - } else { + if (connected) { cr->SetState(ServiceOK); cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); + } else { + cr->SetState(ServiceCritical); + cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); } /* Check whether the thresholds have been resolved and compare them */ From 2831991db4b2b5f3569e5a05ecf35099b49d7c67 Mon Sep 17 00:00:00 2001 From: Christopher Schirner Date: Tue, 31 Jul 2018 10:41:14 +0200 Subject: [PATCH 0107/1162] Only check lag if connected refs #6505 --- lib/methods/clusterzonechecktask.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index b5a317f8b..04056f7c3 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -125,22 +125,22 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che if (connected) { cr->SetState(ServiceOK); cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); + + /* Check whether the thresholds have been resolved and compare them */ + if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) { + cr->SetState(ServiceCritical); + cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) + + " greater than critical threshold: " + Utility::FormatDuration(lagCritical)); + } else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) { + cr->SetState(ServiceWarning); + cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) + + " greater than warning threshold: " + Utility::FormatDuration(lagWarning)); + } } else { cr->SetState(ServiceCritical); cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); } - /* Check whether the thresholds have been resolved and compare them */ - if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) { - cr->SetState(ServiceCritical); - cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) - + " greater than critical threshold: " + Utility::FormatDuration(lagCritical)); - } else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) { - cr->SetState(ServiceWarning); - cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) - + " greater than warning threshold: " + Utility::FormatDuration(lagWarning)); - } - cr->SetPerformanceData(new Array({ new PerfdataValue("slave_lag", zoneLag, false, "s", lagWarning, lagCritical), new PerfdataValue("last_messages_sent", lastMessageSent), From a5a011979944ec230e6ba14e642c9d37f7cbddb9 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 2 Aug 2018 08:45:19 +0200 Subject: [PATCH 0108/1162] Implement the Dictionary#clear script function --- doc/18-library-reference.md | 8 ++++++++ lib/base/dictionary-script.cpp | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/doc/18-library-reference.md b/doc/18-library-reference.md index 5a3209dfe..30277bfdf 100644 --- a/doc/18-library-reference.md +++ b/doc/18-library-reference.md @@ -1428,6 +1428,14 @@ Signature: Removes the item with the specified `key`. Trying to remove an item which does not exist is a no-op. +### Dictionary#clear + +Signature: + + function clear(); + +Removes all items from the dictionary. + ### Dictionary#set Signature: diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp index d188119e5..7d805a59b 100644 --- a/lib/base/dictionary-script.cpp +++ b/lib/base/dictionary-script.cpp @@ -57,6 +57,14 @@ static void DictionaryRemove(const String& key) self->Remove(key); } +static void DictionaryClear() +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Dictionary::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + self->Clear(); +} + static bool DictionaryContains(const String& key) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); @@ -115,6 +123,7 @@ Object::Ptr Dictionary::GetPrototype() { "set", new Function("Dictionary#set", DictionarySet, { "key", "value" }) }, { "get", new Function("Dictionary#get", DictionaryGet, { "key" }) }, { "remove", new Function("Dictionary#remove", DictionaryRemove, { "key" }) }, + { "clear", new Function("Dictionary#clear", DictionaryClear, {}) }, { "contains", new Function("Dictionary#contains", DictionaryContains, { "key" }, true) }, { "shallow_clone", new Function("Dictionary#shallow_clone", DictionaryShallowClone, {}, true) }, { "keys", new Function("Dictionary#keys", DictionaryKeys, {}, true) }, From 56cf64f590cf67a10f60c438e15e4da696bbb9ad Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 5 Jul 2018 14:04:04 +0200 Subject: [PATCH 0109/1162] Improve error message for serializing objects with recursive references --- lib/base/serializer.cpp | 94 ++++++++++++++++++++++++++++++++++----- lib/base/serializer.hpp | 15 +++++++ lib/config/configitem.cpp | 9 ++++ 3 files changed, 108 insertions(+), 10 deletions(-) diff --git a/lib/base/serializer.cpp b/lib/base/serializer.cpp index 7296ec3ce..1bd8b0c8c 100644 --- a/lib/base/serializer.cpp +++ b/lib/base/serializer.cpp @@ -21,10 +21,68 @@ #include "base/type.hpp" #include "base/application.hpp" #include "base/objectlock.hpp" +#include "base/convert.hpp" +#include "base/exception.hpp" +#include +#include using namespace icinga; -static Array::Ptr SerializeArray(const Array::Ptr& input, int attributeTypes) +struct SerializeStackEntry +{ + String Name; + Value Val; +}; + +CircularReferenceError::CircularReferenceError(String message, std::vector path) + : m_Message(message), m_Path(path) +{ } + +const char *CircularReferenceError::what(void) const throw() +{ + return m_Message.CStr(); +} + +std::vector CircularReferenceError::GetPath() const +{ + return m_Path; +} + +struct SerializeStack +{ + std::deque Entries; + + inline void Push(const String& name, const Value& val) + { + Object::Ptr obj; + + if (val.IsObject()) + obj = val; + + if (obj) { + for (const auto& entry : Entries) { + if (entry.Val == obj) { + std::vector path; + for (const auto& entry : Entries) + path.push_back(entry.Name); + path.push_back(name); + BOOST_THROW_EXCEPTION(CircularReferenceError("Cannot serialize object which recursively refers to itself. Attribute path which leads to the cycle: " + boost::algorithm::join(path, " -> "), path)); + } + } + } + + Entries.push_back({ name, obj }); + } + + inline void Pop() + { + Entries.pop_back(); + } +}; + +static Value SerializeInternal(const Value& value, int attributeTypes, SerializeStack& stack); + +static Array::Ptr SerializeArray(const Array::Ptr& input, int attributeTypes, SerializeStack& stack) { ArrayData result; @@ -32,14 +90,19 @@ static Array::Ptr SerializeArray(const Array::Ptr& input, int attributeTypes) ObjectLock olock(input); + int index = 0; + for (const Value& value : input) { - result.emplace_back(Serialize(value, attributeTypes)); + stack.Push(Convert::ToString(index), value); + result.emplace_back(SerializeInternal(value, attributeTypes, stack)); + stack.Pop(); + index++; } return new Array(std::move(result)); } -static Dictionary::Ptr SerializeDictionary(const Dictionary::Ptr& input, int attributeTypes) +static Dictionary::Ptr SerializeDictionary(const Dictionary::Ptr& input, int attributeTypes, SerializeStack& stack) { DictionaryData result; @@ -48,13 +111,15 @@ static Dictionary::Ptr SerializeDictionary(const Dictionary::Ptr& input, int att ObjectLock olock(input); for (const Dictionary::Pair& kv : input) { - result.emplace_back(kv.first, Serialize(kv.second, attributeTypes)); + stack.Push(kv.first, kv.second); + result.emplace_back(kv.first, SerializeInternal(kv.second, attributeTypes, stack)); + stack.Pop(); } return new Dictionary(std::move(result)); } -static Object::Ptr SerializeObject(const Object::Ptr& input, int attributeTypes) +static Object::Ptr SerializeObject(const Object::Ptr& input, int attributeTypes, SerializeStack& stack) { Type::Ptr type = input->GetReflectionType(); @@ -73,7 +138,10 @@ static Object::Ptr SerializeObject(const Object::Ptr& input, int attributeTypes) if (strcmp(field.Name, "type") == 0) continue; - fields.emplace_back(field.Name, Serialize(input->GetField(i), attributeTypes)); + Value value = input->GetField(i); + stack.Push(field.Name, value); + fields.emplace_back(field.Name, SerializeInternal(input->GetField(i), attributeTypes, stack)); + stack.Pop(); } fields.emplace_back("type", type->GetName()); @@ -158,7 +226,7 @@ static Object::Ptr DeserializeObject(const Object::Ptr& object, const Dictionary return instance; } -Value icinga::Serialize(const Value& value, int attributeTypes) +static Value SerializeInternal(const Value& value, int attributeTypes, SerializeStack& stack) { if (!value.IsObject()) return value; @@ -168,14 +236,20 @@ Value icinga::Serialize(const Value& value, int attributeTypes) Array::Ptr array = dynamic_pointer_cast(input); if (array) - return SerializeArray(array, attributeTypes); + return SerializeArray(array, attributeTypes, stack); Dictionary::Ptr dict = dynamic_pointer_cast(input); if (dict) - return SerializeDictionary(dict, attributeTypes); + return SerializeDictionary(dict, attributeTypes, stack); - return SerializeObject(input, attributeTypes); + return SerializeObject(input, attributeTypes, stack); +} + +Value icinga::Serialize(const Value& value, int attributeTypes) +{ + SerializeStack stack; + return SerializeInternal(value, attributeTypes, stack); } Value icinga::Deserialize(const Value& value, bool safe_mode, int attributeTypes) diff --git a/lib/base/serializer.hpp b/lib/base/serializer.hpp index b5e8cd31a..85e7d454d 100644 --- a/lib/base/serializer.hpp +++ b/lib/base/serializer.hpp @@ -23,10 +23,25 @@ #include "base/i2-base.hpp" #include "base/type.hpp" #include "base/value.hpp" +#include "base/exception.hpp" namespace icinga { +class CircularReferenceError : virtual public user_error +{ +public: + CircularReferenceError(String message, std::vector path); + ~CircularReferenceError() throw() = default; + + const char *what(void) const throw() final; + std::vector GetPath() const; + +private: + String m_Message; + std::vector m_Path; +}; + Value Serialize(const Value& value, int attributeTypes = FAState); Value Deserialize(const Value& value, bool safe_mode = false, int attributeTypes = FAState); Value Deserialize(const Object::Ptr& object, const Value& value, bool safe_mode = false, int attributeTypes = FAState); diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 4e4eacc29..e20612860 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -36,6 +36,7 @@ #include "base/json.hpp" #include "base/exception.hpp" #include "base/function.hpp" +#include #include #include @@ -289,6 +290,14 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) throw; } + Value serializedObject; + + try { + serializedObject = Serialize(dobj, FAConfig); + } catch (const CircularReferenceError& ex) { + BOOST_THROW_EXCEPTION(ValidationError(dobj, ex.GetPath(), "Circular references are not allowed")); + } + Dictionary::Ptr persistentItem = new Dictionary({ { "type", type->GetName() }, { "name", GetName() }, From 3866386b6d7c60572d13de5e3ce6b984fa044a9c Mon Sep 17 00:00:00 2001 From: Aaron Bishop Date: Thu, 2 Aug 2018 10:35:39 -0400 Subject: [PATCH 0110/1162] Modernize cmake * Able to use as subfolder * Able to install (and import again in cmake) * Able to disable tests * Able to disable samples --- CMakeLists.txt | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 667d2881d..8cac0a1f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,42 @@ -cmake_minimum_required (VERSION 2.8.0) -project (utf8cpp) -include_directories ("${PROJECT_SOURCE_DIR}/source") +cmake_minimum_required (VERSION 3.0.2) +project (utf8cpp VERSION 2.3.5 LANGUAGES CXX) -add_executable(smoke ${PROJECT_SOURCE_DIR}/test_drivers/smoke_test/test.cpp) -add_executable(negative ${PROJECT_SOURCE_DIR}/test_drivers/negative/negative.cpp) -add_executable(utf8reader ${PROJECT_SOURCE_DIR}/test_drivers/utf8reader/utf8reader.cpp) +option(UTF8_TESTS "Enable tests for UTF8-CPP" On) +option(UTF8_SAMPLES "Enable building samples for UTF8-CPP" On) -add_executable(docsample ${PROJECT_SOURCE_DIR}/samples/docsample.cpp) +add_library(utf8cpp INTERFACE) +target_include_directories(utf8cpp INTERFACE + "$" + $ +) +add_library(utf8::cpp ALIAS utf8cpp) -enable_testing() -add_test(smoke_test smoke) -add_test(negative_test negative ${PROJECT_SOURCE_DIR}/test_data/negative/utf8_invalid.txt) +if(WIN32 AND NOT CYGWIN) + set(DEF_INSTALL_CMAKE_DIR CMake) +else() + set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/utf8cpp) +endif() + +install(DIRECTORY source/ DESTINATION include/utf8cpp) +install(TARGETS utf8cpp EXPORT utf8cppConfig) +install(EXPORT utf8cppConfig DESTINATION ${DEF_INSTALL_CMAKE_DIR}) + +if(UTF8_SAMPLES) + add_executable(utf8reader ${PROJECT_SOURCE_DIR}/test_drivers/utf8reader/utf8reader.cpp) + add_executable(docsample ${PROJECT_SOURCE_DIR}/samples/docsample.cpp) + + target_link_libraries(utf8reader PRIVATE utf8::cpp) + target_link_libraries(docsample PRIVATE utf8::cpp) +endif() + +if(UTF8_TESTS) + add_executable(smoke ${PROJECT_SOURCE_DIR}/test_drivers/smoke_test/test.cpp) + add_executable(negative ${PROJECT_SOURCE_DIR}/test_drivers/negative/negative.cpp) + + target_link_libraries(smoke PRIVATE utf8::cpp) + target_link_libraries(negative PRIVATE utf8::cpp) + + enable_testing() + add_test(smoke_test smoke) + add_test(negative_test negative ${PROJECT_SOURCE_DIR}/test_data/negative/utf8_invalid.txt) +endif() From b6c674e71696575f30efeb4f7f9b130a029cc854 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 2 Aug 2018 14:42:14 +0200 Subject: [PATCH 0111/1162] Update windows build scripts --- .gitignore | 6 +--- appveyor.yml | 40 ++++++++++++++++--------- tools/win32/build.ps1 | 12 ++++---- tools/win32/configure.ps1 | 43 ++++++++++++++++++--------- tools/win32/download-openssl.ps1 | 50 ++++++++++++++++++++++++-------- tools/win32/test.ps1 | 14 +++++---- 6 files changed, 111 insertions(+), 54 deletions(-) diff --git a/.gitignore b/.gitignore index b3d357ecc..0e2ed3ffd 100644 --- a/.gitignore +++ b/.gitignore @@ -11,11 +11,7 @@ tickets.pickle ## Build artifacts -build/ -build-debug/ -build-release/ -build32/ -build64/ +build*/ debug/ release/ cmake-build-debug diff --git a/appveyor.yml b/appveyor.yml index 05c72cd75..6e7f09b73 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,9 +2,11 @@ version: 2.9.0.dev.{build} os: Visual Studio 2017 +platform: x64 environment: CMAKE_GENERATOR: "Visual Studio 15 2017 Win64" + VSCMD_VER: 15.0 BOOST_ROOT: 'C:\Libraries\boost_1_65_1' BOOST_LIBRARYDIR: 'C:\Libraries\boost_1_65_1\lib64-msvc-14.1' BISON_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_bison.exe' @@ -16,36 +18,46 @@ branches: cache: - build -> appveyor.yml -- vendor -> tools\win32\download-openssl.ps1 - C:\ProgramData\chocolatey\lib\winflexbison3 install: -- ps: | - if (-not (Test-Path "vendor\OpenSSL")) { - .\tools\win32\download-openssl.ps1 - if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } - } - ps: | if (-not (Test-Path "C:\ProgramData\chocolatey\lib\winflexbison3")) { - choco install winflexbison3 - if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + & choco install winflexbison3 + if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } } +# why that env handling, see +# https://help.appveyor.com/discussions/questions/18777-how-to-use-vcvars64bat-from-powershell#comment_44999171 before_build: - ps: | - .\tools\win32\configure.ps1 - if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + $bits = $env:PLATFORM -replace "^x", "" + cmd.exe /c "call `"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars${bits}.bat`" && set > `"${env:TEMP}\vcvars.txt`"" + Get-Content "$env:TEMP\vcvars.txt" | Foreach-Object { + if ($_ -match "^(VSCMD.*?)=(.*)$") { + Set-Content ("env:" + $matches[1]) $matches[2] + } + } + + if (-not (Test-Path ".\build\vendor\OpenSSL")) { + & .\tools\win32\download-openssl.ps1 + if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + } + + & .\tools\win32\configure.ps1 + if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + del build\Icinga*.msi build_script: - ps: | - .\tools\win32\build.ps1 - if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + & .\tools\win32\build.ps1 + if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } test_script: - ps: | - .\tools\win32\test.ps1 - if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } + & .\tools\win32\test.ps1 + if ($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode) } # Disable until we really need them # https://github.com/Icinga/icinga2/issues/6106 diff --git a/tools/win32/build.ps1 b/tools/win32/build.ps1 index 111071518..d9dba5f94 100644 --- a/tools/win32/build.ps1 +++ b/tools/win32/build.ps1 @@ -1,7 +1,9 @@ -[string]$pwd = Get-Location +if (-not (Test-Path env:ICINGA2_BUILDPATH)) { + $env:ICINGA2_BUILDPATH = '.\build' +} -if (-not (Test-Path build)) { - Write-Host "Path '$pwd\build' does not exist!" +if (-not (Test-Path $env:ICINGA2_BUILDPATH)) { + Write-Host "Path '$env:ICINGA2_BUILDPATH' does not exist!" exit 1 } @@ -12,5 +14,5 @@ if (-not ($env:PATH -contains $env:CMAKE_PATH)) { $env:PATH = $env:CMAKE_PATH + ';' + $env:PATH } -cmake.exe --build build --target PACKAGE --config RelWithDebInfo -if ($lastexitcode -ne 0) { exit $lastexitcode } \ No newline at end of file +cmake.exe --build "$env:ICINGA2_BUILDPATH" --target PACKAGE --config RelWithDebInfo +if ($lastexitcode -ne 0) { exit $lastexitcode } diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1 index cdd66512f..1f40875ce 100644 --- a/tools/win32/configure.ps1 +++ b/tools/win32/configure.ps1 @@ -1,8 +1,12 @@ -if (-not (Test-Path build)) { - mkdir build +if (-not (Test-Path env:ICINGA2_BUILDPATH)) { + $env:ICINGA2_BUILDPATH = '.\build' } -if (-not (Test-Path install)) { - mkdir install + +if (-not (Test-Path "$env:ICINGA2_BUILDPATH")) { + mkdir "$env:ICINGA2_BUILDPATH" | out-null +} +if (-not (Test-Path "$env:ICINGA2_BUILDPATH\install")) { + mkdir "$env:ICINGA2_BUILDPATH\install" | out-null } if (-not (Test-Path env:CMAKE_PATH)) { $env:CMAKE_PATH = 'C:\Program Files\CMake\bin' @@ -11,13 +15,24 @@ if (-not ($env:PATH -contains $env:CMAKE_PATH)) { $env:PATH = $env:CMAKE_PATH + ';' + $env:PATH } -[string]$pwd = Get-Location - if (-not (Test-Path env:CMAKE_GENERATOR)) { $env:CMAKE_GENERATOR = 'Visual Studio 15 2017 Win64' } if (-not (Test-Path env:OPENSSL_ROOT_DIR)) { - $env:OPENSSL_ROOT_DIR = $pwd + '\vendor\OpenSSL' + if (Test-Path env:VSCMD_ARG_TGT_ARCH) { + $OpenSSL_arch = $env:VSCMD_ARG_TGT_ARCH + } else { + throw "Missing env variable VSCMD_ARG_TGT_ARCH" + } + + if (Test-Path env:VSCMD_VER) { + $VSmajor = $env:VSCMD_VER -replace "\..*$", "" + $OpenSSL_vcbuild = "vc${VSmajor}0" + } else { + throw "Missing env variable VSCMD_VER" + } + + $env:OPENSSL_ROOT_DIR = "$env:ICINGA2_BUILDPATH\vendor\OpenSSL-$OpenSSL_arch-$OpenSSL_vcbuild" } if (-not (Test-Path env:BOOST_ROOT)) { $env:BOOST_ROOT = 'c:\local\boost_1_65_1' @@ -32,12 +47,15 @@ if (-not (Test-Path env:BISON_BINARY)) { $env:BISON_BINARY = 'C:\ProgramData\chocolatey\bin\win_bison.exe' } -cd build +$sourcePath = Get-Location -& cmake.exe .. ` +cd "$env:ICINGA2_BUILDPATH" + +#-DCMAKE_INSTALL_PREFIX="C:\Program Files\Icinga2" ` + +& cmake.exe "$sourcePath" ` -DCMAKE_BUILD_TYPE=RelWithDebInfo ` -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX ` - -DCMAKE_INSTALL_PREFIX="..\install" ` -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF ` -DOPENSSL_ROOT_DIR="$env:OPENSSL_ROOT_DIR" ` -DBOOST_ROOT="$env:BOOST_ROOT" ` @@ -45,9 +63,8 @@ cd build -DFLEX_EXECUTABLE="$env:FLEX_BINARY" ` -DBISON_EXECUTABLE="$env:BISON_BINARY" +cd "$sourcePath" + if ($lastexitcode -ne 0) { - cd .. exit $lastexitcode } - -cd .. diff --git a/tools/win32/download-openssl.ps1 b/tools/win32/download-openssl.ps1 index 1ebe348f9..0e074e6ae 100644 --- a/tools/win32/download-openssl.ps1 +++ b/tools/win32/download-openssl.ps1 @@ -1,7 +1,19 @@ -[string]$pwd = Get-Location +$ErrorActionPreference = "Stop" + $OpenSSL_version = '1.1.0g-1' -$OpenSSL_arch = 'x64' -$OpenSSL_vcbuild = 'vc150' + +if (Test-Path env:VSCMD_ARG_TGT_ARCH) { + $OpenSSL_arch = $env:VSCMD_ARG_TGT_ARCH +} else { + throw "Missing env variable VSCMD_ARG_TGT_ARCH" +} +if (Test-Path env:VSCMD_VER) { + $VSmajor = $env:VSCMD_VER -replace "\..*$", "" + $OpenSSL_vcbuild = "vc${VSmajor}0" +} else { + throw "Missing env variable VSCMD_VER" +} + $OpenSSL_fileversion = $OpenSSL_version.Replace('.', '_').Split('-')[0] $OpenSSL_file = [string]::Format( 'openssl-{0}-binary-icinga-{1}-{2}.zip', @@ -15,12 +27,23 @@ $OpenSSL_url = [string]::Format( $OpenSSL_file ) -$OpenSSL_zip_location = $pwd + '\vendor\' + $OpenSSL_file -$vendor_path = $pwd + '\vendor' -$OpenSSL_vendor_path = $vendor_path + '\OpenSSL' +if (-not (Test-Path env:ICINGA2_BUILDPATH)) { + $env:ICINGA2_BUILDPATH = '.\build' +} +$vendor_path = $env:ICINGA2_BUILDPATH + '\vendor' +$OpenSSL_zip_location = $env:ICINGA2_BUILDPATH + '\vendor\' + $OpenSSL_file +$OpenSSL_vendor_path = "$vendor_path\OpenSSL-$OpenSSL_arch-$OpenSSL_vcbuild" + +# Tune Powershell TLS protocols +$AllProtocols = [System.Net.SecurityProtocolType]'Tls11,Tls12' +[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols + +if (-not (Test-Path $env:ICINGA2_BUILDPATH)) { + mkdir $env:ICINGA2_BUILDPATH | out-null +} if (-not (Test-Path $vendor_path)) { - mkdir $vendor_path + mkdir $vendor_path | out-null } if (Test-Path $OpenSSL_zip_location) { @@ -30,21 +53,24 @@ if (Test-Path $OpenSSL_zip_location) { $progressPreference = 'silentlyContinue' Invoke-WebRequest -Uri $OpenSSL_url -OutFile $OpenSSL_zip_location - if ($lastexitcode -ne 0){ exit $lastexitcode } $progressPreference = 'Continue' - + if (Test-Path $OpenSSL_vendor_path) { Remove-Item -Recurse $OpenSSL_vendor_path } } if (-not (Test-Path $OpenSSL_vendor_path)) { - mkdir $OpenSSL_vendor_path + mkdir $OpenSSL_vendor_path | out-null Write-Output "Extracting ZIP to $OpenSSL_vendor_path" Add-Type -AssemblyName System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::ExtractToDirectory($OpenSSL_zip_location, $OpenSSL_vendor_path) - if ($lastexitcode -ne 0){ exit $lastexitcode } + $pwd = Get-Location + [System.IO.Compression.ZipFile]::ExtractToDirectory( + (Join-Path -path $pwd -childpath $OpenSSL_zip_location), + (Join-Path -path $pwd -childpath $OpenSSL_vendor_path) + ) + if ($lastexitcode -ne 0){ exit $lastexitcode } } else { Write-Output "OpenSSL is already available at $OpenSSL_vendor_path" } diff --git a/tools/win32/test.ps1 b/tools/win32/test.ps1 index 913c82c58..81fe8e6fa 100644 --- a/tools/win32/test.ps1 +++ b/tools/win32/test.ps1 @@ -1,7 +1,11 @@ +if (-not (Test-Path env:ICINGA2_BUILDPATH)) { + $env:ICINGA2_BUILDPATH = 'build' +} + [string]$pwd = Get-Location -if (-not (Test-Path build)) { - Write-Host "Path '$pwd\build' does not exist!" +if (-not (Test-Path $env:ICINGA2_BUILDPATH)) { + Write-Host "Path '$pwd\$env:ICINGA2_BUILDPATH' does not exist!" exit 1 } @@ -12,12 +16,12 @@ if (-not ($env:PATH -contains $env:CMAKE_PATH)) { $env:PATH = $env:CMAKE_PATH + ';' + $env:PATH } -cd build +cd "$env:ICINGA2_BUILDPATH" -ctest.exe -C RelWithDebInfo -T test -O build/Test.xml --output-on-failure +ctest.exe -C RelWithDebInfo -T test -O $env:ICINGA2_BUILDPATH/Test.xml --output-on-failure if ($lastexitcode -ne 0) { cd .. exit $lastexitcode } -cd .. \ No newline at end of file +cd .. From 51b900b30728d7f6c99f402511f6090687ea6d5c Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Sun, 5 Aug 2018 15:18:09 +0200 Subject: [PATCH 0112/1162] Reset terminal on erroneous console exit This ensures that the terminal is resetted on an erroneous exit when using the Icinga 2 console. refs #6382 --- lib/cli/consolecommand.cpp | 9 +++++++++ lib/cli/editline.hpp | 1 + 2 files changed, 10 insertions(+) diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index 774879207..f62430977 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -532,6 +532,11 @@ void ConsoleCommand::ExecuteScriptCompletionHandler(boost::mutex& mutex, boost:: } catch (const std::exception& ex) { Log(LogCritical, "ConsoleCommand") << "HTTP query failed: " << ex.what(); + + /* Ensures that the terminal state is resetted */ + rl_deprep_terminal(); + + Application::Exit(EXIT_FAILURE); } } @@ -554,6 +559,10 @@ void ConsoleCommand::AutocompleteScriptCompletionHandler(boost::mutex& mutex, bo } catch (const std::exception& ex) { Log(LogCritical, "ConsoleCommand") << "HTTP query failed: " << ex.what(); + + /* Ensures that the terminal state is resetted */ + rl_deprep_terminal(); + Application::Exit(EXIT_FAILURE); } } diff --git a/lib/cli/editline.hpp b/lib/cli/editline.hpp index f284c207b..cd78e5d57 100644 --- a/lib/cli/editline.hpp +++ b/lib/cli/editline.hpp @@ -24,6 +24,7 @@ extern "C" { char *readline(const char *prompt); int add_history(const char *line); +void rl_deprep_terminal(); typedef char *ELFunction(const char *, int); From eea42c6807f2c2192aaa7fe18884c94e77a87f0f Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Sun, 5 Aug 2018 20:17:43 +0200 Subject: [PATCH 0113/1162] Fix windows build --- lib/cli/consolecommand.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index f62430977..e8c1a50d6 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -533,9 +533,10 @@ void ConsoleCommand::ExecuteScriptCompletionHandler(boost::mutex& mutex, boost:: Log(LogCritical, "ConsoleCommand") << "HTTP query failed: " << ex.what(); +#ifdef HAVE_EDITLINE /* Ensures that the terminal state is resetted */ rl_deprep_terminal(); - +#endif /* HAVE_EDITLINE */ Application::Exit(EXIT_FAILURE); } @@ -560,8 +561,10 @@ void ConsoleCommand::AutocompleteScriptCompletionHandler(boost::mutex& mutex, bo Log(LogCritical, "ConsoleCommand") << "HTTP query failed: " << ex.what(); +#ifdef HAVE_EDITLINE /* Ensures that the terminal state is resetted */ rl_deprep_terminal(); +#endif /* HAVE_EDITLINE */ Application::Exit(EXIT_FAILURE); } From 8bfd4197023fd5c8a57323928604a5411d651387 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 2 Aug 2018 10:17:04 +0200 Subject: [PATCH 0114/1162] Implement references --- doc/17-language-reference.md | 12 ++++++++ lib/base/CMakeLists.txt | 1 + lib/base/reference-script.cpp | 52 ++++++++++++++++++++++++++++++++ lib/base/reference.cpp | 55 +++++++++++++++++++++++++++++++++ lib/base/reference.hpp | 57 +++++++++++++++++++++++++++++++++++ lib/config/config_parser.yy | 9 ++++++ lib/config/expression.cpp | 42 ++++++++++++++++++++++++++ lib/config/expression.hpp | 23 ++++++++++++++ 8 files changed, 251 insertions(+) create mode 100644 lib/base/reference-script.cpp create mode 100644 lib/base/reference.cpp create mode 100644 lib/base/reference.hpp diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 9bd31d6b7..285a9fcb9 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -168,6 +168,8 @@ Operator | Precedence | Examples (Result) | Descript ~ | 2 | ~true (false) | Bitwise negation of the operand + | 2 | +3 | Unary plus - | 2 | -3 | Unary minus +& | 2 | &var (reference to 'var') | Reference operator +* | 2 | *var | Indirection operator * | 3 | 5m * 10 (3000) | Multiplies two numbers / | 3 | 5m / 5 (60) | Divides two numbers % | 3 | 17 % 12 (5) | Remainder after division @@ -191,6 +193,16 @@ in | 7 | "foo" in [ "foo", "bar" ] (true) | Element = | 12 | a = 3 | Assignment => | 15 | x => x * x (function with arg x) | Lambda, for loop +### References + +A reference to a value can be obtained using the `&` operator. The `*` operator can be used +to dereference a reference: + + var value = "Hello!" + var p = &value /* p refers to value */ + *p = "Hi!" + log(value) // Prints "Hi!" because the variable was changed + ### Function Calls Functions can be called using the `()` operator: diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index c02001ccc..d86f676d2 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -62,6 +62,7 @@ set(base_SOURCES perfdatavalue.cpp perfdatavalue.hpp perfdatavalue-ti.hpp primitivetype.cpp primitivetype.hpp process.cpp process.hpp + reference.cpp reference.hpp reference-script.cpp registry.hpp ringbuffer.cpp ringbuffer.hpp scriptframe.cpp scriptframe.hpp diff --git a/lib/base/reference-script.cpp b/lib/base/reference-script.cpp new file mode 100644 index 000000000..7254333aa --- /dev/null +++ b/lib/base/reference-script.cpp @@ -0,0 +1,52 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/reference.hpp" +#include "base/function.hpp" +#include "base/functionwrapper.hpp" +#include "base/scriptframe.hpp" +#include "base/exception.hpp" + +using namespace icinga; + +static void ReferenceSet(const Value& value) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Reference::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + self->Set(value); +} + +static Value ReferenceGet() +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Reference::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + return self->Get(); +} + +Object::Ptr Reference::GetPrototype() +{ + static Dictionary::Ptr prototype = new Dictionary({ + { "set", new Function("Reference#set", ReferenceSet, { "value" }) }, + { "get", new Function("Reference#get", ReferenceGet, {}, true) }, + }); + + return prototype; +} diff --git a/lib/base/reference.cpp b/lib/base/reference.cpp new file mode 100644 index 000000000..53f6e9e2e --- /dev/null +++ b/lib/base/reference.cpp @@ -0,0 +1,55 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/reference.hpp" +#include "base/debug.hpp" +#include "base/primitivetype.hpp" +#include "base/dictionary.hpp" +#include "base/configwriter.hpp" +#include "base/convert.hpp" +#include "base/exception.hpp" + +using namespace icinga; + +REGISTER_PRIMITIVE_TYPE_NOINST(Reference, Object, Reference::GetPrototype()); + +Reference::Reference(const Object::Ptr& parent, const String& index) + : m_Parent(parent), m_Index(index) +{ +} + +Value Reference::Get() const +{ + return m_Parent->GetFieldByName(m_Index, true, DebugInfo()); +} + +void Reference::Set(const Value& value) +{ + m_Parent->SetFieldByName(m_Index, value, DebugInfo()); +} + +Object::Ptr Reference::GetParent() const +{ + return m_Parent; +} + +String Reference::GetIndex() const +{ + return m_Index; +} diff --git a/lib/base/reference.hpp b/lib/base/reference.hpp new file mode 100644 index 000000000..347a81db6 --- /dev/null +++ b/lib/base/reference.hpp @@ -0,0 +1,57 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#ifndef REFERENCE_H +#define REFERENCE_H + +#include "base/i2-base.hpp" +#include "base/objectlock.hpp" +#include "base/value.hpp" + +namespace icinga +{ + +/** + * A reference. + * + * @ingroup base + */ +class Reference final : public Object +{ +public: + DECLARE_OBJECT(Reference); + + Reference(const Object::Ptr& parent, const String& index); + + Value Get() const; + void Set(const Value& value); + + Object::Ptr GetParent() const; + String GetIndex() const; + + static Object::Ptr GetPrototype(); + +private: + Object::Ptr m_Parent; + String m_Index; +}; + +} + +#endif /* REFERENCE_H */ diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 1a47c6932..497df8a38 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -227,6 +227,7 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig %left T_PLUS T_MINUS %left T_MULTIPLY T_DIVIDE_OP T_MODULO %left UNARY_MINUS UNARY_PLUS +%right REF_OP DEREF_OP %right '!' '~' %left '.' '(' '[' %left T_VAR T_THIS T_GLOBALS T_LOCALS @@ -881,6 +882,14 @@ rterm_no_side_effect_no_dict: T_STRING $$ = new VariableExpression(*$1, @1); delete $1; } + | T_MULTIPLY rterm %prec DEREF_OP + { + $$ = new DerefExpression(std::unique_ptr($2), @$); + } + | T_BINARY_AND rterm %prec REF_OP + { + $$ = new RefExpression(std::unique_ptr($2), @$); + } | '!' rterm { $$ = new LogicalNegateExpression(std::unique_ptr($2), @$); diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 938deb69b..94a966375 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -28,6 +28,7 @@ #include "base/exception.hpp" #include "base/scriptglobal.hpp" #include "base/loader.hpp" +#include "base/reference.hpp" #include #include @@ -156,6 +157,47 @@ bool VariableExpression::GetReference(ScriptFrame& frame, bool init_dict, Value return true; } +ExpressionResult RefExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const +{ + Value parent; + String index; + + if (!m_Operand->GetReference(frame, false, &parent, &index, &dhint)) + BOOST_THROW_EXCEPTION(ScriptError("Cannot obtain reference for expression.", m_DebugInfo)); + + if (!parent.IsObject()) + BOOST_THROW_EXCEPTION(ScriptError("Cannot obtain reference for expression because parent is not an object.", m_DebugInfo)); + + return new Reference(parent, index); +} + +ExpressionResult DerefExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const +{ + ExpressionResult operand = m_Operand->Evaluate(frame); + CHECK_RESULT(operand); + + Object::Ptr obj = operand.GetValue(); + Reference::Ptr ref = dynamic_pointer_cast(obj); + + if (!ref) + BOOST_THROW_EXCEPTION(ScriptError("Invalid reference specified.", GetDebugInfo())); + + return ref->Get(); +} + +bool DerefExpression::GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const +{ + ExpressionResult operand = m_Operand->Evaluate(frame); + if (operand.GetCode() != ResultOK) + return false; + + Reference::Ptr ref = operand.GetValue(); + + *parent = ref->GetParent(); + *index = ref->GetIndex(); + return true; +} + ExpressionResult NegateExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { ExpressionResult operand = m_Operand->Evaluate(frame); diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index ce3f438e6..ff25519b7 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -324,6 +324,29 @@ private: friend void BindToScope(std::unique_ptr& expr, ScopeSpecifier scopeSpec); }; +class DerefExpression final : public UnaryExpression +{ +public: + DerefExpression(std::unique_ptr operand, const DebugInfo& debugInfo = DebugInfo()) + : UnaryExpression(std::move(operand), debugInfo) + { } + +protected: + ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; + bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const override; +}; + +class RefExpression final : public UnaryExpression +{ +public: + RefExpression(std::unique_ptr operand, const DebugInfo& debugInfo = DebugInfo()) + : UnaryExpression(std::move(operand), debugInfo) + { } + +protected: + ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; +}; + class NegateExpression final : public UnaryExpression { public: From 137f5363c486614b7df2b2a17ef8aa3c3d720858 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 7 Aug 2018 09:57:08 +0200 Subject: [PATCH 0115/1162] icinga::PackObject(): shorten conversion to string refs #6524 --- lib/base/object-packer.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/base/object-packer.cpp b/lib/base/object-packer.cpp index 988504fe7..3f0a571d8 100644 --- a/lib/base/object-packer.cpp +++ b/lib/base/object-packer.cpp @@ -262,7 +262,5 @@ String icinga::PackObject(const Value& value) StringBuilder builder; PackAny(value, builder); - String result; - result.insert(result.End(), builder.begin(), builder.end()); - return std::move(result); + return String(builder.begin(), builder.end()); } From 8c3d9ca1118d2442cbb1f68fbbcd1b8bfb11bf39 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 7 Aug 2018 13:37:57 +0200 Subject: [PATCH 0116/1162] Document default of User#enable_notifications --- doc/09-object-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 2d81d3ee3..34ea958e8 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1697,7 +1697,7 @@ Configuration Attributes: pager | String | **Optional.** A pager string for this user. Useful for notification commands. vars | Dictionary | **Optional.** A dictionary containing custom attributes that are specific to this user. groups | Array of object names | **Optional.** An array of group names. - enable\_notifications | Boolean | **Optional.** Whether notifications are enabled for this user. + enable\_notifications | Boolean | **Optional.** Whether notifications are enabled for this user. Defaults to true. period | Object name | **Optional.** The name of a time period which determines when a notification for this user should be triggered. Not set by default. types | Array | **Optional.** A set of type filters when a notification for this user should be triggered. By default everything is matched. states | Array | **Optional.** A set of state filters when a notification for this should be triggered. By default everything is matched. From 1e4ee94f073c21476a9626c9c7d457a001d23373 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 31 Jul 2018 16:46:11 +0200 Subject: [PATCH 0117/1162] cmake: Improve InstallConfig for stable path handling * similar to install() a non absolute path is prefixed with CMAKE_INSTALL_PREFIX on runtime * in case of CPack path with be prefixed with share/skel/ * DESTDIR is prefixed as well Also see https://cmake.org/cmake/help/latest/command/install.html --- cmake/InstallConfig.cmake | 45 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index f01357c79..aa39b9dfb 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -15,38 +15,47 @@ # along with this program; if not, write to the Free Software Foundation # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +# Install $src into directory $dest - usually only used for config files +# +# * similar to install() a non absolute path is prefixed with CMAKE_INSTALL_PREFIX on runtime +# * in case of CPack path with be prefixed with share/skel/ +# * DESTDIR is prefixed as well +# +# also see https://cmake.org/cmake/help/latest/command/install.html function(install_if_not_exists src dest) - set(real_dest "${dest}") if(NOT IS_ABSOLUTE "${src}") set(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}") endif() + get_filename_component(src_name "${src}" NAME) - get_filename_component(basename_dest "${src}" NAME) - string(REPLACE "/" "\\\\" nsis_src "${src}") - string(REPLACE "/" "\\\\" nsis_dest_dir "${real_dest}") - string(REPLACE "/" "\\\\" nsis_dest "${real_dest}/${basename_dest}") + install(CODE " - if(\"\$ENV{DESTDIR}\" STREQUAL \"\") - set(target_dir \${CMAKE_INSTALL_PREFIX}) + set(dest \"${dest}\") + + if (\"\${CMAKE_INSTALL_PREFIX}\" MATCHES .*/_CPack_Packages/.*) + set(dest \"share/skel/\${dest}\") + set(force_overwrite TRUE) else() - set(target_dir \$ENV{DESTDIR}) + set(force_overwrite FALSE) endif() - if(\${CMAKE_INSTALL_PREFIX} MATCHES .*/_CPack_Packages/.* OR NOT EXISTS \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${skel_prefix}${dest}/${src_name}\") - message(STATUS \"Installing: \$ENV{DESTDIR}${dest}/${src_name}\") - if(\${CMAKE_INSTALL_PREFIX} MATCHES .*/_CPack_Packages/.*) - set(skel_prefix \"share/skel/\") - else() - set(skel_prefix \"\") - endif() - execute_process(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\" - \"\${target_dir}/\${skel_prefix}${dest}/${src_name}\" + + if(NOT IS_ABSOLUTE \"\${dest}\") + set(dest \"\${CMAKE_INSTALL_PREFIX}/\${dest}\") + endif() + + set(full_dest \"\$ENV{DESTDIR}\${dest}/${src_name}\") + + if(force_overwrite OR NOT EXISTS \"\${full_dest}\") + message(STATUS \"Installing: ${src} into \${full_dest}\") + + execute_process(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\" \"\${full_dest}\" RESULT_VARIABLE copy_result ERROR_VARIABLE error_output) if(copy_result) message(FATAL_ERROR \${error_output}) endif() else() - message(STATUS \"Skipping : \${target_dir}/${dest}/${src_name}\") + message(STATUS \"Skipping : \${full_dest}\") endif() ") endfunction(install_if_not_exists) From a7a012272f0d2d7f440218cfc4e779c783a2cb91 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Wed, 1 Aug 2018 09:40:48 +0200 Subject: [PATCH 0118/1162] travis: Stop when one of the commands fail --- .travis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 89b52bdd8..6963d0514 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,16 +36,16 @@ addons: before_script: - if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then - mkdir build; - cd build; + mkdir build && + cd build && cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 -DICINGA2_PLUGINDIR=/tmp/icinga2/sbin; fi script: - if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then - make; - make test; - make install; - /tmp/icinga2/sbin/icinga2 --version; + make && + make test && + make install && + /tmp/icinga2/sbin/icinga2 --version && /tmp/icinga2/sbin/icinga2 daemon -C -DRunAsUser=$(id -u -n) -DRunAsGroup=$(id -g -n); fi From 9fbc40615a747b2d5236ed499b0eca9c6d24e2ef Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 31 Jul 2018 11:59:09 +0200 Subject: [PATCH 0119/1162] Improve path handling in cmake and daemon --- CMakeLists.txt | 30 +- INSTALL.md | 16 +- cmake/SetFullDir.cmake | 26 ++ config.h.cmake | 21 +- doc/07-agent-based-monitoring.md | 3 +- doc/08-advanced-topics.md | 2 +- doc/09-object-types.md | 28 +- doc/11-cli-commands.md | 3 +- doc/15-troubleshooting.md | 6 +- doc/17-language-reference.md | 65 ++- doc/icinga2.8 | 6 +- etc/CMakeLists.txt | 61 ++- etc/icinga2/conf.d/commands.conf | 8 +- etc/icinga2/features-available/debuglog.conf | 3 +- etc/icinga2/features-available/mainlog.conf | 3 +- etc/initsystem/icinga2.init.d.cmake | 10 +- etc/initsystem/icinga2.service.cmake | 2 +- etc/initsystem/icinga2.sysconfig.cmake | 17 +- etc/initsystem/prepare-dirs.cmake | 21 +- etc/initsystem/safe-reload.cmake | 2 +- etc/logrotate.d/icinga2.cmake | 7 +- icinga-app/CMakeLists.txt | 6 +- icinga-app/icinga.cpp | 151 +++++-- itl/CMakeLists.txt | 2 +- itl/plugins-contrib.d/CMakeLists.txt | 2 +- itl/plugins-contrib.d/databases.conf | 2 +- itl/plugins-contrib.d/smart-attributes.conf | 2 +- lib/base/CMakeLists.txt | 4 +- lib/base/application.cpp | 426 ++----------------- lib/base/application.hpp | 55 +-- lib/base/tlsutility.cpp | 2 +- lib/checker/CMakeLists.txt | 8 +- lib/cli/apisetuputility.cpp | 2 +- lib/cli/daemoncommand.cpp | 14 +- lib/cli/daemonutility.cpp | 6 +- lib/cli/featureutility.cpp | 4 +- lib/cli/nodesetupcommand.cpp | 2 +- lib/cli/nodeutility.cpp | 6 +- lib/cli/nodewizardcommand.cpp | 4 +- lib/cli/objectlistcommand.cpp | 4 +- lib/cli/troubleshootcommand.cpp | 52 ++- lib/cli/variablegetcommand.cpp | 2 +- lib/cli/variablelistcommand.cpp | 2 +- lib/cli/variableutility.cpp | 4 +- lib/compat/CMakeLists.txt | 12 +- lib/compat/checkresultreader.ti | 2 +- lib/compat/compatlogger.ti | 2 +- lib/compat/externalcommandlistener.ti | 2 +- lib/compat/statusdatawriter.cpp | 2 +- lib/compat/statusdatawriter.ti | 4 +- lib/config/configitem.cpp | 4 +- lib/db_ido_mysql/CMakeLists.txt | 2 +- lib/db_ido_pgsql/CMakeLists.txt | 2 +- lib/icinga/icingaapplication.cpp | 4 +- lib/icinga/icingaapplication.hpp | 2 - lib/livestatus/CMakeLists.txt | 4 +- lib/livestatus/livestatuslistener.ti | 4 +- lib/notification/CMakeLists.txt | 8 +- lib/perfdata/CMakeLists.txt | 16 +- lib/perfdata/perfdatawriter.ti | 8 +- lib/remote/CMakeLists.txt | 10 +- lib/remote/apilistener-filesync.cpp | 6 +- lib/remote/apilistener.cpp | 8 +- lib/remote/configpackageutility.cpp | 2 +- 64 files changed, 498 insertions(+), 708 deletions(-) create mode 100644 cmake/SetFullDir.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e66efb2e8..1af131836 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,19 +47,43 @@ string(REPLACE "Version: " "" ICINGA2_VERSION ${VERSION_LINE}) include(GNUInstallDirs) include(InstallConfig) +include(SetFullDir) set(ICINGA2_USER "icinga" CACHE STRING "Icinga 2 user") set(ICINGA2_GROUP "icinga" CACHE STRING "Icinga 2 group") set(ICINGA2_COMMAND_GROUP "icingacmd" CACHE STRING "Icinga 2 command group") -set(ICINGA2_RUNDIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/run" CACHE STRING "/run directory") set(ICINGA2_PLUGINDIR "/usr/lib/nagios/plugins" CACHE STRING "Path for the check plugins") set(ICINGA2_GIT_VERSION_INFO ON CACHE BOOL "Whether to use git describe") set(ICINGA2_UNITY_BUILD ON CACHE BOOL "Whether to perform a unity build") set(ICINGA2_LTO_BUILD OFF CACHE BOOL "Whether to use LTO") -if(NOT WIN32) - set(ICINGA2_SYSCONFIGFILE "${CMAKE_INSTALL_FULL_SYSCONFDIR}/sysconfig/icinga2" CACHE PATH "where to store configuation for the init system, defaults to /etc/sysconfig/icinga2") +set(ICINGA2_CONFIGDIR "${CMAKE_INSTALL_SYSCONFDIR}/icinga2" CACHE FILEPATH "Main config directory, e.g. /etc/icinga2") +set(ICINGA2_CACHEDIR "${CMAKE_INSTALL_LOCALSTATEDIR}/cache/icinga2" CACHE FILEPATH "Directory for cache files, e.g. /var/cache/icinga2") +set(ICINGA2_DATADIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/icinga2" CACHE FILEPATH "Data directory for the daemon, e.g. /var/lib/icinga2") +set(ICINGA2_LOGDIR "${CMAKE_INSTALL_LOCALSTATEDIR}/log/icinga2" CACHE FILEPATH "Logging directory, e.g. /var/log/icinga2") +set(ICINGA2_SPOOLDIR "${CMAKE_INSTALL_LOCALSTATEDIR}/spool/icinga2" CACHE FILEPATH "Spooling directory, e.g. /var/spool/icinga2") +set(ICINGA2_RUNDIR "${CMAKE_INSTALL_LOCALSTATEDIR}/run" CACHE STRING "/run directory (deprecated, please use ICINGA2_INITRUNDIR)") +set(ICINGA2_INITRUNDIR "${ICINGA2_RUNDIR}/icinga2" CACHE FILEPATH "Runtime data for the init system, e.g. /run/icinga2") +set(ICINGA2_PKGDATADIR "${CMAKE_INSTALL_DATADIR}/icinga2" CACHE FILEPATH "Installed data, e.g. /usr/share/icinga2") +set(ICINGA2_INCLUDEDIR "${ICINGA2_PKGDATADIR}/include" CACHE FILEPATH "Include directory for the ITL, e.g. /usr/share/icinga2/include") + +# ensure absolute paths +set_full_dir(ICINGA2_FULL_CONFIGDIR "${ICINGA2_CONFIGDIR}") +set_full_dir(ICINGA2_FULL_CACHEDIR "${ICINGA2_CACHEDIR}") +set_full_dir(ICINGA2_FULL_DATADIR "${ICINGA2_DATADIR}") +set_full_dir(ICINGA2_FULL_LOGDIR "${ICINGA2_LOGDIR}") +set_full_dir(ICINGA2_FULL_SPOOLDIR "${ICINGA2_SPOOLDIR}") +set_full_dir(ICINGA2_FULL_RUNDIR "${ICINGA2_RUNDIR}") +set_full_dir(ICINGA2_FULL_INITRUNDIR "${ICINGA2_INITRUNDIR}") +set_full_dir(ICINGA2_FULL_PKGDATADIR "${ICINGA2_PKGDATADIR}") +set_full_dir(ICINGA2_FULL_INCLUDEDIR "${ICINGA2_INCLUDEDIR}") + +set(LOGROTATE_DIR "${CMAKE_INSTALL_SYSCONFDIR}/logrotate.d" CACHE STRING "Location of logrotate configs, e.g. /etc/logrotate.d") +set(BASHCOMPLETION_DIR "${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d" CACHE STRING "Location of bash_completion files, e.g. /etc/bash_completion.d") + +if(NOT WIN32) + set(ICINGA2_SYSCONFIGFILE "${CMAKE_INSTALL_SYSCONFDIR}/sysconfig/icinga2" CACHE PATH "where to store configuation for the init system, defaults to /etc/sysconfig/icinga2") endif() site_name(ICINGA2_BUILD_HOST_NAME) diff --git a/INSTALL.md b/INSTALL.md index 6c3b9aa0b..a2855227d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -130,16 +130,26 @@ $ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. +For all variables regarding defaults paths on in CMake, see +[GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html). + +Also see `CMakeLists.txt` for details. + **System Environment** +- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` +- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` +- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2` +- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2` +- `ICINGA2_DATADIR`: Data directory for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2` +- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2` +- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2` +- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2` - `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON` - `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga` - `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga` - `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd` -- `ICINGA2_RUNDIR`: The location of the "run" directory; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run` -- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` - `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from; defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2` -- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` - `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` **Build Optimization** diff --git a/cmake/SetFullDir.cmake b/cmake/SetFullDir.cmake new file mode 100644 index 000000000..bd63a68bf --- /dev/null +++ b/cmake/SetFullDir.cmake @@ -0,0 +1,26 @@ +# Icinga 2 +# Copyright (C) 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. + +# Ensures a directory is absolute by prefixing CMAKE_INSTALL_PREFIX if it is not +# similar to CMAKE_INSTALL_FULL_... https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html +function(set_full_dir var path) + if(NOT IS_ABSOLUTE "${path}") + message(STATUS "Prefixing in ${var} \"${path}\" with ${CMAKE_INSTALL_PREFIX}") + set(path "${CMAKE_INSTALL_PREFIX}/${path}") + endif() + set(${var} "${path}" PARENT_SCOPE) +endfunction(set_full_dir) diff --git a/config.h.cmake b/config.h.cmake index c461e029f..16fa190f1 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -13,17 +13,24 @@ #cmakedefine ICINGA2_UNITY_BUILD -#define ICINGA_PREFIX "${CMAKE_INSTALL_PREFIX}" -#define ICINGA_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}" -#define ICINGA_RUNDIR "${ICINGA2_RUNDIR}" -#define ICINGA_LOCALSTATEDIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}" -#define ICINGA_PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/icinga2" -#define ICINGA_INCLUDECONFDIR "${CMAKE_INSTALL_FULL_DATADIR}/icinga2/include" +#define ICINGA_CONFIGDIR "${ICINGA2_FULL_CONFIGDIR}" +#define ICINGA_DATADIR "${ICINGA2_FULL_DATADIR}" +#define ICINGA_LOGDIR "${ICINGA2_FULL_LOGDIR}" +#define ICINGA_CACHEDIR "${ICINGA2_FULL_CACHEDIR}" +#define ICINGA_SPOOLDIR "${ICINGA2_FULL_SPOOLDIR}" +#define ICINGA_INITRUNDIR "${ICINGA2_FULL_INITRUNDIR}" +#define ICINGA_INCLUDECONFDIR "${ICINGA2_FULL_INCLUDEDIR}" #define ICINGA_USER "${ICINGA2_USER}" #define ICINGA_GROUP "${ICINGA2_GROUP}" -#define ICINGA_SYSCONFIGFILE "${ICINGA2_SYSCONFIGFILE}" #define ICINGA_BUILD_HOST_NAME "${ICINGA2_BUILD_HOST_NAME}" #define ICINGA_BUILD_COMPILER_NAME "${ICINGA2_BUILD_COMPILER_NAME}" #define ICINGA_BUILD_COMPILER_VERSION "${ICINGA2_BUILD_COMPILER_VERSION}" +// Deprecated options? +#define ICINGA_PKGDATADIR "${ICINGA2_FULL_PKGDATADIR}" +#define ICINGA_PREFIX "${CMAKE_INSTALL_PREFIX}" +#define ICINGA_SYSCONFDIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}" +#define ICINGA_RUNDIR "${ICINGA2_FULL_RUNDIR}" +#define ICINGA_LOCALSTATEDIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}" + #endif /* CONFIG_H */ diff --git a/doc/07-agent-based-monitoring.md b/doc/07-agent-based-monitoring.md index e2597a341..48c0d1cf8 100644 --- a/doc/07-agent-based-monitoring.md +++ b/doc/07-agent-based-monitoring.md @@ -211,7 +211,7 @@ match your Icinga convention. Add an `EventCommand` configuration object for the passive service auto reset event. object EventCommand "coldstart-reset-event" { - command = [ SysconfDir + "/icinga2/conf.d/custom/scripts/coldstart_reset_event.sh" ] + command = [ ConfigDir + "/conf.d/custom/scripts/coldstart_reset_event.sh" ] arguments = { "-i" = "$service.state_id$" @@ -356,4 +356,3 @@ passive update with the state and text from the second and third varbind: vars.dummy_state = 2 vars.dummy_text = "No passive check result received." } - diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index 44b41dffb..58ce96310 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -990,7 +990,7 @@ You can omit the `log()` calls, they only help debugging. log("Running command") log(mailscript) - var cmd = [ SysconfDir + "/icinga2/scripts/" + mailscript ] + var cmd = [ ConfigDir + "/scripts/" + mailscript ] log(LogCritical, "me", cmd) return cmd }} diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 2d81d3ee3..f169ebeb8 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -76,12 +76,12 @@ The ApiListener type expects its certificate files to be in the following locati Type | Location ---------------------|------------------------------------- - Private key | `LocalStateDir + "/lib/icinga2/certs/" + NodeName + ".key"` - Certificate file | `LocalStateDir + "/lib/icinga2/certs/" + NodeName + ".crt"` - CA certificate file | `LocalStateDir + "/lib/icinga2/certs/ca.crt"` + Private key | `DataDir + "/certs/" + NodeName + ".key"` + Certificate file | `DataDir + "/certs/" + NodeName + ".crt"` + CA certificate file | `DataDir + "/certs/ca.crt"` If the deprecated attributes `cert_path`, `key_path` and/or `ca_path` are specified Icinga 2 -copies those files to the new location in `LocalStateDir + "/lib/icinga2/certs"` unless the +copies those files to the new location in `DataDir + "/certs"` unless the file(s) there are newer. Please check the [upgrading chapter](16-upgrading-icinga-2.md#upgrading-to-2-8-certificate-paths) for more details. @@ -273,7 +273,7 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- - spool\_dir | String | **Optional.** The directory which contains the check result files. Defaults to LocalStateDir + "/lib/icinga2/spool/checkresults/". + spool\_dir | String | **Optional.** The directory which contains the check result files. Defaults to DataDir + "/spool/checkresults/". ## Comment @@ -322,7 +322,7 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- - log\_dir | String | **Optional.** Path to the compat log directory. Defaults to LocalStateDir + "/log/icinga2/compat". + log\_dir | String | **Optional.** Path to the compat log directory. Defaults to LogDir + "/compat". rotation\_method | String | **Optional.** Specifies when to rotate log files. Can be one of "HOURLY", "DAILY", "WEEKLY" or "MONTHLY". Defaults to "HOURLY". @@ -1084,7 +1084,7 @@ Configuration Attributes: bind\_host | String | **Optional.** Only valid when `socket_type` is set to `tcp`. Host address to listen on for connections. Defaults to `127.0.0.1`. bind\_port | Number | **Optional.** Only valid when `socket_type` is set to `tcp`. Port to listen on for connections. Defaults to `6558`. socket\_path | String | **Optional.** Only valid when `socket_type` is set to `unix`. Specifies the path to the UNIX socket file. Defaults to RunDir + "/icinga2/cmd/livestatus". - compat\_log\_path | String | **Optional.** Path to Icinga 1.x log files. Required for historical table queries. Requires `CompatLogger` feature enabled. Defaults to LocalStateDir + "/log/icinga2/compat" + compat\_log\_path | String | **Optional.** Path to Icinga 1.x log files. Required for historical table queries. Requires `CompatLogger` feature enabled. Defaults to LogDir + "/compat" > **Note** > @@ -1179,7 +1179,7 @@ Example: ``` object NotificationCommand "mail-service-notification" { - command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ] + command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] arguments += { "-4" = { @@ -1329,10 +1329,10 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- - host\_perfdata\_path | String | **Optional.** Path to the host performance data file. Defaults to LocalStateDir + "/spool/icinga2/perfdata/host-perfdata". - service\_perfdata\_path | String | **Optional.** Path to the service performance data file. Defaults to LocalStateDir + "/spool/icinga2/perfdata/service-perfdata". - host\_temp\_path | String | **Optional.** Path to the temporary host file. Defaults to LocalStateDir + "/spool/icinga2/tmp/host-perfdata". - service\_temp\_path | String | **Optional.** Path to the temporary service file. Defaults to LocalStateDir + "/spool/icinga2/tmp/service-perfdata". + host\_perfdata\_path | String | **Optional.** Path to the host performance data file. Defaults to SpoolDir + "/perfdata/host-perfdata". + service\_perfdata\_path | String | **Optional.** Path to the service performance data file. Defaults to SpoolDir + "/perfdata/service-perfdata". + host\_temp\_path | String | **Optional.** Path to the temporary host file. Defaults to SpoolDir + "/tmp/host-perfdata". + service\_temp\_path | String | **Optional.** Path to the temporary service file. Defaults to SpoolDir + "/tmp/service-perfdata". host\_format\_template | String | **Optional.** Host Format template for the performance data file. Defaults to a template that's suitable for use with PNP4Nagios. service\_format\_template | String | **Optional.** Service Format template for the performance data file. Defaults to a template that's suitable for use with PNP4Nagios. rotation\_interval | Duration | **Optional.** Rotation interval for the files specified in `{host,service}_perfdata_path`. Defaults to `30s`. @@ -1534,8 +1534,8 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- - status\_path | String | **Optional.** Path to the `status.dat` file. Defaults to LocalStateDir + "/cache/icinga2/status.dat". - objects\_path | String | **Optional.** Path to the `objects.cache` file. Defaults to LocalStateDir + "/cache/icinga2/objects.cache". + status\_path | String | **Optional.** Path to the `status.dat` file. Defaults to CacheDir + "/status.dat". + objects\_path | String | **Optional.** Path to the `objects.cache` file. Defaults to CacheDir + "/objects.cache". update\_interval | Duration | **Optional.** The interval in which the status files are updated. Defaults to `15s`. diff --git a/doc/11-cli-commands.md b/doc/11-cli-commands.md index 1b5011683..012fe72f3 100644 --- a/doc/11-cli-commands.md +++ b/doc/11-cli-commands.md @@ -402,7 +402,7 @@ Configuration files are processed in the order they're specified on the command- When no configuration file is specified and the `--no-config` is not used Icinga 2 automatically falls back to using the configuration file -`SysconfDir + "/icinga2/icinga2.conf"` (where SysconfDir is usually `/etc`). +`ConfigDir + "/icinga2.conf"` (where ConfigDir is usually `/etc/icinga2`). ### Validation @@ -730,4 +730,3 @@ safely reload the Icinga 2 daemon. The `reload` action will send the `SIGHUP` signal to the Icinga 2 daemon which will validate the configuration in a separate process and not stop the other events like check execution, notifications, etc. - diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index d78bc9aa0..e4758921f 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -237,9 +237,9 @@ include include ``` -in the [icinga2.conf](04-configuring-icinga-2.md#icinga2-conf) configuration file. These files are not considered configuration files and will be overridden -on upgrade, so please send modifications as proposed patches upstream. The default include path is set to -`LocalStateDir + "/share/icinga2/includes"`. +in the [icinga2.conf](04-configuring-icinga-2.md#icinga2-conf) configuration file. These files are not considered +configuration files and will be overridden on upgrade, so please send modifications as proposed patches upstream. +The default include path is set to `/usr/share/icinga2/includes` with the constant `IncludeConfDir`. You should add your own command definitions to a new file in `conf.d/` called `commands.conf` or similar. diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 285a9fcb9..91828f753 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -388,31 +388,51 @@ once they are set. Icinga 2 provides a number of special global constants. Some of them can be overridden using the `--define` command line parameter: +Defaults for paths in `/etc` and `/var` are based on `SysconfDir` and `LocalStateDir` respectively. + Variable |Description --------------------|------------------- -PrefixDir |**Read-only.** Contains the installation prefix that was specified with cmake -DCMAKE_INSTALL_PREFIX. Defaults to "/usr/local". -SysconfDir |**Read-only.** Contains the path of the sysconf directory. Defaults to PrefixDir + "/etc". -ZonesDir |**Read-only.** Contains the path of the zones.d directory. Defaults to SysconfDir + "/zones.d". -LocalStateDir |**Read-only.** Contains the path of the local state directory. Defaults to PrefixDir + "/var". -RunDir |**Read-only.** Contains the path of the run directory. Defaults to LocalStateDir + "/run". -PkgDataDir |**Read-only.** Contains the path of the package data directory. Defaults to PrefixDir + "/share/icinga2". -StatePath |**Read-write.** Contains the path of the Icinga 2 state file. Defaults to LocalStateDir + "/lib/icinga2/icinga2.state". -ObjectsPath |**Read-write.** Contains the path of the Icinga 2 objects file. Defaults to LocalStateDir + "/cache/icinga2/icinga2.debug". -PidPath |**Read-write.** Contains the path of the Icinga 2 PID file. Defaults to RunDir + "/icinga2/icinga2.pid". +ConfigDir |**Read-only.** Main configuration directory. Usually set to `/etc/icinga2`. +DataDir |**Read-only.** Runtime data for the Icinga daemon. Usually set to `/var/lib/icinga2`. +LogDir |**Read-only.** Logfiles from the daemon. Usually set to `/var/log/icinga2`. +CacheDir |**Read-only.** Cached status information of the daemon. Usually set to `/var/cache/icinga2`. +SpoolDir |**Read-only.** Spool directory for certain data outputs. Usually set to `/var/spool/icinga2`. +InitRunDir |**Read-only.** Directory for PID files and sockets in daemon mode. Usually set to `/run/icinga2`. +ZonesDir |**Read-only.** Contains the path of the zones.d directory. Defaults to `ConfigDir + "/zones.d"`. Vars |**Read-write.** Contains a dictionary with global custom attributes. Not set by default. NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. -PlatformName |**Read-only.** The name of the operating system, e.g. "Ubuntu". -PlatformVersion |**Read-only.** The version of the operating system, e.g. "14.04.3 LTS". -PlatformKernel |**Read-only.** The name of the operating system kernel, e.g. "Linux". -PlatformKernelVersion|**Read-only.** The version of the operating system kernel, e.g. "3.13.0-63-generic". -BuildCompilerName |**Read-only.** The name of the compiler Icinga was built with, e.g. "Clang". -BuildCompilerVersion|**Read-only.** The version of the compiler Icinga was built with, e.g. "7.3.0.7030031". -BuildHostName |**Read-only.** The name of the host Icinga was built on, e.g. "acheron". -ApplicationVersion |**Read-only.** The application version, e.g. "2.9.0". -MaxConcurrentChecks |**Read-write**. The number of max checks run simultaneously. Defaults to 512. -Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to "production". +PlatformName |**Read-only.** The name of the operating system, e.g. `Ubuntu`. +PlatformVersion |**Read-only.** The version of the operating system, e.g. `14.04.3 LTS`. +PlatformKernel |**Read-only.** The name of the operating system kernel, e.g. `Linux`. +PlatformKernelVersion|**Read-only.** The version of the operating system kernel, e.g. `3.13.0-63-generic`. +BuildCompilerName |**Read-only.** The name of the compiler Icinga was built with, e.g. `Clang`. +BuildCompilerVersion|**Read-only.** The version of the compiler Icinga was built with, e.g. `7.3.0.7030031`. +BuildHostName |**Read-only.** The name of the host Icinga was built on, e.g. `acheron`. +ApplicationVersion |**Read-only.** The application version, e.g. `2.9.0`. +MaxConcurrentChecks |**Read-write**. The number of max checks run simultaneously. Defaults to `512`. +Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. + +Certain variables are used to define file paths, you should never need to change them, as they are built based on +constants above. + +Variable |Description +--------------------|------------------- +StatePath |**Read-write.** Contains the path of the Icinga 2 state file. Defaults to `DataDir + "/icinga2.state"`. +ObjectsPath |**Read-write.** Contains the path of the Icinga 2 objects file. Defaults to `CacheDir + "/icinga2.debug"`. +PidPath |**Read-write.** Contains the path of the Icinga 2 PID file. Defaults to `InitRunDir + "/icinga2.pid"`. +PkgDataDir |**Read-only.** Contains the path of the package data directory. Defaults to `PrefixDir + "/share/icinga2"`. + +Some constants have been used in the past, but are deprecated now. They are stil involved in building Icinga, +see `INSTALL.md`, but please avoid using them for runtime config! + +Variable |Description +--------------------|------------------- +PrefixDir |**Read-only.** Contains the installation prefix that was specified with cmake -DCMAKE_INSTALL_PREFIX. `Defaults to "/usr/local"`. +SysconfDir |**Read-only.** Contains the path of the sysconf directory. Defaults to `PrefixDir + "/etc"`. +LocalStateDir |**Read-only.** Contains the path of the local state directory. Defaults to `PrefixDir + "/var"`. +RunDir |**Read-only.** Contains the path of the run directory. Defaults to `LocalStateDir + "/run"`. Advanced runtime constants. Please only use them if advised by support or developers. @@ -733,12 +753,12 @@ You can explicitly access the `this` scope using the `this` keyword: object Host "localhost" { var check_interval = 5m - + /* This explicitly specifies that the attribute should be set * for the host, if we had omitted `this.` the (poorly named) * local variable `check_interval` would have been modified instead. */ - this.check_interval = 1m + this.check_interval = 1m } Similarly the keywords `locals` and `globals` are available to access the local and global scope. @@ -748,7 +768,7 @@ a function is set to whichever object was used to invoke the function. Here's an hm = { h_word = null - + function init(word) { h_word = word } @@ -1024,4 +1044,3 @@ You can escape the `include` keyword by prefixing it with an additional `@` char vars.@include = "some cmdb export field" } - diff --git a/doc/icinga2.8 b/doc/icinga2.8 index 81fd9dba8..f9ea45bb7 100644 --- a/doc/icinga2.8 +++ b/doc/icinga2.8 @@ -69,9 +69,9 @@ Config files are processed in the order they are specified on the command-line. When no configuration file is specified and the .B --no-config is not used, Icinga 2 automatically falls back to using the configuration file -.B SysconfDir + "/icinga2/icinga2.conf" -(where SysconfDir is usually -.BI "/etc" ")." +.B ConfigDir + "/icinga2.conf" +(where ConfigDir is usually +.BI "/etc/icinga2" ")." .TP .B "-z, --noconfig" diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt index bffca3016..4c967cc43 100644 --- a/etc/CMakeLists.txt +++ b/etc/CMakeLists.txt @@ -24,55 +24,52 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") endif() if(NOT WIN32) - install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/icinga2/constants.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2) - install_if_not_exists(icinga2/icinga2.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2) + install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/icinga2/constants.conf ${ICINGA2_CONFIGDIR}) + install_if_not_exists(icinga2/icinga2.conf ${ICINGA2_CONFIGDIR}) else() - install_if_not_exists(${CMAKE_CURRENT_SOURCE_DIR}/icinga2/win32/constants.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2) - install_if_not_exists(icinga2/win32/icinga2.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2) + install_if_not_exists(${CMAKE_CURRENT_SOURCE_DIR}/icinga2/win32/constants.conf ${ICINGA2_CONFIGDIR}) + install_if_not_exists(icinga2/win32/icinga2.conf ${ICINGA2_CONFIGDIR}) endif() -install_if_not_exists(icinga2/zones.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2) -install_if_not_exists(icinga2/conf.d/app.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/commands.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/downtimes.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/groups.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) +install_if_not_exists(icinga2/zones.conf ${ICINGA2_CONFIGDIR}) +install_if_not_exists(icinga2/conf.d/app.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/commands.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/downtimes.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/groups.conf ${ICINGA2_CONFIGDIR}/conf.d) if(NOT WIN32) - install_if_not_exists(icinga2/conf.d/hosts.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) - install_if_not_exists(icinga2/conf.d/services.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) + install_if_not_exists(icinga2/conf.d/hosts.conf ${ICINGA2_CONFIGDIR}/conf.d) + install_if_not_exists(icinga2/conf.d/services.conf ${ICINGA2_CONFIGDIR}/conf.d) else() - install_if_not_exists(icinga2/conf.d/win32/hosts.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) - install_if_not_exists(icinga2/conf.d/win32/services.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) + install_if_not_exists(icinga2/conf.d/win32/hosts.conf ${ICINGA2_CONFIGDIR}/conf.d) + install_if_not_exists(icinga2/conf.d/win32/services.conf ${ICINGA2_CONFIGDIR}/conf.d) endif() -install_if_not_exists(icinga2/conf.d/notifications.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/templates.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/timeperiods.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/conf.d/users.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/conf.d) -install_if_not_exists(icinga2/features-available/api.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available) -install_if_not_exists(icinga2/features-available/debuglog.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available) -install_if_not_exists(icinga2/features-available/mainlog.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available) +install_if_not_exists(icinga2/conf.d/notifications.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/templates.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/timeperiods.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/users.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/features-available/api.conf ${ICINGA2_CONFIGDIR}/features-available) +install_if_not_exists(icinga2/features-available/debuglog.conf ${ICINGA2_CONFIGDIR}/features-available) +install_if_not_exists(icinga2/features-available/mainlog.conf ${ICINGA2_CONFIGDIR}/features-available) if(NOT WIN32) - install_if_not_exists(icinga2/features-available/syslog.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available) + install_if_not_exists(icinga2/features-available/syslog.conf ${ICINGA2_CONFIGDIR}/features-available) endif() -install_if_not_exists(icinga2/scripts/mail-host-notification.sh ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/scripts) -install_if_not_exists(icinga2/scripts/mail-service-notification.sh ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/scripts) -install_if_not_exists(icinga2/zones.d/README ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/zones.d) +install_if_not_exists(icinga2/scripts/mail-host-notification.sh ${ICINGA2_CONFIGDIR}/scripts) +install_if_not_exists(icinga2/scripts/mail-service-notification.sh ${ICINGA2_CONFIGDIR}/scripts) +install_if_not_exists(icinga2/zones.d/README ${ICINGA2_CONFIGDIR}/zones.d) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/logrotate.d/icinga2 ${CMAKE_INSTALL_SYSCONFDIR}/logrotate.d) + install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/logrotate.d/icinga2 ${LOGROTATE_DIR}) endif() if(NOT WIN32) - install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled\")") - install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/mainlog.conf \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled/mainlog.conf\")") + install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled\")") + install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/mainlog.conf \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled/mainlog.conf\")") - install( - FILES bash_completion.d/icinga2 - DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d - ) + install(FILES bash_completion.d/icinga2 DESTINATION ${BASHCOMPLETION_DIR}) else() - install_if_not_exists(icinga2/features-enabled/mainlog.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) + install_if_not_exists(icinga2/features-enabled/mainlog.conf ${ICINGA2_CONFIGDIR}/features-enabled) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "(Linux|Solaris|SunOS)") diff --git a/etc/icinga2/conf.d/commands.conf b/etc/icinga2/conf.d/commands.conf index 9c5153811..bd511cebc 100644 --- a/etc/icinga2/conf.d/commands.conf +++ b/etc/icinga2/conf.d/commands.conf @@ -7,7 +7,7 @@ */ object NotificationCommand "mail-host-notification" { - command = [ SysconfDir + "/icinga2/scripts/mail-host-notification.sh" ] + command = [ ConfigDir + "/scripts/mail-host-notification.sh" ] arguments += { "-4" = "$notification_address$" @@ -66,7 +66,7 @@ object NotificationCommand "mail-host-notification" { } object NotificationCommand "mail-service-notification" { - command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ] + command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] arguments += { "-4" = "$notification_address$" @@ -146,7 +146,7 @@ object NotificationCommand "mail-service-notification" { /* object NotificationCommand "mail-host-notification" { - command = [ SysconfDir + "/icinga2/scripts/mail-host-notification.sh" ] + command = [ ConfigDir + "/scripts/mail-host-notification.sh" ] env = { NOTIFICATIONTYPE = "$notification.type$" @@ -164,7 +164,7 @@ object NotificationCommand "mail-host-notification" { } object NotificationCommand "mail-service-notification" { - command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ] + command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] env = { NOTIFICATIONTYPE = "$notification.type$" diff --git a/etc/icinga2/features-available/debuglog.conf b/etc/icinga2/features-available/debuglog.conf index 6e8e5813e..e66518fe1 100644 --- a/etc/icinga2/features-available/debuglog.conf +++ b/etc/icinga2/features-available/debuglog.conf @@ -6,6 +6,5 @@ object FileLogger "debug-file" { severity = "debug" - path = LocalStateDir + "/log/icinga2/debug.log" + path = LogDir + "/debug.log" } - diff --git a/etc/icinga2/features-available/mainlog.conf b/etc/icinga2/features-available/mainlog.conf index ded9a7c7d..a3bb19dab 100644 --- a/etc/icinga2/features-available/mainlog.conf +++ b/etc/icinga2/features-available/mainlog.conf @@ -4,6 +4,5 @@ object FileLogger "main-log" { severity = "information" - path = LocalStateDir + "/log/icinga2/icinga2.log" + path = LogDir + "/icinga2.log" } - diff --git a/etc/initsystem/icinga2.init.d.cmake b/etc/initsystem/icinga2.init.d.cmake index f0698726f..ef3f521f2 100644 --- a/etc/initsystem/icinga2.init.d.cmake +++ b/etc/initsystem/icinga2.init.d.cmake @@ -36,10 +36,10 @@ fi : ${ICINGA2_GROUP:="@ICINGA2_GROUP@"} : ${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"} : ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"} -: ${ICINGA2_CONFIG_FILE:="@CMAKE_INSTALL_FULL_SYSCONFDIR@/icinga2/icinga2.conf"} -: ${ICINGA2_ERROR_LOG:=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log} -: ${ICINGA2_STARTUP_LOG:=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/startup.log} -: ${ICINGA2_PID_FILE:="@ICINGA2_RUNDIR@/icinga2/icinga2.pid"} +: ${ICINGA2_CONFIG_FILE:="@ICINGA2_CONFIGDIR@/icinga2.conf"} +: ${ICINGA2_ERROR_LOG:=@ICINGA2_LOGDIR@/error.log} +: ${ICINGA2_STARTUP_LOG:=@ICINGA2_LOGDIR@/startup.log} +: ${ICINGA2_PID_FILE:="@ICINGA2_INITRUNDIR@/icinga2.pid"} # Load extra environment variables if [ -f /etc/default/icinga2 ]; then @@ -90,7 +90,7 @@ stop() { if ! icinga2 internal signal -s SIGCHLD -p $pid >/dev/null 2>&1; then break fi - + printf '.' sleep 3 done diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 771c98f7b..94b7dcd2f 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -7,7 +7,7 @@ Type=notify EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon -e ${ICINGA2_ERROR_LOG} -PIDFile=@ICINGA2_RUNDIR@/icinga2/icinga2.pid +PIDFile=@ICINGA2_INITRUNDIR@/icinga2.pid ExecReload=@CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload @ICINGA2_SYSCONFIGFILE@ TimeoutStartSec=30m diff --git a/etc/initsystem/icinga2.sysconfig.cmake b/etc/initsystem/icinga2.sysconfig.cmake index d5d7497f1..167c12578 100644 --- a/etc/initsystem/icinga2.sysconfig.cmake +++ b/etc/initsystem/icinga2.sysconfig.cmake @@ -2,15 +2,14 @@ #Make your changes here. #DAEMON=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 -#ICINGA2_CONFIG_FILE=@CMAKE_INSTALL_FULL_SYSCONFDIR@/icinga2/icinga2.conf -#ICINGA2_RUN_DIR=@ICINGA2_RUNDIR@ -#ICINGA2_STATE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@ -#ICINGA2_PID_FILE=@ICINGA2_RUNDIR@/icinga2/icinga2.pid -#ICINGA2_LOG_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2 -#ICINGA2_ERROR_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log -#ICINGA2_STARTUP_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/startup.log -#ICINGA2_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/icinga2.log -#ICINGA2_CACHE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2 +#ICINGA2_CONFIG_FILE=@ICINGA2_CONFIGDIR@/icinga2.conf +#ICINGA2_INIT_RUN_DIR=@ICINGA2_INITRUNDIR@ +#ICINGA2_PID_FILE=@ICINGA2_INITRUNDIR@/icinga2.pid +#ICINGA2_LOG_DIR=@ICINGA2_LOGDIR@ +#ICINGA2_ERROR_LOG=@ICINGA2_LOGDIR@/error.log +#ICINGA2_STARTUP_LOG=@ICINGA2_LOGDIR@/startup.log +#ICINGA2_LOG=@ICINGA2_LOGDIR@/icinga2.log +#ICINGA2_CACHE_DIR=@ICINGA2_CACHEDIR@ #ICINGA2_USER=@ICINGA2_USER@ #ICINGA2_GROUP=@ICINGA2_GROUP@ #ICINGA2_COMMAND_GROUP=@ICINGA2_COMMAND_GROUP@ diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake index ce155424d..c0d96bdac 100644 --- a/etc/initsystem/prepare-dirs.cmake +++ b/etc/initsystem/prepare-dirs.cmake @@ -17,28 +17,27 @@ fi : ${ICINGA2_USER:="@ICINGA2_USER@"} : ${ICINGA2_GROUP:="@ICINGA2_GROUP@"} : ${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"} -: ${ICINGA2_RUN_DIR:="@ICINGA2_RUNDIR@"} -: ${ICINGA2_LOG_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2"} -: ${ICINGA2_STATE_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2"} -: ${ICINGA2_CACHE_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2"} +: ${ICINGA2_INIT_RUN_DIR:="@ICINGA2_INITRUNDIR@"} +: ${ICINGA2_LOG_DIR:="@ICINGA2_LOGDIR@"} +: ${ICINGA2_CACHE_DIR:="@ICINGA2_CACHEDIR@"} getent passwd $ICINGA2_USER >/dev/null 2>&1 || (echo "Icinga user '$ICINGA2_USER' does not exist. Exiting." && exit 6) getent group $ICINGA2_GROUP >/dev/null 2>&1 || (echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." && exit 6) getent group $ICINGA2_COMMAND_GROUP >/dev/null 2>&1 || (echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting." && exit 6) -if [ ! -e "$ICINGA2_RUN_DIR"/icinga2 ]; then - mkdir "$ICINGA2_RUN_DIR"/icinga2 - mkdir "$ICINGA2_RUN_DIR"/icinga2/cmd +if [ ! -e "$ICINGA2_INIT_RUN_DIR" ]; then + mkdir "$ICINGA2_INIT_RUN_DIR" + mkdir "$ICINGA2_INIT_RUN_DIR"/cmd fi -chmod 755 "$ICINGA2_RUN_DIR"/icinga2 -chmod 2750 "$ICINGA2_RUN_DIR"/icinga2/cmd -chown -R $ICINGA2_USER:$ICINGA2_COMMAND_GROUP "$ICINGA2_RUN_DIR"/icinga2 +chmod 755 "$ICINGA2_INIT_RUN_DIR" +chmod 2750 "$ICINGA2_INIT_RUN_DIR"/cmd +chown -R $ICINGA2_USER:$ICINGA2_COMMAND_GROUP "$ICINGA2_INIT_RUN_DIR" test -e "$ICINGA2_LOG_DIR" || install -m 750 -o $ICINGA2_USER -g $ICINGA2_COMMAND_GROUP -d "$ICINGA2_LOG_DIR" if type restorecon >/dev/null 2>&1; then - restorecon -R "$ICINGA2_RUN_DIR"/icinga2/ + restorecon -R "$ICINGA2_INIT_RUN_DIR"/ fi test -e "$ICINGA2_CACHE_DIR" || install -m 750 -o $ICINGA2_USER -g $ICINGA2_COMMAND_GROUP -d "$ICINGA2_CACHE_DIR" diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake index c42994a30..a71ae9db5 100644 --- a/etc/initsystem/safe-reload.cmake +++ b/etc/initsystem/safe-reload.cmake @@ -11,7 +11,7 @@ fi # Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" -: ${ICINGA2_PID_FILE:="@ICINGA2_RUNDIR@/icinga2/icinga2.pid"} +: ${ICINGA2_PID_FILE:="@ICINGA2_INITRUNDIR@/icinga2.pid"} : ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"} printf "Validating config files: " diff --git a/etc/logrotate.d/icinga2.cmake b/etc/logrotate.d/icinga2.cmake index 91d8d23d3..3863f913d 100644 --- a/etc/logrotate.d/icinga2.cmake +++ b/etc/logrotate.d/icinga2.cmake @@ -1,4 +1,4 @@ -@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/icinga2.log @CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/debug.log { +@ICINGA2_LOGDIR@/icinga2.log @ICINGA2_LOGDIR@/debug.log { daily rotate 7@LOGROTATE_USE_SU@ compress @@ -7,11 +7,11 @@ notifempty create 644 @ICINGA2_USER@ @ICINGA2_GROUP@ postrotate - /bin/kill -USR1 $(cat @ICINGA2_RUNDIR@/icinga2/icinga2.pid 2> /dev/null) 2> /dev/null || true + /bin/kill -USR1 $(cat @ICINGA2_INITRUNDIR@/icinga2.pid 2> /dev/null) 2> /dev/null || true endscript } -@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log { +@ICINGA2_LOGDIR@/error.log { daily rotate 90@LOGROTATE_USE_SU@ compress @@ -21,4 +21,3 @@ create 644 @ICINGA2_USER@ @ICINGA2_GROUP@ # TODO: figure out how to get Icinga to re-open this log file } - diff --git a/icinga-app/CMakeLists.txt b/icinga-app/CMakeLists.txt index 0d1293279..49286776d 100644 --- a/icinga-app/CMakeLists.txt +++ b/icinga-app/CMakeLists.txt @@ -107,6 +107,6 @@ install( RUNTIME DESTINATION ${InstallPath} ) -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/icinga2\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_RUNDIR}/icinga2\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_LOGDIR}\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_INITRUNDIR}\")") diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 404cedf30..2cde94859 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -94,6 +94,68 @@ static std::vector GlobalArgumentCompletion(const String& argument, cons return std::vector(); } +static void HandleLegacyDefines() +{ +#ifdef _WIN32 + String dataPrefix = Utility::GetIcingaDataPath(); +#endif /* _WIN32 */ + + Value localStateDir = Application::GetConst("LocalStateDir"); + if (!localStateDir.IsEmpty()) { + Log(LogWarning, "icinga-app") + << "Please do not set LocalStateDir anymore, set DataDir, LogDir, CacheDir and SpoolDir!" + << " Resetting those vars based on LocalStateDir!"; + +#ifdef _WIN32 + ScriptGlobal::Set("DataDir", localStateDir + "\\lib\\icinga2"); + ScriptGlobal::Set("LogDir", localStateDir + "\\log\\icinga2"); + ScriptGlobal::Set("CacheDir", localStateDir + "\\cache\\icinga2"); + ScriptGlobal::Set("SpoolDir", localStateDir + "\\spool\\icinga2"); + } else { + ScriptGlobal::Set("LocalStateDir", dataPrefix + "\\var"); +#else /* _WIN32 */ + ScriptGlobal::Set("DataDir", localStateDir + "/lib/icinga2"); + ScriptGlobal::Set("LogDir", localStateDir + "/log/icinga2"); + ScriptGlobal::Set("CacheDir", localStateDir + "/cache/icinga2"); + ScriptGlobal::Set("SpoolDir", localStateDir + "/spool/icinga2"); + } else { + ScriptGlobal::Set("LocalStateDir", ICINGA_LOCALSTATEDIR); +#endif /* _WIN32 */ + } + + Value sysconfDir = Application::GetConst("SysconfDir"); + if (!sysconfDir.IsEmpty()) { + Log(LogWarning, "icinga-app") + << "Please do not set Sysconfdir anymore, set ConfigDir! Resetting the var based on SysconfDir!"; + +#ifdef _WIN32 + ScriptGlobal::Set("ConfigDir", sysconfDir + "\\icinga2"); + } else { + ScriptGlobal::Set("SysconfDir", dataPrefix + "\\etc"); +#else /* _WIN32 */ + ScriptGlobal::Set("ConfigDir", sysconfDir + "/icinga2"); + } else { + ScriptGlobal::Set("SysconfDir", ICINGA_SYSCONFDIR); +#endif /* _WIN32 */ + } + + Value runDir = Application::GetConst("RunDir"); + if (!runDir.IsEmpty()) { + Log(LogWarning, "icinga-app") + << "Please do not set RunDir anymore, set InitRunDir! Resetting the var based on RunDir!"; + +#ifdef _WIN32 + ScriptGlobal::Set("InitRunDir", runDir + "\\icinga2"); + } else { + ScriptGlobal::Set("RunDir", dataPrefix + "\\var\\run"); +#else /* _WIN32 */ + ScriptGlobal::Set("InitRunDir", runDir + "/icinga2"); + } else { + ScriptGlobal::Set("RunDir", ICINGA_RUNDIR); +#endif /* _WIN32 */ + } +} + static int Main() { int argc = Application::GetArgC(); @@ -128,31 +190,53 @@ static int Main() #ifdef _WIN32 bool builtinPaths = true; + // Programm install location, C:/Program Files/Icinga2 String binaryPrefix = Utility::GetIcingaInstallPath(); + // Returns the datapath for daemons, %PROGRAMDATA%/icinga2 String dataPrefix = Utility::GetIcingaDataPath(); if (!binaryPrefix.IsEmpty() && !dataPrefix.IsEmpty()) { - Application::DeclarePrefixDir(binaryPrefix); - Application::DeclareSysconfDir(dataPrefix + "\\etc"); - Application::DeclareRunDir(dataPrefix + "\\var\\run"); - Application::DeclareLocalStateDir(dataPrefix + "\\var"); - Application::DeclarePkgDataDir(binaryPrefix + "\\share\\icinga2"); - Application::DeclareIncludeConfDir(binaryPrefix + "\\share\\icinga2\\include"); + Application::DeclareConst("PrefixDir", binaryPrefix); + Application::DeclareConst("ProgramData", dataPrefix); + + Application::DeclareConst("ConfigDir", dataPrefix + "\\etc\\icinga2"); + + Application::DeclareConst("DataDir", dataPrefix + "\\var\\lib\\icinga2"); + Application::DeclareConst("LogDir", dataPrefix + "\\var\\log\\icinga2"); + Application::DeclareConst("CacheDir", dataPrefix + "\\var\\cache\\icinga2"); + Application::DeclareConst("SpoolDir", dataPrefix + "\\var\\spool\\icinga2"); + + // also see call to HandleLegacyDefines() later + + // internal constants + Application::DeclareConst("PkgDataDir", binaryPrefix + "\\share\\icinga2"); + Application::DeclareConst("IncludeConfDir", binaryPrefix + "\\share\\icinga2\\include"); } else { Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths."); #endif /* _WIN32 */ - Application::DeclarePrefixDir(ICINGA_PREFIX); - Application::DeclareSysconfDir(ICINGA_SYSCONFDIR); - Application::DeclareRunDir(ICINGA_RUNDIR); - Application::DeclareLocalStateDir(ICINGA_LOCALSTATEDIR); - Application::DeclarePkgDataDir(ICINGA_PKGDATADIR); - Application::DeclareIncludeConfDir(ICINGA_INCLUDECONFDIR); + Application::DeclareConst("ConfigDir", ICINGA_CONFIGDIR); + + Application::DeclareConst("DataDir", ICINGA_DATADIR); + Application::DeclareConst("LogDir", ICINGA_LOGDIR); + Application::DeclareConst("CacheDir", ICINGA_CACHEDIR); + Application::DeclareConst("SpoolDir", ICINGA_SPOOLDIR); + + Application::DeclareConst("PrefixDir", ICINGA_PREFIX); + + // also see call to HandleLegacyDefines() later + + // internal constants + Application::DeclareConst("PkgDataDir", ICINGA_PKGDATADIR); + Application::DeclareConst("IncludeConfDir", ICINGA_INCLUDECONFDIR); + + Application::DeclareConst("InitRunDir", ICINGA_INITRUNDIR); + #ifdef _WIN32 } #endif /* _WIN32 */ - Application::DeclareZonesDir(Application::GetSysconfDir() + "/icinga2/zones.d"); + Application::DeclareConst("ZonesDir", Application::GetConst("ConfigDir") + "/zones.d"); String icingaUser = Utility::GetFromEnvironment("ICINGA2_USER"); if (icingaUser.IsEmpty()) @@ -162,17 +246,17 @@ static int Main() if (icingaGroup.IsEmpty()) icingaGroup = ICINGA_GROUP; - Application::DeclareRunAsUser(icingaUser); - Application::DeclareRunAsGroup(icingaGroup); + Application::DeclareConst("RunAsUser", icingaUser); + Application::DeclareConst("RunAsGroup", icingaGroup); if (!autocomplete) { #ifdef RLIMIT_NOFILE String rLimitFiles = Utility::GetFromEnvironment("ICINGA2_RLIMIT_FILES"); if (rLimitFiles.IsEmpty()) - Application::DeclareRLimitFiles(Application::GetDefaultRLimitFiles()); + Application::DeclareConst("RLimitFiles", Application::GetDefaultRLimitFiles()); else { try { - Application::DeclareRLimitFiles(Convert::ToLong(rLimitFiles)); + Application::DeclareConst("RLimitFiles", Convert::ToLong(rLimitFiles)); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_FILES\": " << ex.what() << '\n'; @@ -184,10 +268,10 @@ static int Main() #ifdef RLIMIT_NPROC String rLimitProcesses = Utility::GetFromEnvironment("ICINGA2_RLIMIT_PROCESSES"); if (rLimitProcesses.IsEmpty()) - Application::DeclareRLimitProcesses(Application::GetDefaultRLimitProcesses()); + Application::DeclareConst("RLimitProcesses", Application::GetDefaultRLimitProcesses()); else { try { - Application::DeclareRLimitProcesses(Convert::ToLong(rLimitProcesses)); + Application::DeclareConst("RLimitProcesses", Convert::ToLong(rLimitProcesses)); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_PROCESSES\": " << ex.what() << '\n'; @@ -199,10 +283,10 @@ static int Main() #ifdef RLIMIT_STACK String rLimitStack = Utility::GetFromEnvironment("ICINGA2_RLIMIT_STACK"); if (rLimitStack.IsEmpty()) - Application::DeclareRLimitStack(Application::GetDefaultRLimitStack()); + Application::DeclareConst("RLimitStack", Application::GetDefaultRLimitStack()); else { try { - Application::DeclareRLimitStack(Convert::ToLong(rLimitStack)); + Application::DeclareConst("RLimitStack", Convert::ToLong(rLimitStack)); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_STACK\": " << ex.what() << '\n'; @@ -212,8 +296,8 @@ static int Main() #endif /* RLIMIT_STACK */ } - Application::DeclareConcurrency(std::thread::hardware_concurrency()); - Application::DeclareMaxConcurrentChecks(Application::GetDefaultMaxConcurrentChecks()); + Application::DeclareConst("Concurrency", std::thread::hardware_concurrency()); + Application::DeclareConst("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks()); ScriptGlobal::Set("Environment", "production"); @@ -277,7 +361,8 @@ static int Main() GetUserName(username, &usernameLen); std::ifstream userFile; - userFile.open(Application::GetSysconfDir() + "/icinga2/user"); + String configDir = Application::GetConst("ConfigDir"); + userFile.open(configDir + "/user"); if (userFile && command && !Application::IsProcessElevated()) { std::string userLine; @@ -361,16 +446,18 @@ static int Main() } } + HandleLegacyDefines(); + if (vm.count("script-debugger")) Application::SetScriptDebuggerEnabled(true); - Application::DeclareStatePath(Application::GetLocalStateDir() + "/lib/icinga2/icinga2.state"); - Application::DeclareModAttrPath(Application::GetLocalStateDir() + "/lib/icinga2/modified-attributes.conf"); - Application::DeclareObjectsPath(Application::GetLocalStateDir() + "/cache/icinga2/icinga2.debug"); - Application::DeclareVarsPath(Application::GetLocalStateDir() + "/cache/icinga2/icinga2.vars"); - Application::DeclarePidPath(Application::GetRunDir() + "/icinga2/icinga2.pid"); + Application::DeclareConst("StatePath", Application::GetConst("DataDir") + "/icinga2.state"); + Application::DeclareConst("ModAttrPath", Application::GetConst("DataDir") + "/modified-attributes.conf"); + Application::DeclareConst("ObjectsPath", Application::GetConst("CacheDir") + "/icinga2.debug"); + Application::DeclareConst("VarsPath", Application::GetConst("CacheDir") + "/icinga2.vars"); + Application::DeclareConst("PidPath", Application::GetConst("InitRunDir") + "/icinga2.pid"); - ConfigCompiler::AddIncludeSearchDir(Application::GetIncludeConfDir()); + ConfigCompiler::AddIncludeSearchDir(Application::GetConst("IncludeConfDir")); if (!autocomplete && vm.count("include")) { for (const String& includePath : vm["include"].as >()) { @@ -480,8 +567,8 @@ static int Main() return 0; } } else if (command && command->GetImpersonationLevel() == ImpersonateIcinga) { - String group = Application::GetRunAsGroup(); - String user = Application::GetRunAsUser(); + String group = Application::GetConst("RunAsGroup"); + String user = Application::GetConst("RunAsUser"); errno = 0; struct group *gr = getgrnam(group.CStr()); diff --git a/itl/CMakeLists.txt b/itl/CMakeLists.txt index 75b2e7289..6d70ad9f1 100644 --- a/itl/CMakeLists.txt +++ b/itl/CMakeLists.txt @@ -19,5 +19,5 @@ add_subdirectory(plugins-contrib.d) install( FILES itl command-icinga.conf hangman plugins command-plugins.conf manubulon command-plugins-manubulon.conf windows-plugins command-plugins-windows.conf nscp command-nscp-local.conf plugins-contrib - DESTINATION ${CMAKE_INSTALL_DATADIR}/icinga2/include + DESTINATION ${ICINGA2_INCLUDEDIR} ) diff --git a/itl/plugins-contrib.d/CMakeLists.txt b/itl/plugins-contrib.d/CMakeLists.txt index 099ea2485..5d60a1b70 100644 --- a/itl/plugins-contrib.d/CMakeLists.txt +++ b/itl/plugins-contrib.d/CMakeLists.txt @@ -17,5 +17,5 @@ install( FILES databases.conf hardware.conf icingacli.conf ipmi.conf logmanagement.conf metrics.conf network-components.conf network-services.conf operating-system.conf raid-controller.conf smart-attributes.conf storage.conf virtualization.conf vmware.conf web.conf - DESTINATION ${CMAKE_INSTALL_DATADIR}/icinga2/include/plugins-contrib.d + DESTINATION ${ICINGA2_INCLUDEDIR}/plugins-contrib.d ) diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index e1fbbfc9d..23397ba49 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -519,7 +519,7 @@ object CheckCommand "oracle_health" { vars.oracle_home = "/usr/lib/oracle/11.2/client64/lib" vars.oracle_ld_library_path = "/usr/lib/oracle/11.2/client64/lib" - vars.oracle_tns_admin = SysconfDir + "/icinga2/plugin-configs" + vars.oracle_tns_admin = ConfigDir + "/plugin-configs" } object CheckCommand "postgres" { diff --git a/itl/plugins-contrib.d/smart-attributes.conf b/itl/plugins-contrib.d/smart-attributes.conf index 25e3333dd..e668bd3cc 100644 --- a/itl/plugins-contrib.d/smart-attributes.conf +++ b/itl/plugins-contrib.d/smart-attributes.conf @@ -20,5 +20,5 @@ object CheckCommand "smart-attributes" { } } - vars.smart_attributes_config_path = SysconfDir + "/icinga2/plugins-config/check_smartdb.json" + vars.smart_attributes_config_path = ConfigDir + "/plugins-config/check_smartdb.json" } diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index d86f676d2..c16cda028 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -122,7 +122,7 @@ set_target_properties ( FOLDER Lib ) -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/cache/icinga2\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/icinga2/crash\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_CACHEDIR}\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_LOGDIR}/crash\")") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 4287c7687..0e6b018f2 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -168,7 +168,7 @@ void Application::SetResourceLimits() rlimit rl; # ifdef RLIMIT_NOFILE - rlim_t fileLimit = GetRLimitFiles(); + rlim_t fileLimit = GetConst("RLimitFiles"); if (fileLimit != 0) { if (fileLimit < GetDefaultRLimitFiles()) { @@ -189,7 +189,7 @@ void Application::SetResourceLimits() } # ifdef RLIMIT_NPROC - rlim_t processLimit = GetRLimitProcesses(); + rlim_t processLimit = GetConst("RLimitProcesses"); if (processLimit != 0) { if (processLimit < GetDefaultRLimitProcesses()) { @@ -228,7 +228,7 @@ void Application::SetResourceLimits() rlim_t stackLimit; - stackLimit = GetRLimitStack(); + stackLimit = GetConst("RLimitStack"); if (stackLimit != 0) { if (stackLimit < GetDefaultRLimitStack()) { @@ -543,16 +543,28 @@ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion) if (!skipVersion) os << " Application version: " << GetAppVersion() << "\n"; - os << " Installation root: " << GetPrefixDir() << "\n" - << " Sysconf directory: " << GetSysconfDir() << "\n" - << " Run directory: " << GetRunDir() << "\n" - << " Local state directory: " << GetLocalStateDir() << "\n" - << " Package data directory: " << GetPkgDataDir() << "\n" - << " State path: " << GetStatePath() << "\n" - << " Modified attributes path: " << GetModAttrPath() << "\n" - << " Objects path: " << GetObjectsPath() << "\n" - << " Vars path: " << GetVarsPath() << "\n" - << " PID path: " << GetPidPath() << "\n"; + os + << "\n" + << " Config directory: " << GetConst("ConfigDir") << "\n" + << " Data directory: " << GetConst("DataDir") << "\n" + << " Log directory: " << GetConst("LogDir") << "\n" + << " Cache directory: " << GetConst("CacheDir") << "\n" + << " Spool directory: " << GetConst("SpoolDir") << "\n" + << " Run directory: " << GetConst("InitRunDir") << "\n" + << "\n" + << "Older paths (deprecated):" << "\n" + << " Installation root: " << GetConst("PrefixDir") << "\n" + << " Sysconf directory: " << GetConst("SysconfDir") << "\n" + << " Run directory (base): " << GetConst("RunDir") << "\n" + << " Local state directory: " << GetConst("LocalStateDir") << "\n" + << "\n" + << "Internally used paths:" << "\n" + << " Package data directory: " << GetConst("PkgDataDir") << "\n" + << " State path: " << GetConst("StatePath") << "\n" + << " Modified attributes path: " << GetConst("ModAttrPath") << "\n" + << " Objects path: " << GetConst("ObjectsPath") << "\n" + << " Vars path: " << GetConst("VarsPath") << "\n" + << " PID path: " << GetConst("PidPath") << "\n"; os << "\n" << "System information:" << "\n" @@ -582,7 +594,7 @@ void Application::DisplayBugMessage(std::ostream& os) String Application::GetCrashReportFilename() { - return GetLocalStateDir() + "/log/icinga2/crash/report." + Convert::ToString(Utility::GetTime()); + return GetConst("LogDir") + "/crash/report." + Convert::ToString(Utility::GetTime()); } @@ -732,7 +744,7 @@ void Application::SigUsr2Handler(int) */ Application::Ptr instance = GetInstance(); try { - instance->UpdatePidFile(GetPidPath(), m_ReloadProcess); + instance->UpdatePidFile(GetConst("PidPath"), m_ReloadProcess); } catch (const std::exception&) { /* abort restart */ Log(LogCritical, "Application", "Cannot update PID file. Aborting restart operation."); @@ -1004,10 +1016,10 @@ int Application::Run() #endif /* _WIN32 */ try { - UpdatePidFile(GetPidPath()); + UpdatePidFile(GetConst("PidPath")); } catch (const std::exception&) { Log(LogCritical, "Application") - << "Cannot update PID file '" << GetPidPath() << "'. Aborting."; + << "Cannot update PID file '" << GetConst("PidPath") << "'. Aborting."; return EXIT_FAILURE; } @@ -1089,7 +1101,7 @@ void Application::ClosePidFile(bool unlink) if (m_PidFile) { if (unlink) { - String pidpath = GetPidPath(); + String pidpath = GetConst("PidPath"); ::unlink(pidpath.CStr()); } @@ -1157,310 +1169,37 @@ pid_t Application::ReadPidFile(const String& filename) return runningpid; } - /** - * Retrieves the path of the installation prefix. + * Declares a const with ScriptGlobal * - * @returns The path. + * @param name The const name. + * @param value The new value. */ -String Application::GetPrefixDir() +void Application::DeclareConst(const String& name, const Value& value) { - return ScriptGlobal::Get("PrefixDir"); + if (!ScriptGlobal::Exists(name)) + ScriptGlobal::Set(name, value); } /** - * Sets the path for the installation prefix. + * Returns the value of a const from ScriptGlobal * - * @param path The new path. + * @param name The const name. */ -void Application::DeclarePrefixDir(const String& path) +Value Application::GetConst(const String& name) { - if (!ScriptGlobal::Exists("PrefixDir")) - ScriptGlobal::Set("PrefixDir", path); + return GetConst(name, Empty); } /** - * Retrives the path of the sysconf dir. + * Returns the value of a const from ScriptGlobal with default value * - * @returns The path. + * @param name The const name. + * @param def The default value. */ -String Application::GetSysconfDir() +Value Application::GetConst(const String& name, Value defaultValue) { - return ScriptGlobal::Get("SysconfDir"); -} - -/** - * Sets the path of the sysconf dir. - * - * @param path The new path. - */ -void Application::DeclareSysconfDir(const String& path) -{ - if (!ScriptGlobal::Exists("SysconfDir")) - ScriptGlobal::Set("SysconfDir", path); -} - -/** - * Retrieves the path for the run dir. - * - * @returns The path. - */ -String Application::GetRunDir() -{ - return ScriptGlobal::Get("RunDir"); -} - -/** - * Sets the path of the run dir. - * - * @param path The new path. - */ -void Application::DeclareRunDir(const String& path) -{ - if (!ScriptGlobal::Exists("RunDir")) - ScriptGlobal::Set("RunDir", path); -} - -/** - * Retrieves the path for the local state dir. - * - * @returns The path. - */ -String Application::GetLocalStateDir() -{ - return ScriptGlobal::Get("LocalStateDir"); -} - -/** - * Sets the path for the local state dir. - * - * @param path The new path. - */ -void Application::DeclareLocalStateDir(const String& path) -{ - if (!ScriptGlobal::Exists("LocalStateDir")) - ScriptGlobal::Set("LocalStateDir", path); -} - -/** - * Retrieves the path for the local state dir. - * - * @returns The path. - */ -String Application::GetZonesDir() -{ - return ScriptGlobal::Get("ZonesDir", &Empty); -} - -/** - * Sets the path of the zones dir. - * - * @param path The new path. - */ -void Application::DeclareZonesDir(const String& path) -{ - if (!ScriptGlobal::Exists("ZonesDir")) - ScriptGlobal::Set("ZonesDir", path); -} - -/** - * Retrieves the path for the package data dir. - * - * @returns The path. - */ -String Application::GetPkgDataDir() -{ - String defaultValue = ""; - return ScriptGlobal::Get("PkgDataDir", &Empty); -} - -/** - * Sets the path for the package data dir. - * - * @param path The new path. - */ -void Application::DeclarePkgDataDir(const String& path) -{ - if (!ScriptGlobal::Exists("PkgDataDir")) - ScriptGlobal::Set("PkgDataDir", path); -} - -/** - * Retrieves the path for the include conf dir. - * - * @returns The path. - */ -String Application::GetIncludeConfDir() -{ - return ScriptGlobal::Get("IncludeConfDir", &Empty); -} - -/** - * Sets the path for the package data dir. - * - * @param path The new path. - */ -void Application::DeclareIncludeConfDir(const String& path) -{ - if (!ScriptGlobal::Exists("IncludeConfDir")) - ScriptGlobal::Set("IncludeConfDir", path); -} - -/** - * Retrieves the path for the state file. - * - * @returns The path. - */ -String Application::GetStatePath() -{ - return ScriptGlobal::Get("StatePath", &Empty); -} - -/** - * Sets the path for the state file. - * - * @param path The new path. - */ -void Application::DeclareStatePath(const String& path) -{ - if (!ScriptGlobal::Exists("StatePath")) - ScriptGlobal::Set("StatePath", path); -} - -/** - * Retrieves the path for the modified attributes file. - * - * @returns The path. - */ -String Application::GetModAttrPath() -{ - return ScriptGlobal::Get("ModAttrPath", &Empty); -} - -/** - * Sets the path for the modified attributes file. - * - * @param path The new path. - */ -void Application::DeclareModAttrPath(const String& path) -{ - if (!ScriptGlobal::Exists("ModAttrPath")) - ScriptGlobal::Set("ModAttrPath", path); -} - -/** - * Retrieves the path for the objects file. - * - * @returns The path. - */ -String Application::GetObjectsPath() -{ - return ScriptGlobal::Get("ObjectsPath", &Empty); -} - -/** - * Sets the path for the objects file. - * - * @param path The new path. - */ -void Application::DeclareObjectsPath(const String& path) -{ - if (!ScriptGlobal::Exists("ObjectsPath")) - ScriptGlobal::Set("ObjectsPath", path); -} - -/** -* Retrieves the path for the vars file. -* -* @returns The path. -*/ -String Application::GetVarsPath() -{ - return ScriptGlobal::Get("VarsPath", &Empty); -} - -/** -* Sets the path for the vars file. -* -* @param path The new path. -*/ -void Application::DeclareVarsPath(const String& path) -{ - if (!ScriptGlobal::Exists("VarsPath")) - ScriptGlobal::Set("VarsPath", path); -} - -/** - * Retrieves the path for the PID file. - * - * @returns The path. - */ -String Application::GetPidPath() -{ - return ScriptGlobal::Get("PidPath", &Empty); -} - -/** - * Sets the path for the PID file. - * - * @param path The new path. - */ -void Application::DeclarePidPath(const String& path) -{ - if (!ScriptGlobal::Exists("PidPath")) - ScriptGlobal::Set("PidPath", path); -} - -/** - * Retrieves the name of the user. - * - * @returns The name. - */ -String Application::GetRunAsUser() -{ - return ScriptGlobal::Get("RunAsUser"); -} - -/** - * Sets the name of the user. - * - * @param path The new user name. - */ -void Application::DeclareRunAsUser(const String& user) -{ - if (!ScriptGlobal::Exists("RunAsUser")) - ScriptGlobal::Set("RunAsUser", user); -} - -/** - * Retrieves the name of the group. - * - * @returns The name. - */ -String Application::GetRunAsGroup() -{ - return ScriptGlobal::Get("RunAsGroup"); -} - -/** - * Sets the name of the group. - * - * @param path The new group name. - */ -void Application::DeclareRunAsGroup(const String& group) -{ - if (!ScriptGlobal::Exists("RunAsGroup")) - ScriptGlobal::Set("RunAsGroup", group); -} - -/** - * Retrieves the file rlimit. - * - * @returns The limit. - */ -int Application::GetRLimitFiles() -{ - return ScriptGlobal::Get("RLimitFiles"); + return ScriptGlobal::Get(name, &defaultValue); } int Application::GetDefaultRLimitFiles() @@ -1468,80 +1207,16 @@ int Application::GetDefaultRLimitFiles() return 16 * 1024; } -/** - * Sets the file rlimit. - * - * @param path The new file rlimit. - */ -void Application::DeclareRLimitFiles(int limit) -{ - if (!ScriptGlobal::Exists("RLimitFiles")) - ScriptGlobal::Set("RLimitFiles", limit); -} - -/** - * Retrieves the process rlimit. - * - * @returns The limit. - */ -int Application::GetRLimitProcesses() -{ - return ScriptGlobal::Get("RLimitProcesses"); -} - int Application::GetDefaultRLimitProcesses() { return 16 * 1024; } -/** - * Sets the process rlimit. - * - * @param path The new process rlimit. - */ -void Application::DeclareRLimitProcesses(int limit) -{ - if (!ScriptGlobal::Exists("RLimitProcesses")) - ScriptGlobal::Set("RLimitProcesses", limit); -} - -/** - * Retrieves the stack rlimit. - * - * @returns The limit. - */ -int Application::GetRLimitStack() -{ - return ScriptGlobal::Get("RLimitStack"); -} - int Application::GetDefaultRLimitStack() { return 256 * 1024; } -/** - * Sets the stack rlimit. - * - * @param path The new stack rlimit. - */ -void Application::DeclareRLimitStack(int limit) -{ - if (!ScriptGlobal::Exists("RLimitStack")) - ScriptGlobal::Set("RLimitStack", limit); -} - -/** - * Sets the concurrency level. - * - * @param path The new concurrency level. - */ -void Application::DeclareConcurrency(int ncpus) -{ - if (!ScriptGlobal::Exists("Concurrency")) - ScriptGlobal::Set("Concurrency", ncpus); -} - /** * Retrieves the concurrency level. * @@ -1563,17 +1238,6 @@ void Application::SetMaxConcurrentChecks(int maxChecks) ScriptGlobal::Set("MaxConcurrentChecks", maxChecks); } -/** - * Sets the max concurrent checks. - * - * @param maxChecks The new limit. - */ -void Application::DeclareMaxConcurrentChecks(int maxChecks) -{ - if (!ScriptGlobal::Exists("MaxConcurrentChecks")) - ScriptGlobal::Set("MaxConcurrentChecks", maxChecks); -} - /** * Retrieves the max concurrent checks. * diff --git a/lib/base/application.hpp b/lib/base/application.hpp index 7722d25f4..dbb14c38d 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -85,70 +85,21 @@ public: static String GetExePath(const String& argv0); - static String GetPrefixDir(); - static void DeclarePrefixDir(const String& path); - - static String GetSysconfDir(); - static void DeclareSysconfDir(const String& path); - - static String GetZonesDir(); - static void DeclareZonesDir(const String& path); - - static String GetRunDir(); - static void DeclareRunDir(const String& path); - - static String GetLocalStateDir(); - static void DeclareLocalStateDir(const String& path); - - static String GetPkgDataDir(); - static void DeclarePkgDataDir(const String& path); - - static String GetIncludeConfDir(); - static void DeclareIncludeConfDir(const String& path); - - static String GetStatePath(void); - static void DeclareStatePath(const String& path); - - static String GetModAttrPath(); - static void DeclareModAttrPath(const String& path); - - static String GetObjectsPath(); - static void DeclareObjectsPath(const String& path); - - static String GetVarsPath(); - static void DeclareVarsPath(const String& path); - - static String GetPidPath(); - static void DeclarePidPath(const String& path); - - static String GetRunAsUser(); - static void DeclareRunAsUser(const String& user); - - static String GetRunAsGroup(); - static void DeclareRunAsGroup(const String& group); + static void DeclareConst(const String& name, const Value& value); + static Value GetConst(const String& name); + static Value GetConst(const String& name, Value defaultValue); #ifdef _WIN32 static bool IsProcessElevated(); #endif /* _WIN32 */ - static int GetRLimitFiles(); static int GetDefaultRLimitFiles(); - static void DeclareRLimitFiles(int limit); - - static int GetRLimitProcesses(); static int GetDefaultRLimitProcesses(); - static void DeclareRLimitProcesses(int limit); - - static int GetRLimitStack(); static int GetDefaultRLimitStack(); - static void DeclareRLimitStack(int limit); static int GetConcurrency(); - static void DeclareConcurrency(int ncpus); - static int GetMaxConcurrentChecks(); static int GetDefaultMaxConcurrentChecks(); - static void DeclareMaxConcurrentChecks(int maxChecks); static void SetMaxConcurrentChecks(int maxChecks); static ThreadPool& GetTP(); diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index c3fe07bd9..42fc92921 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -535,7 +535,7 @@ std::shared_ptr CreateCert(EVP_PKEY *pubkey, X509_NAME *subject, X509_NAME String GetIcingaCADir() { - return Application::GetLocalStateDir() + "/lib/icinga2/ca"; + return Application::GetConst("DataDir") + "/ca"; } std::shared_ptr CreateCertIcingaCA(EVP_PKEY *pubkey, X509_NAME *subject) diff --git a/lib/checker/CMakeLists.txt b/lib/checker/CMakeLists.txt index 8f3de0b1b..65bca61bb 100644 --- a/lib/checker/CMakeLists.txt +++ b/lib/checker/CMakeLists.txt @@ -36,14 +36,14 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/checker.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) if(NOT WIN32) - install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled\")") - install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/checker.conf \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled/checker.conf\")") + install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled\")") + install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/checker.conf \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled/checker.conf\")") else() - install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/checker.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) + install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/checker.conf ${ICINGA2_CONFIGDIR}/features-enabled) endif() set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 1b60a2c1a..a7739227c 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -40,7 +40,7 @@ using namespace icinga; String ApiSetupUtility::GetConfdPath() { - return Application::GetSysconfDir() + "/icinga2/conf.d"; + return Application::GetConst("ConfigDir") + "/conf.d"; } String ApiSetupUtility::GetApiUsersConfPath() diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index ba2dade47..eda40a7fb 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -72,7 +72,7 @@ static bool Daemonize() do { Utility::Sleep(0.1); - readpid = Application::ReadPidFile(Application::GetPidPath()); + readpid = Application::ReadPidFile(Application::GetConst("PidPath")); ret = waitpid(pid, &status, WNOHANG); } while (readpid != pid && ret == 0); @@ -193,7 +193,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector 0) { Log(LogCritical, "cli") << "Another instance of Icinga already running with PID " << runningpid; @@ -204,14 +204,16 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector configs; if (vm.count("config") > 0) configs = vm["config"].as >(); - else if (!vm.count("no-config")) - configs.push_back(Application::GetSysconfDir() + "/icinga2/icinga2.conf"); + else if (!vm.count("no-config")) { + String configDir = Application::GetConst("ConfigDir"); + configs.push_back(configDir + "/icinga2.conf"); + } Log(LogInformation, "cli", "Loading configuration file(s)."); std::vector newItems; - if (!DaemonUtility::LoadConfigFiles(configs, newItems, Application::GetObjectsPath(), Application::GetVarsPath())) + if (!DaemonUtility::LoadConfigFiles(configs, newItems, Application::GetConst("ObjectsPath"), Application::GetConst("VarsPath"))) return EXIT_FAILURE; if (vm.count("validate")) { @@ -253,7 +255,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector& configs, * unfortunately moving it there is somewhat non-trivial. */ success = true; - String zonesEtcDir = Application::GetZonesDir(); + String zonesEtcDir = Application::GetConst("ZonesDir"); if (!zonesEtcDir.IsEmpty() && Utility::PathExists(zonesEtcDir)) Utility::Glob(zonesEtcDir + "/*", std::bind(&IncludeZoneDirRecursive, _1, "_etc", std::ref(success)), GlobDirectory); @@ -130,7 +130,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, /* Load package config files - they may contain additional zones which * are authoritative on this node and are checked in HasZoneConfigAuthority(). */ - String packagesVarDir = Application::GetLocalStateDir() + "/lib/icinga2/api/packages"; + String packagesVarDir = Application::GetConst("DataDir") + "/api/packages"; if (Utility::PathExists(packagesVarDir)) Utility::Glob(packagesVarDir + "/*", std::bind(&IncludePackage, _1, std::ref(success)), GlobDirectory); @@ -138,7 +138,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, return false; /* Load cluster synchronized configuration files */ - String zonesVarDir = Application::GetLocalStateDir() + "/lib/icinga2/api/zones"; + String zonesVarDir = Application::GetConst("DataDir") + "/api/zones"; if (Utility::PathExists(zonesVarDir)) Utility::Glob(zonesVarDir + "/*", std::bind(&IncludeNonLocalZone, _1, "_cluster", std::ref(success)), GlobDirectory); diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index 9056b60fe..e01834c70 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -31,12 +31,12 @@ using namespace icinga; String FeatureUtility::GetFeaturesAvailablePath() { - return Application::GetSysconfDir() + "/icinga2/features-available"; + return Application::GetConst("ConfigDir") + "/features-available"; } String FeatureUtility::GetFeaturesEnabledPath() { - return Application::GetSysconfDir() + "/icinga2/features-enabled"; + return Application::GetConst("ConfigDir") + "/features-enabled"; } std::vector FeatureUtility::GetFieldCompletionSuggestions(const String& word, bool enable) diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index d0289b4fb..652f70f28 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -410,7 +410,7 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm, } else { /* We cannot retrieve the parent certificate. * Tell the user to manually copy the ca.crt file - * into LocalStateDir + "/lib/icinga2/certs" + * into DataDir + "/certs" */ Log(LogWarning, "cli") << "\nNo connection to the parent node was specified.\n\n" diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index eb9080b97..259988259 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -43,12 +43,12 @@ using namespace icinga; String NodeUtility::GetConstantsConfPath() { - return Application::GetSysconfDir() + "/icinga2/constants.conf"; + return Application::GetConst("ConfigDir") + "/constants.conf"; } String NodeUtility::GetZonesConfPath() { - return Application::GetSysconfDir() + "/icinga2/zones.conf"; + return Application::GetConst("ConfigDir") + "/zones.conf"; } /* @@ -274,7 +274,7 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec */ bool NodeUtility::UpdateConfiguration(const String& value, bool include, bool recursive) { - String configurationFile = Application::GetSysconfDir() + "/icinga2/icinga2.conf"; + String configurationFile = Application::GetConst("ConfigDir") + "/icinga2.conf"; Log(LogInformation, "cli") << "Updating '" << value << "' include in '" << configurationFile << "'."; diff --git a/lib/cli/nodewizardcommand.cpp b/lib/cli/nodewizardcommand.cpp index b5e143730..11e035aa7 100644 --- a/lib/cli/nodewizardcommand.cpp +++ b/lib/cli/nodewizardcommand.cpp @@ -392,7 +392,7 @@ wizard_ticket: } else { /* We cannot retrieve the parent certificate. * Tell the user to manually copy the ca.crt file - * into LocalStateDir + "/lib/icinga2/certs" + * into DataDir + "/certs" */ std::cout << ConsoleColorTag(Console_Bold) @@ -850,7 +850,7 @@ wizard_global_zone_loop_start: } /* Include api-users.conf */ - String apiUsersFilePath = Application::GetSysconfDir() + "/icinga2/conf.d/api-users.conf"; + String apiUsersFilePath = Application::GetConst("ConfigDir") + "/conf.d/api-users.conf"; std::cout << ConsoleColorTag(Console_Bold | Console_ForegroundGreen) << "Checking if the api-users.conf file exists...\n" diff --git a/lib/cli/objectlistcommand.cpp b/lib/cli/objectlistcommand.cpp index f5e46448c..f5c347eed 100644 --- a/lib/cli/objectlistcommand.cpp +++ b/lib/cli/objectlistcommand.cpp @@ -67,11 +67,11 @@ void ObjectListCommand::InitParameters(boost::program_options::options_descripti */ int ObjectListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - String objectfile = Application::GetObjectsPath(); + String objectfile = Application::GetConst("ObjectsPath"); if (!Utility::PathExists(objectfile)) { Log(LogCritical, "cli") - << "Cannot open objects file '" << Application::GetObjectsPath() << "'."; + << "Cannot open objects file '" << Application::GetConst("ObjectsPath") << "'."; Log(LogCritical, "cli", "Run 'icinga2 daemon -C' to validate config and generate the cache file."); return 1; } diff --git a/lib/cli/troubleshootcommand.cpp b/lib/cli/troubleshootcommand.cpp index aabd9e41a..6c72e1426 100644 --- a/lib/cli/troubleshootcommand.cpp +++ b/lib/cli/troubleshootcommand.cpp @@ -147,16 +147,26 @@ bool TroubleshootCommand::GeneralInfo(InfoLog& log, const boost::program_options //Application::DisplayInfoMessage() but formatted InfoLogLine(log) - << "\tApplication version: " << Application::GetAppVersion() << '\n' - << "\tInstallation root: " << Application::GetPrefixDir() << '\n' - << "\tSysconf directory: " << Application::GetSysconfDir() << '\n' - << "\tRun directory: " << Application::GetRunDir() << '\n' - << "\tLocal state directory: " << Application::GetLocalStateDir() << '\n' - << "\tPackage data directory: " << Application::GetPkgDataDir() << '\n' - << "\tState path: " << Application::GetStatePath() << '\n' - << "\tObjects path: " << Application::GetObjectsPath() << '\n' - << "\tVars path: " << Application::GetVarsPath() << '\n' - << "\tPID path: " << Application::GetPidPath() << '\n'; + << "\tApplication version: " << Application::GetConst("AppVersion") << '\n' + << "\t\n" + << "\tConfig directory: " << Application::GetConst("ConfigDir") << "\n" + << "\tData directory: " << Application::GetConst("DataDir") << "\n" + << "\tLog directory: " << Application::GetConst("LogDir") << "\n" + << "\tCache directory: " << Application::GetConst("CacheDir") << "\n" + << "\tRun directory: " << Application::GetConst("InitRunDir") << "\n" + << "\t\n" + << "Older paths (deprecated):" << "\n" + << "\tInstallation root: " << Application::GetConst("PrefixDir") << '\n' + << "\tSysconf directory: " << Application::GetConst("SysconfDir") << '\n' + << "\tRun directory: " << Application::GetConst("RunDir") << '\n' + << "\tLocal state directory: " << Application::GetConst("LocalStateDir") << '\n' + << "\t\n" + << "Internally used paths:" << "\n" + << "\tPackage data directory: " << Application::GetConst("PkgDataDir") << '\n' + << "\tState path: " << Application::GetConst("StatePath") << '\n' + << "\tObjects path: " << Application::GetConst("ObjectsPath") << '\n' + << "\tVars path: " << Application::GetConst("VarsPath") << '\n' + << "\tPID path: " << Application::GetConst("PidPath") << '\n'; InfoLogLine(log) << '\n'; @@ -176,7 +186,7 @@ bool TroubleshootCommand::ObjectInfo(InfoLog& log, const boost::program_options: InfoLogLine(log, Console_ForegroundBlue) << std::string(14, '=') << " OBJECT INFORMATION " << std::string(14, '=') << "\n\n"; - String objectfile = Application::GetObjectsPath(); + String objectfile = Application::GetConst("ObjectsPath"); std::set configs; if (!Utility::PathExists(objectfile)) { @@ -252,14 +262,14 @@ bool TroubleshootCommand::ConfigInfo(InfoLog& log, const boost::program_options: InfoLogLine(log) << "A collection of important configuration files follows, please make sure to remove any sensitive data such as credentials, internal company names, etc\n"; - if (!PrintFile(log, Application::GetSysconfDir() + "/icinga2/icinga2.conf")) { + if (!PrintFile(log, Application::GetConst("ConfigDir") + "/icinga2.conf")) { InfoLogLine(log, 0, LogWarning) << "icinga2.conf not found, therefore skipping validation.\n" << "If you are using an icinga2.conf somewhere but the default path please validate it via 'icinga2 daemon -C -c \"path\to/icinga2.conf\"'\n" << "and provide it with your support request.\n"; } - if (!PrintFile(log, Application::GetSysconfDir() + "/icinga2/zones.conf")) { + if (!PrintFile(log, Application::GetConst("ConfigDir") + "/zones.conf")) { InfoLogLine(log, 0, LogWarning) << "zones.conf not found.\n" << "If you are using a zones.conf somewhere but the default path please provide it with your support request\n"; @@ -370,7 +380,7 @@ void TroubleshootCommand::GetLatestReport(const String& filename, time_t& bestTi bool TroubleshootCommand::PrintCrashReports(InfoLog& log) { - String spath = Application::GetLocalStateDir() + "/log/icinga2/crash/report.*"; + String spath = Application::GetConst("LogDir") + "/crash/report.*"; time_t bestTimestamp = 0; String bestFilename; @@ -383,7 +393,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) if (int const * err = boost::get_error_info(ex)) { if (*err != 3) {//Error code for path does not exist InfoLogLine(log, 0, LogWarning) - << Application::GetLocalStateDir() << "/log/icinga2/crash/ does not exist\n"; + << Application::GetConst("LogDir") + "/crash/ does not exist\n"; return false; } @@ -396,7 +406,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) #else catch (...) { InfoLogLine(log, 0, LogWarning) << "Error printing crash reports.\n" - << "Does " << Application::GetLocalStateDir() << "/log/icinga2/crash/ exist?\n"; + << "Does " << Application::GetConst("LogDir") + "/crash/ exist?\n"; return false; } @@ -404,7 +414,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) if (!bestTimestamp) InfoLogLine(log, Console_ForegroundYellow) - << "No crash logs found in " << Application::GetLocalStateDir().CStr() << "/log/icinga2/crash/\n\n"; + << "No crash logs found in " << Application::GetConst("LogDir") << "/crash/\n\n"; else { InfoLogLine(log) << "Latest crash report is from " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", Utility::GetTime()) << '\n' @@ -444,7 +454,9 @@ bool TroubleshootCommand::PrintFile(InfoLog& log, const String& path) bool TroubleshootCommand::CheckConfig() { - return DaemonUtility::ValidateConfigFiles({ Application::GetSysconfDir() + "/icinga2/icinga2.conf" }, Application::GetObjectsPath()); + String configDir = Application::GetConst("ConfigDir"); + String objectsPath = Application::GetConst("ObjectsPath"); + return DaemonUtility::ValidateConfigFiles({ configDir + "/icinga2.conf" }, objectsPath); } //print is supposed allow the user to print the object file @@ -610,10 +622,10 @@ void TroubleshootCommand::InitParameters(boost::program_options::options_descrip int TroubleshootCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { #ifdef _WIN32 //Dislikes ':' in filenames - String path = Application::GetLocalStateDir() + "/log/icinga2/troubleshooting-" + String path = Application::GetConst("LogDir") + "/troubleshooting-" + Utility::FormatDateTime("%Y-%m-%d_%H-%M-%S", Utility::GetTime()) + ".log"; #else - String path = Application::GetLocalStateDir() + "/log/icinga2/troubleshooting-" + String path = Application::GetConst("LogDir") + "/troubleshooting-" + Utility::FormatDateTime("%Y-%m-%d_%H:%M:%S", Utility::GetTime()) + ".log"; #endif /*_WIN32*/ diff --git a/lib/cli/variablegetcommand.cpp b/lib/cli/variablegetcommand.cpp index 76fa634aa..855770148 100644 --- a/lib/cli/variablegetcommand.cpp +++ b/lib/cli/variablegetcommand.cpp @@ -75,7 +75,7 @@ int VariableGetCommand::Run(const boost::program_options::variables_map& vm, con return 0; } - String varsfile = Application::GetVarsPath(); + String varsfile = Application::GetConst("VarsPath"); if (!Utility::PathExists(varsfile)) { Log(LogCritical, "cli") diff --git a/lib/cli/variablelistcommand.cpp b/lib/cli/variablelistcommand.cpp index 9aff1cbea..9ebbadf11 100644 --- a/lib/cli/variablelistcommand.cpp +++ b/lib/cli/variablelistcommand.cpp @@ -53,7 +53,7 @@ String VariableListCommand::GetShortDescription() const */ int VariableListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - String varsfile = Application::GetVarsPath(); + String varsfile = Application::GetConst("VarsPath"); if (!Utility::PathExists(varsfile)) { Log(LogCritical, "cli") diff --git a/lib/cli/variableutility.cpp b/lib/cli/variableutility.cpp index 9044a9e9b..ed9bd770d 100644 --- a/lib/cli/variableutility.cpp +++ b/lib/cli/variableutility.cpp @@ -31,7 +31,7 @@ using namespace icinga; Value VariableUtility::GetVariable(const String& name) { - String varsfile = Application::GetVarsPath(); + String varsfile = Application::GetConst("VarsPath"); std::fstream fp; fp.open(varsfile.CStr(), std::ios_base::in); @@ -61,7 +61,7 @@ Value VariableUtility::GetVariable(const String& name) void VariableUtility::PrintVariables(std::ostream& outfp) { - String varsfile = Application::GetVarsPath(); + String varsfile = Application::GetConst("VarsPath"); std::fstream fp; fp.open(varsfile.CStr(), std::ios_base::in); diff --git a/lib/compat/CMakeLists.txt b/lib/compat/CMakeLists.txt index df4a3e0eb..be33add0b 100644 --- a/lib/compat/CMakeLists.txt +++ b/lib/compat/CMakeLists.txt @@ -42,21 +42,21 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/command.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/compatlog.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/statusdata.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/log/icinga2/compat/archives\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/spool/icinga2\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_RUNDIR}/icinga2/cmd\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_LOGDIR}/compat/archives\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_SPOOLDIR}\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_INITRUNDIR}/cmd\")") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/compat/checkresultreader.ti b/lib/compat/checkresultreader.ti index 18b3d0ac4..cc558a553 100644 --- a/lib/compat/checkresultreader.ti +++ b/lib/compat/checkresultreader.ti @@ -30,7 +30,7 @@ class CheckResultReader : ConfigObject activation_priority 100; [config] String spool_dir { - default {{{ return Application::GetLocalStateDir() + "/lib/icinga2/spool/checkresults/"; }}} + default {{{ return Application::GetConst("DataDir") + "/spool/checkresults/"; }}} }; }; diff --git a/lib/compat/compatlogger.ti b/lib/compat/compatlogger.ti index 322236cd8..4066a72bd 100644 --- a/lib/compat/compatlogger.ti +++ b/lib/compat/compatlogger.ti @@ -30,7 +30,7 @@ class CompatLogger : ConfigObject activation_priority 100; [config] String log_dir { - default {{{ return Application::GetLocalStateDir() + "/log/icinga2/compat"; }}} + default {{{ return Application::GetConst("LogDir") + "/compat"; }}} }; [config] String rotation_method { default {{{ return "HOURLY"; }}} diff --git a/lib/compat/externalcommandlistener.ti b/lib/compat/externalcommandlistener.ti index baffb7f51..697b3a0c4 100644 --- a/lib/compat/externalcommandlistener.ti +++ b/lib/compat/externalcommandlistener.ti @@ -30,7 +30,7 @@ class ExternalCommandListener : ConfigObject activation_priority 100; [config] String command_path { - default {{{ return Application::GetRunDir() + "/icinga2/cmd/icinga2.cmd"; }}} + default {{{ return Application::GetConst("InitRunDir") + "/cmd/icinga2.cmd"; }}} }; }; diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index 407a14d9a..e5a4578ac 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -559,7 +559,7 @@ void StatusDataWriter::UpdateObjectsCache() { CONTEXT("Writing objects.cache file"); - String objectsPath = GetObjectsPath(); + String objectsPath = Application::GetConst("ObjectsPath"); std::fstream objectfp; String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0644, objectfp); diff --git a/lib/compat/statusdatawriter.ti b/lib/compat/statusdatawriter.ti index 5ac2969a9..846834f31 100644 --- a/lib/compat/statusdatawriter.ti +++ b/lib/compat/statusdatawriter.ti @@ -30,10 +30,10 @@ class StatusDataWriter : ConfigObject activation_priority 100; [config] String status_path { - default {{{ return Application::GetLocalStateDir() + "/cache/icinga2/status.dat"; }}} + default {{{ return Application::GetConst("CacheDir") + "/status.dat"; }}} }; [config] String objects_path { - default {{{ return Application::GetLocalStateDir() + "/cache/icinga2/objects.cache"; }}} + default {{{ return Application::GetConst("CacheDir") + "/objects.cache"; }}} }; [config] double update_interval { default {{{ return 15; }}} diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index e20612860..af2afd017 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -577,8 +577,8 @@ bool ConfigItem::ActivateItems(WorkQueue& upq, const std::vector expression = ConfigCompiler::CompileFile(Application::GetModAttrPath()); + if (Utility::PathExists(Application::GetConst("ModAttrPath"))) { + std::unique_ptr expression = ConfigCompiler::CompileFile(Application::GetConst("ModAttrPath")); if (expression) { try { diff --git a/lib/db_ido_mysql/CMakeLists.txt b/lib/db_ido_mysql/CMakeLists.txt index 1587cbf19..30e180f65 100644 --- a/lib/db_ido_mysql/CMakeLists.txt +++ b/lib/db_ido_mysql/CMakeLists.txt @@ -38,7 +38,7 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/ido-mysql.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install( diff --git a/lib/db_ido_pgsql/CMakeLists.txt b/lib/db_ido_pgsql/CMakeLists.txt index 35f15fab5..b34736e66 100644 --- a/lib/db_ido_pgsql/CMakeLists.txt +++ b/lib/db_ido_pgsql/CMakeLists.txt @@ -38,7 +38,7 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/ido-pgsql.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install( diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 454c78d6d..6ac00aa60 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -156,13 +156,13 @@ static void PersistModAttrHelper(std::fstream& fp, ConfigObject::Ptr& previousOb void IcingaApplication::DumpProgramState() { - ConfigObject::DumpObjects(GetStatePath()); + ConfigObject::DumpObjects(GetConst("StatePath")); DumpModifiedAttributes(); } void IcingaApplication::DumpModifiedAttributes() { - String path = GetModAttrPath(); + String path = GetConst("ModAttrPath"); std::fstream fp; String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0644, fp); diff --git a/lib/icinga/icingaapplication.hpp b/lib/icinga/icingaapplication.hpp index 51216a02c..eac7f5903 100644 --- a/lib/icinga/icingaapplication.hpp +++ b/lib/icinga/icingaapplication.hpp @@ -46,8 +46,6 @@ public: static IcingaApplication::Ptr GetInstance(); - String GetPidPath() const; - bool ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Value *result) const override; String GetNodeName() const; diff --git a/lib/livestatus/CMakeLists.txt b/lib/livestatus/CMakeLists.txt index e93e2624b..9b657645f 100644 --- a/lib/livestatus/CMakeLists.txt +++ b/lib/livestatus/CMakeLists.txt @@ -72,9 +72,9 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/livestatus.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_RUNDIR}/icinga2/cmd\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_INITRUNDIR}/cmd\")") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/livestatus/livestatuslistener.ti b/lib/livestatus/livestatuslistener.ti index 0742a6fb5..1a4729d5e 100644 --- a/lib/livestatus/livestatuslistener.ti +++ b/lib/livestatus/livestatuslistener.ti @@ -32,7 +32,7 @@ class LivestatusListener : ConfigObject { default {{{ return "unix"; }}} }; [config] String socket_path { - default {{{ return Application::GetRunDir() + "/icinga2/cmd/livestatus"; }}} + default {{{ return Application::GetConst("InitRunDir") + "/cmd/livestatus"; }}} }; [config] String bind_host { default {{{ return "127.0.0.1"; }}} @@ -41,7 +41,7 @@ class LivestatusListener : ConfigObject { default {{{ return "6558"; }}} }; [config] String compat_log_path { - default {{{ return Application::GetLocalStateDir() + "/log/icinga2/compat"; }}} + default {{{ return Application::GetConst("LogDir") + "/compat"; }}} }; }; diff --git a/lib/notification/CMakeLists.txt b/lib/notification/CMakeLists.txt index 6c5940b9a..91207ad6d 100644 --- a/lib/notification/CMakeLists.txt +++ b/lib/notification/CMakeLists.txt @@ -36,14 +36,14 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/notification.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) if(NOT WIN32) - install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled\")") - install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/notification.conf \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_SYSCONFDIR}/icinga2/features-enabled/notification.conf\")") + install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled\")") + install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/notification.conf \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled/notification.conf\")") else() - install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/notification.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) + install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/notification.conf ${ICINGA2_CONFIGDIR}/features-enabled) endif() set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/perfdata/CMakeLists.txt b/lib/perfdata/CMakeLists.txt index 7b0780414..06a9f7336 100644 --- a/lib/perfdata/CMakeLists.txt +++ b/lib/perfdata/CMakeLists.txt @@ -46,35 +46,35 @@ set_target_properties ( install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/gelf.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/graphite.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/influxdb.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/elasticsearch.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/opentsdb.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) install_if_not_exists( ${PROJECT_SOURCE_DIR}/etc/icinga2/features-available/perfdata.conf - ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-available + ${ICINGA2_CONFIGDIR}/features-available ) -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/spool/icinga2/perfdata\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/spool/icinga2/tmp\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_SPOOLDIR}/perfdata\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_SPOOLDIR}/tmp\")") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index c0988f339..4b6560291 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -30,16 +30,16 @@ class PerfdataWriter : ConfigObject activation_priority 100; [config] String host_perfdata_path { - default {{{ return Application::GetLocalStateDir() + "/spool/icinga2/perfdata/host-perfdata"; }}} + default {{{ return Application::GetConst("SpoolDir") + "/perfdata/host-perfdata"; }}} }; [config] String service_perfdata_path { - default {{{ return Application::GetLocalStateDir() + "/spool/icinga2/perfdata/service-perfdata"; }}} + default {{{ return Application::GetConst("SpoolDir") + "/perfdata/service-perfdata"; }}} }; [config] String host_temp_path { - default {{{ return Application::GetLocalStateDir() + "/spool/icinga2/tmp/host-perfdata"; }}} + default {{{ return Application::GetConst("SpoolDir") + "/tmp/host-perfdata"; }}} }; [config] String service_temp_path { - default {{{ return Application::GetLocalStateDir() + "/spool/icinga2/tmp/service-perfdata"; }}} + default {{{ return Application::GetConst("SpoolDir") + "/tmp/service-perfdata"; }}} }; [config] String host_format_template { default {{{ diff --git a/lib/remote/CMakeLists.txt b/lib/remote/CMakeLists.txt index bb9593c56..61b6523ff 100644 --- a/lib/remote/CMakeLists.txt +++ b/lib/remote/CMakeLists.txt @@ -76,10 +76,10 @@ set_target_properties ( FOLDER Lib ) -#install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2/api\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2/api/log\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2/api/zones\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2/certs\")") -install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/icinga2/certificate-requests\")") +#install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}/api\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}/api/log\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}/api/zones\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}/certs\")") +install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_DATADIR}/certificate-requests\")") diff --git a/lib/remote/apilistener-filesync.cpp b/lib/remote/apilistener-filesync.cpp index 30a79a35f..0c8987237 100644 --- a/lib/remote/apilistener-filesync.cpp +++ b/lib/remote/apilistener-filesync.cpp @@ -202,7 +202,7 @@ void ApiListener::SyncZoneDir(const Zone::Ptr& zone) const if (sumUpdates == 0) return; - String oldDir = Application::GetLocalStateDir() + "/lib/icinga2/api/zones/" + zone->GetName(); + String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName(); Log(LogInformation, "ApiListener") << "Copying " << sumUpdates << " zone configuration files for zone '" << zone->GetName() << "' to '" << oldDir << "'."; @@ -240,7 +240,7 @@ void ApiListener::SendConfigUpdate(const JsonRpcConnection::Ptr& aclient) Dictionary::Ptr configUpdateV1 = new Dictionary(); Dictionary::Ptr configUpdateV2 = new Dictionary(); - String zonesDir = Application::GetLocalStateDir() + "/lib/icinga2/api/zones"; + String zonesDir = Application::GetConst("DataDir") + "/api/zones"; for (const Zone::Ptr& zone : ConfigType::GetObjectsByType()) { String zoneDir = zonesDir + "/" + zone->GetName(); @@ -315,7 +315,7 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D continue; } - String oldDir = Application::GetLocalStateDir() + "/lib/icinga2/api/zones/" + zone->GetName(); + String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName(); Utility::MkDirP(oldDir, 0700); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c1546710d..c7ba834b4 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -56,22 +56,22 @@ ApiListener::ApiListener() String ApiListener::GetApiDir() { - return Application::GetLocalStateDir() + "/lib/icinga2/api/"; + return Application::GetConst("DataDir") + "/api/"; } String ApiListener::GetCertsDir() { - return Application::GetLocalStateDir() + "/lib/icinga2/certs/"; + return Application::GetConst("DataDir") + "/certs/"; } String ApiListener::GetCaDir() { - return Application::GetLocalStateDir() + "/lib/icinga2/ca/"; + return Application::GetConst("DataDir") + "/ca/"; } String ApiListener::GetCertificateRequestsDir() { - return Application::GetLocalStateDir() + "/lib/icinga2/certificate-requests/"; + return Application::GetConst("DataDir") + "/certificate-requests/"; } String ApiListener::GetDefaultCertPath() diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 56ed57f7b..19b1022e8 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -30,7 +30,7 @@ using namespace icinga; String ConfigPackageUtility::GetPackageDir() { - return Application::GetLocalStateDir() + "/lib/icinga2/api/packages"; + return Application::GetConst("DataDir") + "/api/packages"; } void ConfigPackageUtility::CreatePackage(const String& name) From 542775294ebef3fb7b23951ec09d8e0b4d930525 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 6 Aug 2018 15:09:27 +0200 Subject: [PATCH 0120/1162] Docs: Improve the global constants section Signed-off-by: Michael Friedrich --- doc/17-language-reference.md | 38 ++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 91828f753..1f50f610c 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -386,11 +386,12 @@ once they are set. ### Icinga 2 Specific Constants -Icinga 2 provides a number of special global constants. Some of them can be overridden using the `--define` command line parameter: +Icinga 2 provides a number of special global constants. These include directory paths, global configuration +and runtime parameters for the application version and (build) platform. -Defaults for paths in `/etc` and `/var` are based on `SysconfDir` and `LocalStateDir` respectively. +Directory paths: -Variable |Description +Constant | Description --------------------|------------------- ConfigDir |**Read-only.** Main configuration directory. Usually set to `/etc/icinga2`. DataDir |**Read-only.** Runtime data for the Icinga daemon. Usually set to `/var/lib/icinga2`. @@ -399,10 +400,22 @@ CacheDir |**Read-only.** Cached status information of the daemon. Usu SpoolDir |**Read-only.** Spool directory for certain data outputs. Usually set to `/var/spool/icinga2`. InitRunDir |**Read-only.** Directory for PID files and sockets in daemon mode. Usually set to `/run/icinga2`. ZonesDir |**Read-only.** Contains the path of the zones.d directory. Defaults to `ConfigDir + "/zones.d"`. + +Global configuration: + +Constant | Description +--------------------|------------------- Vars |**Read-write.** Contains a dictionary with global custom attributes. Not set by default. NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. +MaxConcurrentChecks |**Read-write**. The number of max checks run simultaneously. Defaults to `512`. +Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. + +Application runtime details: + +Constant | Description +--------------------|------------------- PlatformName |**Read-only.** The name of the operating system, e.g. `Ubuntu`. PlatformVersion |**Read-only.** The version of the operating system, e.g. `14.04.3 LTS`. PlatformKernel |**Read-only.** The name of the operating system kernel, e.g. `Linux`. @@ -411,11 +424,16 @@ BuildCompilerName |**Read-only.** The name of the compiler Icinga was built wi BuildCompilerVersion|**Read-only.** The version of the compiler Icinga was built with, e.g. `7.3.0.7030031`. BuildHostName |**Read-only.** The name of the host Icinga was built on, e.g. `acheron`. ApplicationVersion |**Read-only.** The application version, e.g. `2.9.0`. -MaxConcurrentChecks |**Read-write**. The number of max checks run simultaneously. Defaults to `512`. -Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. -Certain variables are used to define file paths, you should never need to change them, as they are built based on -constants above. +Writable constants can be specified on the CLI using the `--define/-D` parameter. + +> **Note for v2.10+** +> +> Default paths which include `/etc` and `/var` as base directory continue to work +> based on the `SysconfDir` and `LocalStateDir` constants respectively. + +In addition to that, the constants below are used to define specific file paths. You should never need +to change them, as they are pre-compiled based on the constants above. Variable |Description --------------------|------------------- @@ -424,12 +442,12 @@ ObjectsPath |**Read-write.** Contains the path of the Icinga 2 objects f PidPath |**Read-write.** Contains the path of the Icinga 2 PID file. Defaults to `InitRunDir + "/icinga2.pid"`. PkgDataDir |**Read-only.** Contains the path of the package data directory. Defaults to `PrefixDir + "/share/icinga2"`. -Some constants have been used in the past, but are deprecated now. They are stil involved in building Icinga, -see `INSTALL.md`, but please avoid using them for runtime config! +The constants below have been used until Icinga v2.10, and are still intact. You don't need them +for future builds and configuration based on the newly available constants above. Variable |Description --------------------|------------------- -PrefixDir |**Read-only.** Contains the installation prefix that was specified with cmake -DCMAKE_INSTALL_PREFIX. `Defaults to "/usr/local"`. +PrefixDir |**Read-only.** Contains the installation prefix that was specified with `cmake -DCMAKE_INSTALL_PREFIX`. `Defaults to "/usr/local"`. SysconfDir |**Read-only.** Contains the path of the sysconf directory. Defaults to `PrefixDir + "/etc"`. LocalStateDir |**Read-only.** Contains the path of the local state directory. Defaults to `PrefixDir + "/var"`. RunDir |**Read-only.** Contains the path of the run directory. Defaults to `LocalStateDir + "/run"`. From e529d5e285ec5d8375c186baf5990a0a0f5472e3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 7 Aug 2018 17:28:05 +0200 Subject: [PATCH 0121/1162] Docs: Add a section to the 'upgrading' chapter --- doc/16-upgrading-icinga-2.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 870b09d69..b44fbf51f 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -7,6 +7,36 @@ Specific version upgrades are described below. Please note that version updates are incremental. An upgrade from v2.6 to v2.8 requires to follow the instructions for v2.7 too. +## Upgrading to v2.10 + +### Path Constant Changes + +During package upgrades you may see a notice that the configuration +content of features has changed. This is due to a more general approach +with path constants in v2.10. + +The known constants `SysconfDir` and `LocalStateDir` stay intact and won't +break on upgrade. +If you are using these constants in your own custom command definitions +or other objects, you are advised to revise them and update them according +to the [documentation](17-language-reference.md#icinga-constants). + +Example diff: + +``` +object NotificationCommand "mail-service-notification" { +- command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ] ++ command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] +``` + +If you have the `ICINGA2_RUN_DIR` environment variable configured in the +sysconfig file, you need to rename it to `ICINGA2_INIT_RUN_DIR`. `ICINGA2_STATE_DIR` +has been removed and this setting has no effect. + +> **Note** +> +> This is important if you rely on the sysconfig configuration in your own scripts. + ## Upgrading to v2.9 ### Deprecation and Removal Notes From 81faf9b7c395f5d9c2a36abbaf545f10700532ed Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 7 Aug 2018 17:58:22 +0200 Subject: [PATCH 0122/1162] Refine log messages and code comments --- icinga-app/icinga.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 2cde94859..ea08d0208 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -101,10 +101,12 @@ static void HandleLegacyDefines() #endif /* _WIN32 */ Value localStateDir = Application::GetConst("LocalStateDir"); + if (!localStateDir.IsEmpty()) { Log(LogWarning, "icinga-app") - << "Please do not set LocalStateDir anymore, set DataDir, LogDir, CacheDir and SpoolDir!" - << " Resetting those vars based on LocalStateDir!"; + << "Please do not set the deprecated 'LocalStateDir' constant," + << " use the 'DataDir', 'LogDir', 'CacheDir' and 'SpoolDir' constants instead!" + << " For compatibility reasons, these are now set based on the 'LocalStateDir' constant."; #ifdef _WIN32 ScriptGlobal::Set("DataDir", localStateDir + "\\lib\\icinga2"); @@ -126,7 +128,7 @@ static void HandleLegacyDefines() Value sysconfDir = Application::GetConst("SysconfDir"); if (!sysconfDir.IsEmpty()) { Log(LogWarning, "icinga-app") - << "Please do not set Sysconfdir anymore, set ConfigDir! Resetting the var based on SysconfDir!"; + << "Please do not set the deprecated 'Sysconfdir' constant, use the 'ConfigDir' constant instead! For compatibility reasons, their value is set based on the 'SysconfDir' constant."; #ifdef _WIN32 ScriptGlobal::Set("ConfigDir", sysconfDir + "\\icinga2"); @@ -142,7 +144,7 @@ static void HandleLegacyDefines() Value runDir = Application::GetConst("RunDir"); if (!runDir.IsEmpty()) { Log(LogWarning, "icinga-app") - << "Please do not set RunDir anymore, set InitRunDir! Resetting the var based on RunDir!"; + << "Please do not set the deprecated 'RunDir' constant, use the 'InitRunDir' constant instead! For compatiblity reasons, their value is set based on the 'RunDir' constant."; #ifdef _WIN32 ScriptGlobal::Set("InitRunDir", runDir + "\\icinga2"); @@ -190,9 +192,9 @@ static int Main() #ifdef _WIN32 bool builtinPaths = true; - // Programm install location, C:/Program Files/Icinga2 + /* Programm install location, C:/Program Files/Icinga2 */ String binaryPrefix = Utility::GetIcingaInstallPath(); - // Returns the datapath for daemons, %PROGRAMDATA%/icinga2 + /* Returns the datapath for daemons, %PROGRAMDATA%/icinga2 */ String dataPrefix = Utility::GetIcingaDataPath(); if (!binaryPrefix.IsEmpty() && !dataPrefix.IsEmpty()) { @@ -206,9 +208,7 @@ static int Main() Application::DeclareConst("CacheDir", dataPrefix + "\\var\\cache\\icinga2"); Application::DeclareConst("SpoolDir", dataPrefix + "\\var\\spool\\icinga2"); - // also see call to HandleLegacyDefines() later - - // internal constants + /* Internal constants. */ Application::DeclareConst("PkgDataDir", binaryPrefix + "\\share\\icinga2"); Application::DeclareConst("IncludeConfDir", binaryPrefix + "\\share\\icinga2\\include"); } else { @@ -224,9 +224,7 @@ static int Main() Application::DeclareConst("PrefixDir", ICINGA_PREFIX); - // also see call to HandleLegacyDefines() later - - // internal constants + /* Internal constants. */ Application::DeclareConst("PkgDataDir", ICINGA_PKGDATADIR); Application::DeclareConst("IncludeConfDir", ICINGA_INCLUDECONFDIR); @@ -361,8 +359,7 @@ static int Main() GetUserName(username, &usernameLen); std::ifstream userFile; - String configDir = Application::GetConst("ConfigDir"); - userFile.open(configDir + "/user"); + userFile.open(Application::GetConst("ConfigDir") + "/user"); if (userFile && command && !Application::IsProcessElevated()) { std::string userLine; @@ -446,6 +443,7 @@ static int Main() } } + /* Ensure that all defined constants work in the way we expect them. */ HandleLegacyDefines(); if (vm.count("script-debugger")) From 857c8122275e630b483b89114b45e6fbab3c7315 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 7 Aug 2018 18:09:52 +0200 Subject: [PATCH 0123/1162] Update INSTALL.md a bit and kick RHEL 5 away --- INSTALL.md | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index a2855227d..044ea507d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,7 +1,7 @@ # Installing Icinga 2 -The recommended way of installing Icinga 2 is to use packages. The Icinga -project provides both release and development packages for a number +The recommended way of installing Icinga 2 is to use [packages](https://packages.icinga.com). +The Icinga project provides both release and development packages for a number of operating systems. Please check the documentation in the [doc/](doc/) directory for a current list @@ -13,12 +13,13 @@ and will guide you step by step. There are a number of known caveats when installing from source such as incorrect directory and file permissions. So even if you're planning to not use the official packages it is advisable to build your own Debian -or RPM packages. +or RPM packages. You can use the source packages from [packages.icinga.com](https://packages.icinga.com) +for this purpose. -**Disclaimer** - -This information is intended for developers and packagers. It might be incomplete or unclear -in some cases. Make also sure to check our [packaging scripts on GitHub](https://github.com/Icinga/icinga-packaging)! +> **Disclaimer** +> +> This information is intended for developers and packagers. It might be incomplete or unclear +> in some cases. Ensure to check our [packaging scripts on GitHub](https://github.com/Icinga/icinga-packaging) too! # Build Requirements @@ -75,18 +76,16 @@ application using a dist tarball (including notes for distributions): **FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) -**RHEL5** ships an ancient flex version. Updated packages are available for -example from the repoforge buildtools repository. - -* x86: https://mirror.hs-esslingen.de/repoforge/redhat/el5/en/i386/buildtools/ -* x86\_64: https://mirror.hs-esslingen.de/repoforge/redhat/el5/en/x86\_64/buildtools/ +**RHEL6**: Requires a newer boost version which is available on packages.icinga.com +with a version suffixed name. ## Runtime user environment -By default Icinga will run as user 'icinga' and group 'icinga'. Additionally the +By default Icinga will run as user `icinga` and group `icinga`. Additionally the external command pipe and livestatus features require a dedicated command group -'icingacmd'. You can choose your own user/group names and pass them to CMake +`icingacmd`. You can choose your own user/group names and pass them to CMake using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. + ``` # groupadd icinga # groupadd icingacmd @@ -94,6 +93,7 @@ using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. ``` On Alpine (which uses ash busybox) you can run: + ``` # addgroup -S icinga # addgroup -S icingacmd @@ -114,14 +114,17 @@ is running as. Once you have installed all the necessary build requirements you can build Icinga 2 using the following commands: + ``` -$ mkdir build && cd build +$ mkdir release && cd release $ cmake .. -$ make -$ make install +$ cd .. +$ make -C release +$ make install -C release ``` You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`: + ``` $ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 ``` @@ -153,7 +156,7 @@ Also see `CMakeLists.txt` for details. - `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` **Build Optimization** -- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON` +- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware. - `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF` **Init System** @@ -245,6 +248,11 @@ Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec ``` +> **Note** +> +> The above command builds snapshot packages. Change to the `release` branch +> for release package builds. + Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary provided with `rpmdevtools`: ``` @@ -283,7 +291,7 @@ The following packages are required to build the SELinux policy module: * selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7) * selinux-policy-doc -#### RHEL/CentOS 5 and 6 +#### RHEL/CentOS 6 The RedHat Developer Toolset is required for building Icinga 2 beforehand. This contains a modern version of flex and a C++ compiler which supports @@ -323,7 +331,7 @@ added before building. > **WARNING:** This information is outdated! Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from -the Debian packaging Git repository (https://github.com/Icinga/pkg-icinga2-debian) +the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) into your source tree and run the following command: ``` $ dpkg-buildpackage -uc -us From a2a1f5c8d212b74d925f3b7f19d9bde52935bed8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 7 Aug 2018 18:33:59 +0200 Subject: [PATCH 0124/1162] Take a note why the explicit configDir variable is needed on Windows --- icinga-app/icinga.cpp | 5 ++++- lib/cli/daemoncommand.cpp | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index ea08d0208..3849ca658 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -359,7 +359,10 @@ static int Main() GetUserName(username, &usernameLen); std::ifstream userFile; - userFile.open(Application::GetConst("ConfigDir") + "/user"); + + /* The implicit string assignment is needed for Windows builds. */ + String configDir = Application::GetConst("ConfigDir"); + userFile.open(configDir + "/user"); if (userFile && command && !Application::IsProcessElevated()) { std::string userLine; diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index eda40a7fb..ba20eb823 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -205,6 +205,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector 0) configs = vm["config"].as >(); else if (!vm.count("no-config")) { + /* The implicit string assignment is needed for Windows builds. */ String configDir = Application::GetConst("ConfigDir"); configs.push_back(configDir + "/icinga2.conf"); } From 9be3ee1a1afd3237b466240119f338e2a6925253 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 7 Aug 2018 18:44:08 +0200 Subject: [PATCH 0125/1162] Update output for `--version` This moves the system and build information before the application paths which are normally not that important. --- lib/base/application.cpp | 38 +++++++++++++++------------------ lib/cli/troubleshootcommand.cpp | 4 ++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 0e6b018f2..bc8ec1bd4 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -538,27 +538,35 @@ String Application::GetExePath(const String& argv0) */ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion) { - os << "Application information:" << "\n"; - + /* icinga-app prints its own version information, stack traces need it here. */ if (!skipVersion) - os << " Application version: " << GetAppVersion() << "\n"; + os << " Application version: " << GetAppVersion() << "\n\n"; - os - << "\n" + os << "System information:\n" + << " Platform: " << Utility::GetPlatformName() << "\n" + << " Platform version: " << Utility::GetPlatformVersion() << "\n" + << " Kernel: " << Utility::GetPlatformKernel() << "\n" + << " Kernel version: " << Utility::GetPlatformKernelVersion() << "\n" + << " Architecture: " << Utility::GetPlatformArchitecture() << "\n"; + + os << "\nBuild information:\n" + << " Compiler: " << ScriptGlobal::Get("BuildCompilerName") << " " << ScriptGlobal::Get("BuildCompilerVersion") << "\n" + << " Build host: " << ScriptGlobal::Get("BuildHostName") << "\n"; + + os << "\nApplication information:\n" + << "\nGeneral paths:\n" << " Config directory: " << GetConst("ConfigDir") << "\n" << " Data directory: " << GetConst("DataDir") << "\n" << " Log directory: " << GetConst("LogDir") << "\n" << " Cache directory: " << GetConst("CacheDir") << "\n" << " Spool directory: " << GetConst("SpoolDir") << "\n" << " Run directory: " << GetConst("InitRunDir") << "\n" - << "\n" - << "Older paths (deprecated):" << "\n" + << "\nOld paths (deprecated):\n" << " Installation root: " << GetConst("PrefixDir") << "\n" << " Sysconf directory: " << GetConst("SysconfDir") << "\n" << " Run directory (base): " << GetConst("RunDir") << "\n" << " Local state directory: " << GetConst("LocalStateDir") << "\n" - << "\n" - << "Internally used paths:" << "\n" + << "\nInternal paths:\n" << " Package data directory: " << GetConst("PkgDataDir") << "\n" << " State path: " << GetConst("StatePath") << "\n" << " Modified attributes path: " << GetConst("ModAttrPath") << "\n" @@ -566,18 +574,6 @@ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion) << " Vars path: " << GetConst("VarsPath") << "\n" << " PID path: " << GetConst("PidPath") << "\n"; - os << "\n" - << "System information:" << "\n" - << " Platform: " << Utility::GetPlatformName() << "\n" - << " Platform version: " << Utility::GetPlatformVersion() << "\n" - << " Kernel: " << Utility::GetPlatformKernel() << "\n" - << " Kernel version: " << Utility::GetPlatformKernelVersion() << "\n" - << " Architecture: " << Utility::GetPlatformArchitecture() << "\n"; - - os << "\n" - << "Build information:" << "\n" - << " Compiler: " << ScriptGlobal::Get("BuildCompilerName") << " " << ScriptGlobal::Get("BuildCompilerVersion") << "\n" - << " Build host: " << ScriptGlobal::Get("BuildHostName") << "\n"; } /** diff --git a/lib/cli/troubleshootcommand.cpp b/lib/cli/troubleshootcommand.cpp index 6c72e1426..2770b5588 100644 --- a/lib/cli/troubleshootcommand.cpp +++ b/lib/cli/troubleshootcommand.cpp @@ -155,13 +155,13 @@ bool TroubleshootCommand::GeneralInfo(InfoLog& log, const boost::program_options << "\tCache directory: " << Application::GetConst("CacheDir") << "\n" << "\tRun directory: " << Application::GetConst("InitRunDir") << "\n" << "\t\n" - << "Older paths (deprecated):" << "\n" + << "Old paths (deprecated):\n" << "\tInstallation root: " << Application::GetConst("PrefixDir") << '\n' << "\tSysconf directory: " << Application::GetConst("SysconfDir") << '\n' << "\tRun directory: " << Application::GetConst("RunDir") << '\n' << "\tLocal state directory: " << Application::GetConst("LocalStateDir") << '\n' << "\t\n" - << "Internally used paths:" << "\n" + << "Internal paths:\n" << "\tPackage data directory: " << Application::GetConst("PkgDataDir") << '\n' << "\tState path: " << Application::GetConst("StatePath") << '\n' << "\tObjects path: " << Application::GetConst("ObjectsPath") << '\n' From 7a31cd4fe7ac03e115ec7e85a265436547a78736 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 8 Aug 2018 12:11:37 +0200 Subject: [PATCH 0126/1162] IDO/MySQL: avoid empty queries --- lib/db_ido_mysql/idomysqlconnection.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 9c8fd7b41..051206231 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -519,11 +519,12 @@ void IdoMysqlConnection::FinishAsyncQueries() size_t size_query = aq.Query.GetLength() + 1; - if (num_bytes + size_query > m_MaxPacketSize - 512) - break; + if (count > 0) { + if (num_bytes + size_query > m_MaxPacketSize - 512) + break; - if (count > 0) querybuf << ";"; + } IncreaseQueryCount(); count++; From 7bcbd9b49763e02454750b3332e99d9388b64858 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 8 Aug 2018 13:59:43 +0200 Subject: [PATCH 0127/1162] Rename Zone#GetAllParents() to Zone#GetAllParentsRaw() --- lib/remote/apilistener.cpp | 2 +- lib/remote/zone.cpp | 2 +- lib/remote/zone.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c1546710d..c1eeb3e23 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -997,7 +997,7 @@ void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin, bool need_log = !RelayMessageOne(target_zone, origin, message, master); - for (const Zone::Ptr& zone : target_zone->GetAllParents()) { + for (const Zone::Ptr& zone : target_zone->GetAllParentsRaw()) { if (!RelayMessageOne(zone, origin, message, master)) need_log = true; } diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index eddc3aa67..da4a5dad3 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -89,7 +89,7 @@ std::set Zone::GetEndpoints() const return result; } -std::vector Zone::GetAllParents() const +std::vector Zone::GetAllParentsRaw() const { return m_AllParents; } diff --git a/lib/remote/zone.hpp b/lib/remote/zone.hpp index 6193dc026..23b04e6dd 100644 --- a/lib/remote/zone.hpp +++ b/lib/remote/zone.hpp @@ -40,7 +40,7 @@ public: Zone::Ptr GetParent() const; std::set GetEndpoints() const; - std::vector GetAllParents() const; + std::vector GetAllParentsRaw() const; bool CanAccessObject(const ConfigObject::Ptr& object); bool IsChildOf(const Zone::Ptr& zone); From ea5614f7dfdc8f69edd96e5bf652462af58148a8 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 8 Aug 2018 14:15:01 +0200 Subject: [PATCH 0128/1162] Expose Zone#all_parents via API --- lib/remote/zone.cpp | 11 +++++++++++ lib/remote/zone.hpp | 1 + lib/remote/zone.ti | 3 +++ 3 files changed, 15 insertions(+) diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index da4a5dad3..e2b6d3a9b 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -20,6 +20,7 @@ #include "remote/zone.hpp" #include "remote/zone-ti.cpp" #include "remote/jsonrpcconnection.hpp" +#include "base/array.hpp" #include "base/objectlock.hpp" #include "base/logger.hpp" @@ -94,6 +95,16 @@ std::vector Zone::GetAllParentsRaw() const return m_AllParents; } +Array::Ptr Zone::GetAllParents() const +{ + auto result (new Array); + + for (auto& parent : m_AllParents) + result->Add(parent->GetName()); + + return result; +} + bool Zone::CanAccessObject(const ConfigObject::Ptr& object) { Zone::Ptr object_zone; diff --git a/lib/remote/zone.hpp b/lib/remote/zone.hpp index 23b04e6dd..8573131c5 100644 --- a/lib/remote/zone.hpp +++ b/lib/remote/zone.hpp @@ -41,6 +41,7 @@ public: Zone::Ptr GetParent() const; std::set GetEndpoints() const; std::vector GetAllParentsRaw() const; + Array::Ptr GetAllParents() const override; bool CanAccessObject(const ConfigObject::Ptr& object); bool IsChildOf(const Zone::Ptr& zone); diff --git a/lib/remote/zone.ti b/lib/remote/zone.ti index ad7bb8d50..638858036 100644 --- a/lib/remote/zone.ti +++ b/lib/remote/zone.ti @@ -34,6 +34,9 @@ class Zone : ConfigObject [config] array(name(Endpoint)) endpoints (EndpointsRaw); [config] bool global; + [no_user_modify, no_storage] array(Value) all_parents { + get; + }; }; } From 20269a89d01a434192e0eee287b158d56d5e965a Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 2 Aug 2018 08:38:42 +0200 Subject: [PATCH 0129/1162] ApiListener: Add support for dynamic port handling --- lib/base/socket.cpp | 65 +++++++++++++++++++++++++++----------- lib/base/socket.hpp | 5 ++- lib/remote/apilistener.cpp | 19 +++++++++-- lib/remote/apilistener.hpp | 2 ++ lib/remote/apilistener.ti | 6 ++-- 5 files changed, 73 insertions(+), 24 deletions(-) diff --git a/lib/base/socket.cpp b/lib/base/socket.cpp index 97946f5ee..17d35778b 100644 --- a/lib/base/socket.cpp +++ b/lib/base/socket.cpp @@ -114,9 +114,21 @@ int Socket::GetError() const /** * Formats a sockaddr in a human-readable way. * - * @returns A String describing the sockaddr. + * @returns A pair of host and service. */ -String Socket::GetAddressFromSockaddr(sockaddr *address, socklen_t len) +String Socket::GetHumanReadableAddress(const std::pair& socketDetails) +{ + std::ostringstream s; + s << "[" << socketDetails.first << "]:" << socketDetails.second; + return s.str(); +} + +/** + * Returns host and service as pair. + * + * @returns A pair with host and service. + */ +std::pair Socket::GetDetailsFromSockaddr(sockaddr *address, socklen_t len) { char host[NI_MAXHOST]; char service[NI_MAXSERV]; @@ -140,17 +152,15 @@ String Socket::GetAddressFromSockaddr(sockaddr *address, socklen_t len) #endif /* _WIN32 */ } - std::ostringstream s; - s << "[" << host << "]:" << service; - return s.str(); + return std::make_pair(host, service); } /** - * Returns a String describing the local address of the socket. + * Returns a pair describing the local host and service of the socket. * - * @returns A String describing the local address. + * @returns A pair describing the local host and service. */ -String Socket::GetClientAddress() +std::pair Socket::GetClientAddressDetails() { boost::mutex::scoped_lock lock(m_SocketMutex); @@ -175,22 +185,32 @@ String Socket::GetClientAddress() #endif /* _WIN32 */ } - String address; + std::pair details; try { - address = GetAddressFromSockaddr((sockaddr *)&sin, len); + details = GetDetailsFromSockaddr((sockaddr *)&sin, len); } catch (const std::exception&) { /* already logged */ } - return address; + return details; } /** - * Returns a String describing the peer address of the socket. + * Returns a String describing the local address of the socket. * - * @returns A String describing the peer address. + * @returns A String describing the local address. */ -String Socket::GetPeerAddress() +String Socket::GetClientAddress() +{ + return GetHumanReadableAddress(GetClientAddressDetails()); +} + +/** + * Returns a pair describing the peer host and service of the socket. + * + * @returns A pair describing the peer host and service. + */ +std::pair Socket::GetPeerAddressDetails() { boost::mutex::scoped_lock lock(m_SocketMutex); @@ -215,14 +235,24 @@ String Socket::GetPeerAddress() #endif /* _WIN32 */ } - String address; + std::pair details; try { - address = GetAddressFromSockaddr((sockaddr *)&sin, len); + details = GetDetailsFromSockaddr((sockaddr *)&sin, len); } catch (const std::exception&) { /* already logged */ } - return address; + return details; +} + +/** + * Returns a String describing the peer address of the socket. + * + * @returns A String describing the peer address. + */ +String Socket::GetPeerAddress() +{ + return GetHumanReadableAddress(GetPeerAddressDetails()); } /** @@ -415,4 +445,3 @@ void Socket::SocketPair(SOCKET s[2]) << boost::errinfo_api_function("socketpair") << boost::errinfo_errno(errno)); } - diff --git a/lib/base/socket.hpp b/lib/base/socket.hpp index 89147c57d..7de915bbe 100644 --- a/lib/base/socket.hpp +++ b/lib/base/socket.hpp @@ -45,7 +45,9 @@ public: void Close(); + std::pair GetClientAddressDetails(); String GetClientAddress(); + std::pair GetPeerAddressDetails(); String GetPeerAddress(); size_t Read(void *buffer, size_t size); @@ -70,7 +72,8 @@ protected: private: SOCKET m_FD{INVALID_SOCKET}; /**< The socket descriptor. */ - static String GetAddressFromSockaddr(sockaddr *address, socklen_t len); + static std::pair GetDetailsFromSockaddr(sockaddr *address, socklen_t len); + static String GetHumanReadableAddress(const std::pair& socketDetails); }; class socket_error : virtual public std::exception, virtual public boost::exception { }; diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c7ba834b4..84931086f 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -318,9 +318,6 @@ bool ApiListener::AddListener(const String& node, const String& service) return false; } - Log(LogInformation, "ApiListener") - << "Adding new listener on port '" << service << "'"; - TcpSocket::Ptr server = new TcpSocket(); try { @@ -331,11 +328,16 @@ bool ApiListener::AddListener(const String& node, const String& service) return false; } + Log(LogInformation, "ApiListener") + << "Started new listener on '" << server->GetClientAddress() << "'"; + std::thread thread(std::bind(&ApiListener::ListenerThreadProc, this, server)); thread.detach(); m_Servers.insert(server); + UpdateStatusFile(server); + return true; } @@ -1469,3 +1471,14 @@ String ApiListener::GetFromZoneName(const Zone::Ptr& fromZone) return fromZoneName; } + +void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket) +{ + String path = Application::GetConst("CacheDir") + "/api-state.json"; + std::pair details = socket->GetClientAddressDetails(); + + Utility::SaveJsonFile(path, 0644, new Dictionary({ + {"host", details.first}, + {"port", details.second} + })); +} diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index b3894992a..8b46c4cb3 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -114,6 +114,8 @@ protected: void Start(bool runtimeCreated) override; void Stop(bool runtimeDeleted) override; + void UpdateStatusFile(TcpSocket::Ptr socket); + void ValidateTlsProtocolmin(const Lazy& lvalue, const ValidationUtils& utils) override; private: diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index e04fa0185..04e483270 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -41,9 +41,11 @@ class ApiListener : ConfigObject default {{{ return "TLSv1"; }}} }; - [config] String bind_host; + [config] String bind_host { + default {{{ return Application::GetConst("ApiBindHost"); }}} + }; [config] String bind_port { - default {{{ return "5665"; }}} + default {{{ return Application::GetConst("ApiBindPort", "5665"); }}} }; [config] bool accept_config; From 7b977b2c5280afb889ff4fb946683c1e762f7107 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Thu, 9 Aug 2018 08:29:27 +0200 Subject: [PATCH 0130/1162] Do not send 'finished reconnecting...' if failed --- lib/remote/apilistener.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c7ba834b4..04ffe1449 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -393,6 +393,8 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint) client->Connect(host, port); NewClientHandler(client, serverName, RoleClient); endpoint->SetConnecting(false); + Log(LogInformation, "ApiListener") + << "Finished reconnecting to endpoint '" << endpoint->GetName() << "' via host '" << host << "' and port '" << port << "'"; } catch (const std::exception& ex) { endpoint->SetConnecting(false); client->Close(); @@ -403,9 +405,6 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint) Log(LogDebug, "ApiListener") << info.str() << "\n" << DiagnosticInformation(ex); } - - Log(LogInformation, "ApiListener") - << "Finished reconnecting to endpoint '" << endpoint->GetName() << "' via host '" << host << "' and port '" << port << "'"; } void ApiListener::NewClientHandler(const Socket::Ptr& client, const String& hostname, ConnectionRole role) From ecb73e08ed2236f24cd0bd025769dccefdc9443e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 9 Aug 2018 11:54:34 +0200 Subject: [PATCH 0131/1162] Implement ApiListener status file removal on shutdown --- lib/remote/apilistener.cpp | 22 ++++++++++++++++++++-- lib/remote/apilistener.hpp | 5 +++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 84931086f..bcfa29680 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -264,8 +264,12 @@ void ApiListener::Stop(bool runtimeDeleted) Log(LogInformation, "ApiListener") << "'" << GetName() << "' stopped."; - boost::mutex::scoped_lock lock(m_LogLock); - CloseLogFile(); + { + boost::mutex::scoped_lock lock(m_LogLock); + CloseLogFile(); + } + + RemoveStatusFile(); } ApiListener::Ptr ApiListener::GetInstance() @@ -1482,3 +1486,17 @@ void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket) {"port", details.second} })); } + +void ApiListener::RemoveStatusFile() +{ + String path = Application::GetConst("CacheDir") + "/api-state.json"; + + if (Utility::PathExists(path)) { + if (unlink(path.CStr()) < 0 && errno != ENOENT) { + BOOST_THROW_EXCEPTION(posix_error() + << boost::errinfo_api_function("unlink") + << boost::errinfo_errno(errno) + << boost::errinfo_file_name(path)); + } + } +} diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 8b46c4cb3..27d236eaa 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -114,8 +114,6 @@ protected: void Start(bool runtimeCreated) override; void Stop(bool runtimeDeleted) override; - void UpdateStatusFile(TcpSocket::Ptr socket); - void ValidateTlsProtocolmin(const Lazy& lvalue, const ValidationUtils& utils) override; private: @@ -165,6 +163,9 @@ private: static void CopyCertificateFile(const String& oldCertPath, const String& newCertPath); + void UpdateStatusFile(TcpSocket::Ptr socket); + void RemoveStatusFile(); + /* filesync */ static ConfigDirInformation LoadConfigDir(const String& dir); static Dictionary::Ptr MergeConfigUpdate(const ConfigDirInformation& config); From 7012ce4129fe696dbf4f6980840c52ed4cc44217 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 9 Aug 2018 11:55:05 +0200 Subject: [PATCH 0132/1162] Update documentation for new constants --- doc/16-upgrading-icinga-2.md | 6 ++++++ doc/17-language-reference.md | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index b44fbf51f..cce8cd916 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -37,6 +37,12 @@ has been removed and this setting has no effect. > > This is important if you rely on the sysconfig configuration in your own scripts. +### New Constants + +New [Icinga constants](17-language-reference.md#icinga-constants) have been added in this release. + +* `ApiBindHost` and `ApiBindPort` to allow overriding the default ApiListener values. This will be used for an Icinga addon only. + ## Upgrading to v2.9 ### Deprecation and Removal Notes diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 1f50f610c..de94ba4e8 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -409,8 +409,10 @@ Vars |**Read-write.** Contains a dictionary with global custom at NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. -MaxConcurrentChecks |**Read-write**. The number of max checks run simultaneously. Defaults to `512`. -Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. +MaxConcurrentChecks |**Read-write.** The number of max checks run simultaneously. Defaults to `512`. +Environment |**Read-write.** The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. +ApiBindHost |**Read-write.** Overrides the default value for the ApiListener `bind_host` attribute. Not set by default. +ApiBindPort |**Read-write.** Overrides the default value for the ApiListener `bind_port` attribute. Not set by default. Application runtime details: From eb02d9041d32abb76626b85c6893cb76dc40bcfe Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 2 Aug 2018 14:09:21 +0200 Subject: [PATCH 0133/1162] Refactor environment for API connections * Const renamed to `ApiEnvironment` * Handling moved to ApiListener * Now a property of ApiListener --- doc/06-distributed-monitoring.md | 39 ++++++++++++++++++++++++++++++-- doc/09-object-types.md | 1 + doc/17-language-reference.md | 3 +-- icinga-app/icinga.cpp | 2 -- lib/icinga/icingaapplication.cpp | 3 +-- lib/remote/apilistener.cpp | 16 ++++++------- lib/remote/apilistener.ti | 4 ++++ 7 files changed, 52 insertions(+), 16 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 985e23fd9..15353de90 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -116,8 +116,7 @@ you still need a [Host](09-object-types.md#objecttype-host) object. In case you are using the CLI commands later, you don't have to write this configuration from scratch in a text editor. -The [ApiListener](09-object-types.md#objecttype-apilistener) -object is used to load the SSL certificates and specify restrictions, e.g. +The [ApiListener] object is used to load the SSL certificates and specify restrictions, e.g. for accepting configuration commands. It is also used for the [Icinga 2 REST API](12-icinga2-api.md#icinga2-api) which shares @@ -2793,3 +2792,39 @@ Add the global zone `global-templates` in case it did not exist. global = true } EOF + +## Using Multiple Environments + +In some cases it might be useful to run multiple Icinga instance on the same host. Two potential scenarios include: + +* running different versions of the same monitoring configuration (e.g. production and testing) +* running disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) + +Configuration is controlled via constants and attributes of the [ApiListener]. + +Constant | Attribute +---------------|---------- +ApiEnvironment | environment +ApiBindHost | bind_host +ApiBindPort | bind_port + +In any case the constant is default value for the attribute, so that a direct configuration in the [ApiListener] object +has more precedence. The constants have been created to allow the values to be set from the command line on startup. + +When Icinga establishes a TLS connection to another cluster instance it automatically uses the [SNI extension] +to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple +Icinga instances behind a load balancer. + +SNI example: `icinga2-client1.localdomain` + +However, if the environment is configured, Icinga will append the environment name to the SNI hostname like this: + +SNI example with environment: `icinga2-client1.localdomain:production` + +Middleware like loadbalancers or TLS proxies can read the SNI header and route the connection to the appropriate target. +I.e., it uses a single externally-visible TCP port (usually 5665) and forwards connections to one or more Icinga +instances which are bound to a local TCP port. It does so by inspecting the environment name that is sent as part of the +SNI extension. + +[ApiListener]: 09-object-types.md#objecttype-apilistener +[SNI Extension]: https://en.wikipedia.org/wiki/Server_Name_Indication diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 904e31b23..06584ef1d 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -67,6 +67,7 @@ Configuration Attributes: access\_control\_allow\_credentials | Boolean | **Deprecated.** Indicates whether or not the actual request can be made using credentials. Defaults to `true`. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Credentials) access\_control\_allow\_headers | String | **Deprecated.** Used in response to a preflight request to indicate which HTTP headers can be used when making the actual request. Defaults to `Authorization`. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Headers) access\_control\_allow\_methods | String | **Deprecated.** Used in response to a preflight request to indicate which HTTP methods can be used when making the actual request. Defaults to `GET, POST, PUT, DELETE`. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Methods) + environment | String | **Optional.** Used as suffix in TLS SNI extension name; default from constant `ApiEnvironment`, which is empty. The attributes `access_control_allow_credentials`, `access_control_allow_headers` and `access_control_allow_methods` are controlled by Icinga 2 and are not changeable by config any more. diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index de94ba4e8..9dbb0de03 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -410,7 +410,7 @@ NodeName |**Read-write.** Contains the cluster node name. Set to the RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. MaxConcurrentChecks |**Read-write.** The number of max checks run simultaneously. Defaults to `512`. -Environment |**Read-write.** The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. +ApiEnvironment |**Read-write**. The name of the Icinga environment for ApiListener. Included in the SNI host name when making outbound connections. Defaults to `production`. ApiBindHost |**Read-write.** Overrides the default value for the ApiListener `bind_host` attribute. Not set by default. ApiBindPort |**Read-write.** Overrides the default value for the ApiListener `bind_port` attribute. Not set by default. @@ -454,7 +454,6 @@ SysconfDir |**Read-only.** Contains the path of the sysconf directory. LocalStateDir |**Read-only.** Contains the path of the local state directory. Defaults to `PrefixDir + "/var"`. RunDir |**Read-only.** Contains the path of the run directory. Defaults to `LocalStateDir + "/run"`. - Advanced runtime constants. Please only use them if advised by support or developers. Variable | Description diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 3849ca658..26ed4cf69 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -297,8 +297,6 @@ static int Main() Application::DeclareConst("Concurrency", std::thread::hardware_concurrency()); Application::DeclareConst("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks()); - ScriptGlobal::Set("Environment", "production"); - ScriptGlobal::Set("AttachDebugger", false); ScriptGlobal::Set("PlatformKernel", Utility::GetPlatformKernel()); diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 6ac00aa60..b792cdfe7 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -81,8 +81,7 @@ void IcingaApplication::StatsFunc(const Dictionary::Ptr& status, const Array::Pt { "enable_perfdata", icingaapplication->GetEnablePerfdata() }, { "pid", Utility::GetPid() }, { "program_start", Application::GetStartTime() }, - { "version", Application::GetAppVersion() }, - { "environment", ScriptGlobal::Get("Environment", &Empty) } + { "version", Application::GetAppVersion() } })); } diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 428fb2df7..5e0d2a1bf 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -388,16 +388,10 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint) TcpSocket::Ptr client = new TcpSocket(); - String serverName = endpoint->GetName(); - - String env = ScriptGlobal::Get("Environment", &Empty); - if (env != "" && env != "production") - serverName += ":" + env; - try { endpoint->SetConnecting(true); client->Connect(host, port); - NewClientHandler(client, serverName, RoleClient); + NewClientHandler(client, endpoint->GetName(), RoleClient); endpoint->SetConnecting(false); } catch (const std::exception& ex) { endpoint->SetConnecting(false); @@ -447,10 +441,16 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri TlsStream::Ptr tlsStream; + String environmentName = GetEnvironment(); + String serverName = hostname; + + if (!environmentName.IsEmpty() && environmentName != "") + serverName += ":" + environmentName; + { ObjectLock olock(this); try { - tlsStream = new TlsStream(client, hostname, role, m_SSLContext); + tlsStream = new TlsStream(client, serverName, role, m_SSLContext); } catch (const std::exception&) { Log(LogCritical, "ApiListener") << "Cannot create TLS stream from client connection (" << conninfo << ")"; diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index 04e483270..239ae9ce3 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -48,6 +48,10 @@ class ApiListener : ConfigObject default {{{ return Application::GetConst("ApiBindPort", "5665"); }}} }; + [config] String environment { + default {{{ return Application::GetConst("ApiEnvironment"); }}} + }; + [config] bool accept_config; [config] bool accept_commands; From cd94b7731e110fbbadd5b861063866ea495c4063 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 9 Aug 2018 12:22:55 +0200 Subject: [PATCH 0134/1162] Update doc anchors --- doc/06-distributed-monitoring.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 15353de90..04d091716 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -116,7 +116,8 @@ you still need a [Host](09-object-types.md#objecttype-host) object. In case you are using the CLI commands later, you don't have to write this configuration from scratch in a text editor. -The [ApiListener] object is used to load the SSL certificates and specify restrictions, e.g. +The [ApiListener](09-object-types.md#objecttype-apilistener) object is +used to load the TLS certificates and specify restrictions, e.g. for accepting configuration commands. It is also used for the [Icinga 2 REST API](12-icinga2-api.md#icinga2-api) which shares @@ -2795,12 +2796,14 @@ Add the global zone `global-templates` in case it did not exist. ## Using Multiple Environments -In some cases it might be useful to run multiple Icinga instance on the same host. Two potential scenarios include: +In some cases it can be desired to run multiple Icinga instances on the same host. +Two potential scenarios include: -* running different versions of the same monitoring configuration (e.g. production and testing) -* running disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) +* Different versions of the same monitoring configuration (e.g. production and testing) +* Disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) -Configuration is controlled via constants and attributes of the [ApiListener]. +The configuration is done with global constants and attributes of the +[ApiListener](09-object-types.md#objecttype-apilistener) object. Constant | Attribute ---------------|---------- @@ -2808,10 +2811,10 @@ ApiEnvironment | environment ApiBindHost | bind_host ApiBindPort | bind_port -In any case the constant is default value for the attribute, so that a direct configuration in the [ApiListener] object -has more precedence. The constants have been created to allow the values to be set from the command line on startup. +In any case the constant is default value for the attribute and the direct configuration in the ApiListener object +has more precedence. The constants have been added to allow the values being set from the CLI on startup. -When Icinga establishes a TLS connection to another cluster instance it automatically uses the [SNI extension] +When Icinga establishes a TLS connection to another cluster instance it automatically uses the [SNI extension](https://en.wikipedia.org/wiki/Server_Name_Indication) to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple Icinga instances behind a load balancer. @@ -2825,6 +2828,3 @@ Middleware like loadbalancers or TLS proxies can read the SNI header and route t I.e., it uses a single externally-visible TCP port (usually 5665) and forwards connections to one or more Icinga instances which are bound to a local TCP port. It does so by inspecting the environment name that is sent as part of the SNI extension. - -[ApiListener]: 09-object-types.md#objecttype-apilistener -[SNI Extension]: https://en.wikipedia.org/wiki/Server_Name_Indication From b350512b118882a499bfa839868eaebf594aa233 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 9 Aug 2018 12:41:22 +0200 Subject: [PATCH 0135/1162] Rename to Environment constant --- doc/17-language-reference.md | 2 +- lib/remote/apilistener.ti | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 9dbb0de03..12a8dd908 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -407,10 +407,10 @@ Constant | Description --------------------|------------------- Vars |**Read-write.** Contains a dictionary with global custom attributes. Not set by default. NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. +Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. MaxConcurrentChecks |**Read-write.** The number of max checks run simultaneously. Defaults to `512`. -ApiEnvironment |**Read-write**. The name of the Icinga environment for ApiListener. Included in the SNI host name when making outbound connections. Defaults to `production`. ApiBindHost |**Read-write.** Overrides the default value for the ApiListener `bind_host` attribute. Not set by default. ApiBindPort |**Read-write.** Overrides the default value for the ApiListener `bind_port` attribute. Not set by default. diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index 239ae9ce3..05a330990 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -49,7 +49,7 @@ class ApiListener : ConfigObject }; [config] String environment { - default {{{ return Application::GetConst("ApiEnvironment"); }}} + default {{{ return Application::GetConst("Environment"); }}} }; [config] bool accept_config; From a4c689e5cfad359ff37bdd1a052b60947efee169 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 9 Aug 2018 16:23:24 +0200 Subject: [PATCH 0136/1162] Build fix for CentOS 7 and non-unity builds --- lib/remote/pkiutility.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/remote/pkiutility.hpp b/lib/remote/pkiutility.hpp index 500b7be69..f73448b8f 100644 --- a/lib/remote/pkiutility.hpp +++ b/lib/remote/pkiutility.hpp @@ -24,6 +24,7 @@ #include "base/dictionary.hpp" #include "base/string.hpp" #include +#include namespace icinga { From caefa58cf6e8da09ac9a2695db9e80d12ddd37b3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 10 Aug 2018 10:39:17 +0200 Subject: [PATCH 0137/1162] Mkclass: Only render setter if not declared pure virtual --- tools/mkclass/classcompiler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/mkclass/classcompiler.cpp b/tools/mkclass/classcompiler.cpp index 374c54d1c..0e1ee8954 100644 --- a/tools/mkclass/classcompiler.cpp +++ b/tools/mkclass/classcompiler.cpp @@ -568,7 +568,8 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&) << "{" << std::endl; for (const Field& field : klass.Fields) { - m_Impl << "\t" << "Set" << field.GetFriendlyName() << "(" << "GetDefault" << field.GetFriendlyName() << "(), true);" << std::endl; + if (!field.PureSetAccessor) + m_Impl << "\t" << "Set" << field.GetFriendlyName() << "(" << "GetDefault" << field.GetFriendlyName() << "(), true);" << std::endl; } m_Impl << "}" << std::endl << std::endl; From 97513965e6b025aac527ba8be3be5daaff66c9be Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 10 Aug 2018 10:15:41 +0200 Subject: [PATCH 0138/1162] Introduce IcingaApplication#environment Precedence as follows: - DEnvironment=... - const Environment = ... - object IcingaApplication "app" { environment = "..." } The wrapped script constant handling is required since we cannot directly link from libremote (SNI handling) to libicinga where the object resides. Instead we'll use the Application class helpers for hiding the ScriptGlobal calls. --- lib/base/CMakeLists.txt | 2 +- lib/base/application-environment.cpp | 34 ++++++++++++++++++++++++++++ lib/base/application.hpp | 3 +++ lib/icinga/icingaapplication.cpp | 10 ++++++++ lib/icinga/icingaapplication.hpp | 3 +++ lib/icinga/icingaapplication.ti | 6 +++++ lib/remote/apilistener.cpp | 5 ++-- lib/remote/apilistener.ti | 4 ---- 8 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 lib/base/application-environment.cpp diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index c16cda028..e784a3957 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -27,7 +27,7 @@ mkclass_target(sysloglogger.ti sysloglogger-ti.cpp sysloglogger-ti.hpp) set(base_SOURCES i2-base.hpp - application.cpp application.hpp application-ti.hpp application-version.cpp + application.cpp application.hpp application-ti.hpp application-version.cpp application-environment.cpp array.cpp array.hpp array-script.cpp base64.cpp base64.hpp boolean.cpp boolean.hpp boolean-script.cpp diff --git a/lib/base/application-environment.cpp b/lib/base/application-environment.cpp new file mode 100644 index 000000000..a70ea886f --- /dev/null +++ b/lib/base/application-environment.cpp @@ -0,0 +1,34 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/application.hpp" +#include "base/scriptglobal.hpp" + +using namespace icinga; + +String Application::GetAppEnvironment() +{ + Value defaultValue = Empty; + return ScriptGlobal::Get("Environment", &defaultValue); +} + +void Application::SetAppEnvironment(const String& name) +{ + ScriptGlobal::Set("Environment", name); +} diff --git a/lib/base/application.hpp b/lib/base/application.hpp index dbb14c38d..88fc51ab6 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -107,6 +107,9 @@ public: static String GetAppVersion(); static String GetAppSpecVersion(); + static String GetAppEnvironment(); + static void SetAppEnvironment(const String& name); + static double GetStartTime(); static void SetStartTime(double ts); diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index b792cdfe7..20a800514 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -293,6 +293,16 @@ String IcingaApplication::GetNodeName() const return ScriptGlobal::Get("NodeName"); } +String IcingaApplication::GetEnvironment() const +{ + return Application::GetAppEnvironment(); +} + +void IcingaApplication::SetEnvironment(const String& value, bool suppress_events, const Value& cookie) +{ + Application::SetAppEnvironment(value); +} + void IcingaApplication::ValidateVars(const Lazy& lvalue, const ValidationUtils& utils) { MacroProcessor::ValidateCustomVars(this, lvalue()); diff --git a/lib/icinga/icingaapplication.hpp b/lib/icinga/icingaapplication.hpp index eac7f5903..ba8b77cf3 100644 --- a/lib/icinga/icingaapplication.hpp +++ b/lib/icinga/icingaapplication.hpp @@ -50,6 +50,9 @@ public: String GetNodeName() const; + String GetEnvironment() const override; + void SetEnvironment(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + void ValidateVars(const Lazy& lvalue, const ValidationUtils& utils) override; private: diff --git a/lib/icinga/icingaapplication.ti b/lib/icinga/icingaapplication.ti index 61d4ecd4c..b9f0381b3 100644 --- a/lib/icinga/icingaapplication.ti +++ b/lib/icinga/icingaapplication.ti @@ -26,6 +26,12 @@ namespace icinga class IcingaApplication : Application { + [config, no_storage, virtual] String environment { + get; + set; + default {{{ return Application::GetAppEnvironment(); }}} + }; + [config] bool enable_notifications { default {{{ return true; }}} }; diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 5e0d2a1bf..8c0abf570 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -441,10 +441,11 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri TlsStream::Ptr tlsStream; - String environmentName = GetEnvironment(); + String environmentName = Application::GetAppEnvironment(); + String serverName = hostname; - if (!environmentName.IsEmpty() && environmentName != "") + if (!environmentName.IsEmpty()) serverName += ":" + environmentName; { diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index 05a330990..04e483270 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -48,10 +48,6 @@ class ApiListener : ConfigObject default {{{ return Application::GetConst("ApiBindPort", "5665"); }}} }; - [config] String environment { - default {{{ return Application::GetConst("Environment"); }}} - }; - [config] bool accept_config; [config] bool accept_commands; From 02009525a18d4b2a03c9906d5c57a88d390c0ef5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 10 Aug 2018 12:53:06 +0200 Subject: [PATCH 0139/1162] Update documentation and add upgrading notes --- doc/06-distributed-monitoring.md | 16 +++++++--------- doc/09-object-types.md | 1 + doc/16-upgrading-icinga-2.md | 1 + doc/17-language-reference.md | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 04d091716..8795335ed 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -2802,17 +2802,15 @@ Two potential scenarios include: * Different versions of the same monitoring configuration (e.g. production and testing) * Disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications) -The configuration is done with global constants and attributes of the +The configuration is done with the global constants `ApiBindHost` and `ApiBindPort` +or the `bind_host` and `bind_port` attributes of the [ApiListener](09-object-types.md#objecttype-apilistener) object. -Constant | Attribute ----------------|---------- -ApiEnvironment | environment -ApiBindHost | bind_host -ApiBindPort | bind_port +The environment must be set with the global constant `Environment` or as object attribute +of the [IcingaApplication](#objecttype-icingaapplication) object. -In any case the constant is default value for the attribute and the direct configuration in the ApiListener object -has more precedence. The constants have been added to allow the values being set from the CLI on startup. +In any case the constant is default value for the attribute and the direct configuration in the objects +have more precedence. The constants have been added to allow the values being set from the CLI on startup. When Icinga establishes a TLS connection to another cluster instance it automatically uses the [SNI extension](https://en.wikipedia.org/wiki/Server_Name_Indication) to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple @@ -2820,7 +2818,7 @@ Icinga instances behind a load balancer. SNI example: `icinga2-client1.localdomain` -However, if the environment is configured, Icinga will append the environment name to the SNI hostname like this: +However, if the environment is configured to `production`, Icinga appends the environment name to the SNI hostname like this: SNI example with environment: `icinga2-client1.localdomain:production` diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 06584ef1d..d04f78156 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -817,6 +817,7 @@ Configuration Attributes: enable\_service\_checks | Boolean | **Optional.** Whether active service checks are globally enabled. Defaults to true. enable\_perfdata | Boolean | **Optional.** Whether performance data processing is globally enabled. Defaults to true. vars | Dictionary | **Optional.** A dictionary containing custom attributes that are available globally. + environment | String | **Optional.** Specify the Icinga environment. This overrides the `Environment` constant specified in the configuration or on the CLI with `--define`. Defaults to empty. ## IdoMySqlConnection diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index cce8cd916..4e4db7c7f 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -41,6 +41,7 @@ has been removed and this setting has no effect. New [Icinga constants](17-language-reference.md#icinga-constants) have been added in this release. +* `Environment` for specifying the Icinga environment. Defaults to not set. * `ApiBindHost` and `ApiBindPort` to allow overriding the default ApiListener values. This will be used for an Icinga addon only. ## Upgrading to v2.9 diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 12a8dd908..f7fae4695 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -407,7 +407,7 @@ Constant | Description --------------------|------------------- Vars |**Read-write.** Contains a dictionary with global custom attributes. Not set by default. NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. -Environment |**Read-write**. The name of the Icinga environment. Included in the SNI host name when making outbound connections. Defaults to `production`. +Environment |**Read-write.** The name of the Icinga environment. Included in the SNI host name for outbound connections. Not set by default. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. MaxConcurrentChecks |**Read-write.** The number of max checks run simultaneously. Defaults to `512`. From 2ee6dfaf93205aa94b2cd38ae21f444f4b28d304 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 10 Aug 2018 13:01:53 +0200 Subject: [PATCH 0140/1162] Re-add environment to IcingaApplication feature stats --- lib/icinga/icingaapplication.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 20a800514..4db75d852 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -79,6 +79,7 @@ void IcingaApplication::StatsFunc(const Dictionary::Ptr& status, const Array::Pt { "enable_host_checks", icingaapplication->GetEnableHostChecks() }, { "enable_service_checks", icingaapplication->GetEnableServiceChecks() }, { "enable_perfdata", icingaapplication->GetEnablePerfdata() }, + { "environment", icingaapplication->GetEnvironment() }, { "pid", Utility::GetPid() }, { "program_start", Application::GetStartTime() }, { "version", Application::GetAppVersion() } From d9c0b6f806ac2330b902d257509def4fa74f35de Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0141/1162] Refactor REGISTER_SCRIPTFUNCTION_* macros --- lib/base/function.hpp | 42 ++--------------- lib/base/perfdatavalue.cpp | 2 +- lib/base/scriptutils.cpp | 64 +++++++++++++------------- lib/base/statsfunction.hpp | 2 +- lib/config/configitem.cpp | 2 +- lib/db_ido/idochecktask.cpp | 2 +- lib/icinga/legacytimeperiod.cpp | 2 +- lib/icinga/objectutils.cpp | 22 ++++----- lib/methods/clusterchecktask.cpp | 2 +- lib/methods/clusterzonechecktask.cpp | 2 +- lib/methods/dummychecktask.cpp | 2 +- lib/methods/exceptionchecktask.cpp | 2 +- lib/methods/icingachecktask.cpp | 2 +- lib/methods/nullchecktask.cpp | 2 +- lib/methods/nulleventtask.cpp | 2 +- lib/methods/pluginchecktask.cpp | 2 +- lib/methods/plugineventtask.cpp | 2 +- lib/methods/pluginnotificationtask.cpp | 2 +- lib/methods/randomchecktask.cpp | 2 +- lib/methods/timeperiodtask.cpp | 4 +- 20 files changed, 66 insertions(+), 98 deletions(-) diff --git a/lib/base/function.hpp b/lib/base/function.hpp index dd08df6ff..eae0a0792 100644 --- a/lib/base/function.hpp +++ b/lib/base/function.hpp @@ -17,8 +17,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -#ifndef SCRIPTFUNCTION_H -#define SCRIPTFUNCTION_H +#ifndef FUNCTION_H +#define FUNCTION_H #include "base/i2-base.hpp" #include "base/function-ti.hpp" @@ -72,50 +72,18 @@ private: bool side_effect_free, bool deprecated); }; -#define REGISTER_SCRIPTFUNCTION_NS(ns, name, callback, args) \ +#define REGISTER_FUNCTION(ns, name, callback, args) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ ScriptGlobal::Set(#ns "." #name, sf); \ }, 10) -#define REGISTER_SCRIPTFUNCTION_NS_PREFIX(ns, name, callback, args) \ - INITIALIZE_ONCE_WITH_PRIORITY([]() { \ - Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ - ScriptGlobal::Set(#ns "." #name, sf); \ - Function::Ptr dsf = new icinga::Function("Deprecated#__" #name " (deprecated)", WrapFunction(callback), String(args).Split(":"), false, true); \ - ScriptGlobal::Set("Deprecated.__" #name, dsf); \ - }, 10) - -#define REGISTER_SCRIPTFUNCTION_NS_DEPRECATED(ns, name, callback, args) \ - INITIALIZE_ONCE_WITH_PRIORITY([]() { \ - Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ - ScriptGlobal::Set(#ns "." #name, sf); \ - Function::Ptr dsf = new icinga::Function("Deprecated#" #name " (deprecated)", WrapFunction(callback), String(args).Split(":"), false, true); \ - ScriptGlobal::Set("Deprecated." #name, dsf); \ - }, 10) - -#define REGISTER_SAFE_SCRIPTFUNCTION_NS(ns, name, callback, args) \ +#define REGISTER_SAFE_FUNCTION(ns, name, callback, args) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), true); \ ScriptGlobal::Set(#ns "." #name, sf); \ }, 10) -#define REGISTER_SAFE_SCRIPTFUNCTION_NS_PREFIX(ns, name, callback, args) \ - INITIALIZE_ONCE_WITH_PRIORITY([]() { \ - Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), true); \ - ScriptGlobal::Set(#ns "." #name, sf); \ - Function::Ptr dsf = new icinga::Function("Deprecated#__" #name " (deprecated)", WrapFunction(callback), String(args).Split(":"), true, true); \ - ScriptGlobal::Set("Deprecated.__" #name, dsf); \ - }, 10) - -#define REGISTER_SAFE_SCRIPTFUNCTION_NS_DEPRECATED(ns, name, callback, args) \ - INITIALIZE_ONCE_WITH_PRIORITY([]() { \ - Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), true); \ - ScriptGlobal::Set(#ns "." #name, sf); \ - Function::Ptr dsf = new icinga::Function("Deprecated#" #name " (deprecated)", WrapFunction(callback), String(args).Split(":"), true, true); \ - ScriptGlobal::Set("Deprecated." #name, dsf); \ - }, 10) - } -#endif /* SCRIPTFUNCTION_H */ +#endif /* FUNCTION_H */ diff --git a/lib/base/perfdatavalue.cpp b/lib/base/perfdatavalue.cpp index f2a93e128..0795c7644 100644 --- a/lib/base/perfdatavalue.cpp +++ b/lib/base/perfdatavalue.cpp @@ -27,7 +27,7 @@ using namespace icinga; REGISTER_TYPE(PerfdataValue); -REGISTER_SCRIPTFUNCTION_NS(System, parse_performance_data, PerfdataValue::Parse, "perfdata"); +REGISTER_FUNCTION(System, parse_performance_data, PerfdataValue::Parse, "perfdata"); PerfdataValue::PerfdataValue(const String& label, double value, bool counter, const String& unit, const Value& warn, const Value& crit, const Value& min, diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index 3c1a4e5a5..d0c947e6e 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -39,39 +39,39 @@ using namespace icinga; -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, regex, &ScriptUtils::Regex, "pattern:text:mode"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, match, &ScriptUtils::Match, "pattern:text:mode"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, cidr_match, &ScriptUtils::CidrMatch, "pattern:ip:mode"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, len, &ScriptUtils::Len, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, union, &ScriptUtils::Union, ""); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, intersection, &ScriptUtils::Intersection, ""); -REGISTER_SCRIPTFUNCTION_NS(System, log, &ScriptUtils::Log, "severity:facility:value"); -REGISTER_SCRIPTFUNCTION_NS(System, range, &ScriptUtils::Range, "start:end:increment"); -REGISTER_SCRIPTFUNCTION_NS(System, exit, &Application::Exit, "status"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, typeof, &ScriptUtils::TypeOf, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, keys, &ScriptUtils::Keys, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, random, &Utility::Random, ""); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, get_object, &ScriptUtils::GetObject, "type:name"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, get_objects, &ScriptUtils::GetObjects, "type"); -REGISTER_SCRIPTFUNCTION_NS(System, assert, &ScriptUtils::Assert, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, string, &ScriptUtils::CastString, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, number, &ScriptUtils::CastNumber, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, bool, &ScriptUtils::CastBool, "value"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, get_time, &Utility::GetTime, ""); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, basename, &Utility::BaseName, "path"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, dirname, &Utility::DirName, "path"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, msi_get_component_path, &ScriptUtils::MsiGetComponentPathShim, "component"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, track_parents, &ScriptUtils::TrackParents, "child"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, escape_shell_cmd, &Utility::EscapeShellCmd, "cmd"); -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, escape_shell_arg, &Utility::EscapeShellArg, "arg"); +REGISTER_SAFE_FUNCTION(System, regex, &ScriptUtils::Regex, "pattern:text:mode"); +REGISTER_SAFE_FUNCTION(System, match, &ScriptUtils::Match, "pattern:text:mode"); +REGISTER_SAFE_FUNCTION(System, cidr_match, &ScriptUtils::CidrMatch, "pattern:ip:mode"); +REGISTER_SAFE_FUNCTION(System, len, &ScriptUtils::Len, "value"); +REGISTER_SAFE_FUNCTION(System, union, &ScriptUtils::Union, ""); +REGISTER_SAFE_FUNCTION(System, intersection, &ScriptUtils::Intersection, ""); +REGISTER_FUNCTION(System, log, &ScriptUtils::Log, "severity:facility:value"); +REGISTER_FUNCTION(System, range, &ScriptUtils::Range, "start:end:increment"); +REGISTER_FUNCTION(System, exit, &Application::Exit, "status"); +REGISTER_SAFE_FUNCTION(System, typeof, &ScriptUtils::TypeOf, "value"); +REGISTER_SAFE_FUNCTION(System, keys, &ScriptUtils::Keys, "value"); +REGISTER_SAFE_FUNCTION(System, random, &Utility::Random, ""); +REGISTER_SAFE_FUNCTION(System, get_object, &ScriptUtils::GetObject, "type:name"); +REGISTER_SAFE_FUNCTION(System, get_objects, &ScriptUtils::GetObjects, "type"); +REGISTER_FUNCTION(System, assert, &ScriptUtils::Assert, "value"); +REGISTER_SAFE_FUNCTION(System, string, &ScriptUtils::CastString, "value"); +REGISTER_SAFE_FUNCTION(System, number, &ScriptUtils::CastNumber, "value"); +REGISTER_SAFE_FUNCTION(System, bool, &ScriptUtils::CastBool, "value"); +REGISTER_SAFE_FUNCTION(System, get_time, &Utility::GetTime, ""); +REGISTER_SAFE_FUNCTION(System, basename, &Utility::BaseName, "path"); +REGISTER_SAFE_FUNCTION(System, dirname, &Utility::DirName, "path"); +REGISTER_SAFE_FUNCTION(System, msi_get_component_path, &ScriptUtils::MsiGetComponentPathShim, "component"); +REGISTER_SAFE_FUNCTION(System, track_parents, &ScriptUtils::TrackParents, "child"); +REGISTER_SAFE_FUNCTION(System, escape_shell_cmd, &Utility::EscapeShellCmd, "cmd"); +REGISTER_SAFE_FUNCTION(System, escape_shell_arg, &Utility::EscapeShellArg, "arg"); #ifdef _WIN32 -REGISTER_SAFE_SCRIPTFUNCTION_NS(System, escape_create_process_arg, &Utility::EscapeCreateProcessArg, "arg"); +REGISTER_SAFE_FUNCTION(System, escape_create_process_arg, &Utility::EscapeCreateProcessArg, "arg"); #endif /* _WIN32 */ -REGISTER_SCRIPTFUNCTION_NS(System, ptr, &ScriptUtils::Ptr, "object"); -REGISTER_SCRIPTFUNCTION_NS(System, sleep, &Utility::Sleep, "interval"); -REGISTER_SCRIPTFUNCTION_NS(System, path_exists, &Utility::PathExists, "path"); -REGISTER_SCRIPTFUNCTION_NS(System, glob, &ScriptUtils::Glob, "pathspec:callback:type"); -REGISTER_SCRIPTFUNCTION_NS(System, glob_recursive, &ScriptUtils::GlobRecursive, "pathspec:callback:type"); +REGISTER_FUNCTION(System, ptr, &ScriptUtils::Ptr, "object"); +REGISTER_FUNCTION(System, sleep, &Utility::Sleep, "interval"); +REGISTER_FUNCTION(System, path_exists, &Utility::PathExists, "path"); +REGISTER_FUNCTION(System, glob, &ScriptUtils::Glob, "pathspec:callback:type"); +REGISTER_FUNCTION(System, glob_recursive, &ScriptUtils::GlobRecursive, "pathspec:callback:type"); INITIALIZE_ONCE(&ScriptUtils::StaticInitialize); @@ -397,7 +397,7 @@ Type::Ptr ScriptUtils::TypeOf(const Value& value) return value.GetReflectionType(); } -Array::Ptr ScriptUtils::Keys(const Dictionary::Ptr& dict) +Array::Ptr ScriptUtils::Keys(const Dictionary::Ptr& obj) { ArrayData result; diff --git a/lib/base/statsfunction.hpp b/lib/base/statsfunction.hpp index 8dc5af4d7..aba496e75 100644 --- a/lib/base/statsfunction.hpp +++ b/lib/base/statsfunction.hpp @@ -27,7 +27,7 @@ namespace icinga { #define REGISTER_STATSFUNCTION(name, callback) \ - REGISTER_SCRIPTFUNCTION_NS(StatsFunctions, name, callback, "status:perfdata") + REGISTER_FUNCTION(StatsFunctions, name, callback, "status:perfdata") } diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index af2afd017..53c889b4d 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -48,7 +48,7 @@ ConfigItem::TypeMap ConfigItem::m_DefaultTemplates; ConfigItem::ItemList ConfigItem::m_UnnamedItems; ConfigItem::IgnoredItemList ConfigItem::m_IgnoredItems; -REGISTER_SCRIPTFUNCTION_NS(Internal, run_with_activation_context, &ConfigItem::RunWithActivationContext, "func"); +REGISTER_FUNCTION(Internal, run_with_activation_context, &ConfigItem::RunWithActivationContext, "func"); /** * Constructor for the ConfigItem class. diff --git a/lib/db_ido/idochecktask.cpp b/lib/db_ido/idochecktask.cpp index 544c2cefb..20fc57d0b 100644 --- a/lib/db_ido/idochecktask.cpp +++ b/lib/db_ido/idochecktask.cpp @@ -32,7 +32,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, IdoCheck, &IdoCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, IdoCheck, &IdoCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void IdoCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 5fe893035..8075d2810 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -28,7 +28,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, LegacyTimePeriod, &LegacyTimePeriod::ScriptFunc, "tp:begin:end"); +REGISTER_FUNCTION(Internal, LegacyTimePeriod, &LegacyTimePeriod::ScriptFunc, "tp:begin:end"); bool LegacyTimePeriod::IsInTimeRange(tm *begin, tm *end, int stride, tm *reference) { diff --git a/lib/icinga/objectutils.cpp b/lib/icinga/objectutils.cpp index f41143037..b8057ef18 100644 --- a/lib/icinga/objectutils.cpp +++ b/lib/icinga/objectutils.cpp @@ -29,17 +29,17 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(System, get_host, &Host::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_service, &ObjectUtils::GetService, "host:name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_services, &ObjectUtils::GetServices, "host"); -REGISTER_SCRIPTFUNCTION_NS(System, get_user, &User::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_check_command, &CheckCommand::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_event_command, &EventCommand::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_notification_command, &NotificationCommand::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_host_group, &HostGroup::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_service_group, &ServiceGroup::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_user_group, &UserGroup::GetByName, "name"); -REGISTER_SCRIPTFUNCTION_NS(System, get_time_period, &TimePeriod::GetByName, "name"); +REGISTER_FUNCTION(System, get_host, &Host::GetByName, "name"); +REGISTER_FUNCTION(System, get_service, &ObjectUtils::GetService, "host:name"); +REGISTER_FUNCTION(System, get_services, &ObjectUtils::GetServices, "host"); +REGISTER_FUNCTION(System, get_user, &User::GetByName, "name"); +REGISTER_FUNCTION(System, get_check_command, &CheckCommand::GetByName, "name"); +REGISTER_FUNCTION(System, get_event_command, &EventCommand::GetByName, "name"); +REGISTER_FUNCTION(System, get_notification_command, &NotificationCommand::GetByName, "name"); +REGISTER_FUNCTION(System, get_host_group, &HostGroup::GetByName, "name"); +REGISTER_FUNCTION(System, get_service_group, &ServiceGroup::GetByName, "name"); +REGISTER_FUNCTION(System, get_user_group, &UserGroup::GetByName, "name"); +REGISTER_FUNCTION(System, get_time_period, &TimePeriod::GetByName, "name"); Service::Ptr ObjectUtils::GetService(const Value& host, const String& name) { diff --git a/lib/methods/clusterchecktask.cpp b/lib/methods/clusterchecktask.cpp index 7473eb1ad..3e9bdea21 100644 --- a/lib/methods/clusterchecktask.cpp +++ b/lib/methods/clusterchecktask.cpp @@ -33,7 +33,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, ClusterCheck, &ClusterCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, ClusterCheck, &ClusterCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ClusterCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 04056f7c3..2b1badf0c 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, ClusterZoneCheck, &ClusterZoneCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, ClusterZoneCheck, &ClusterZoneCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/dummychecktask.cpp b/lib/methods/dummychecktask.cpp index 516cc23ea..51cc63480 100644 --- a/lib/methods/dummychecktask.cpp +++ b/lib/methods/dummychecktask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, DummyCheck, &DummyCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, DummyCheck, &DummyCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void DummyCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/exceptionchecktask.cpp b/lib/methods/exceptionchecktask.cpp index cb5ce76df..3f07c396a 100644 --- a/lib/methods/exceptionchecktask.cpp +++ b/lib/methods/exceptionchecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, ExceptionCheck, &ExceptionCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, ExceptionCheck, &ExceptionCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ExceptionCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 3f4d299da..ae263a4dc 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -34,7 +34,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/nullchecktask.cpp b/lib/methods/nullchecktask.cpp index df99c338e..85ee94444 100644 --- a/lib/methods/nullchecktask.cpp +++ b/lib/methods/nullchecktask.cpp @@ -30,7 +30,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, NullCheck, &NullCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, NullCheck, &NullCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void NullCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/nulleventtask.cpp b/lib/methods/nulleventtask.cpp index e515d31e8..1805e3e9f 100644 --- a/lib/methods/nulleventtask.cpp +++ b/lib/methods/nulleventtask.cpp @@ -23,7 +23,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, NullEvent, &NullEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, NullEvent, &NullEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); void NullEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index b98eec4a7..402c36e0a 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, PluginCheck, &PluginCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, PluginCheck, &PluginCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void PluginCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index 11774c7e2..00b55fb8a 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, PluginEvent, &PluginEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, PluginEvent, &PluginEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); void PluginEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index c33d29e55..e345e2a01 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -32,7 +32,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:itype:author:comment:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:itype:author:comment:resolvedMacros:useResolvedMacros"); void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification, const User::Ptr& user, const CheckResult::Ptr& cr, int itype, diff --git a/lib/methods/randomchecktask.cpp b/lib/methods/randomchecktask.cpp index bdf2d54d4..c228057a5 100644 --- a/lib/methods/randomchecktask.cpp +++ b/lib/methods/randomchecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, RandomCheck, &RandomCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION(Internal, RandomCheck, &RandomCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void RandomCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/timeperiodtask.cpp b/lib/methods/timeperiodtask.cpp index 152139e38..9cef126ed 100644 --- a/lib/methods/timeperiodtask.cpp +++ b/lib/methods/timeperiodtask.cpp @@ -22,8 +22,8 @@ using namespace icinga; -REGISTER_SCRIPTFUNCTION_NS(Internal, EmptyTimePeriod, &TimePeriodTask::EmptyTimePeriodUpdate, "tp:begin:end"); -REGISTER_SCRIPTFUNCTION_NS(Internal, EvenMinutesTimePeriod, &TimePeriodTask::EvenMinutesTimePeriodUpdate, "tp:begin:end"); +REGISTER_FUNCTION(Internal, EmptyTimePeriod, &TimePeriodTask::EmptyTimePeriodUpdate, "tp:begin:end"); +REGISTER_FUNCTION(Internal, EvenMinutesTimePeriod, &TimePeriodTask::EvenMinutesTimePeriodUpdate, "tp:begin:end"); Array::Ptr TimePeriodTask::EmptyTimePeriodUpdate(const TimePeriod::Ptr& tp, double, double) { From 9d513d8f0570602abdd7cd65d1df62d259190ed1 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0142/1162] Implement support for modifying frozen attributes --- lib/base/array.cpp | 54 ++++++++++++++++++++++----------------- lib/base/array.hpp | 22 ++++++++-------- lib/base/dictionary.cpp | 27 ++++++++++++-------- lib/base/dictionary.hpp | 10 ++++---- lib/base/object.cpp | 2 +- lib/base/object.hpp | 2 +- lib/base/reference.cpp | 2 +- lib/config/expression.cpp | 14 ++++++++-- lib/config/expression.hpp | 7 +++++ lib/config/vmops.hpp | 4 +-- 10 files changed, 86 insertions(+), 58 deletions(-) diff --git a/lib/base/array.cpp b/lib/base/array.cpp index 30cf7eba3..011f3cc8f 100644 --- a/lib/base/array.cpp +++ b/lib/base/array.cpp @@ -62,13 +62,14 @@ Value Array::Get(SizeType index) const * * @param index The index. * @param value The value. + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Set(SizeType index, const Value& value) +void Array::Set(SizeType index, const Value& value, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) - BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); + if (m_Frozen && !overrideFrozen) + BOOST_THROW_EXCEPTION(std::invalid_argument("Value in array must not be modified.")); m_Data.at(index) = value; } @@ -78,12 +79,13 @@ void Array::Set(SizeType index, const Value& value) * * @param index The index. * @param value The value. + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Set(SizeType index, Value&& value) +void Array::Set(SizeType index, Value&& value, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.at(index).Swap(value); @@ -93,12 +95,13 @@ void Array::Set(SizeType index, Value&& value) * Adds a value to the array. * * @param value The value. + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Add(Value value) +void Array::Add(Value value, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.push_back(std::move(value)); @@ -162,14 +165,15 @@ bool Array::Contains(const Value& value) const * * @param index The index * @param value The value to add + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Insert(SizeType index, Value value) +void Array::Insert(SizeType index, Value value, bool overrideFrozen) { ObjectLock olock(this); ASSERT(index <= m_Data.size()); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.insert(m_Data.begin() + index, std::move(value)); @@ -179,12 +183,13 @@ void Array::Insert(SizeType index, Value value) * Removes the specified index from the array. * * @param index The index. + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Remove(SizeType index) +void Array::Remove(SizeType index, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.erase(m_Data.begin() + index); @@ -194,42 +199,43 @@ void Array::Remove(SizeType index) * Removes the item specified by the iterator from the array. * * @param it The iterator. + * @param overrideFrozen Whether to allow modifying frozen arrays. */ -void Array::Remove(Array::Iterator it) +void Array::Remove(Array::Iterator it, bool overrideFrozen) { ASSERT(OwnsLock()); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.erase(it); } -void Array::Resize(SizeType newSize) +void Array::Resize(SizeType newSize, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.resize(newSize); } -void Array::Clear() +void Array::Clear(bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.clear(); } -void Array::Reserve(SizeType newSize) +void Array::Reserve(SizeType newSize, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); m_Data.reserve(newSize); @@ -288,11 +294,11 @@ Array::Ptr Array::Reverse() const return result; } -void Array::Sort() +void Array::Sort(bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Array must not be modified.")); std::sort(m_Data.begin(), m_Data.end()); @@ -342,7 +348,7 @@ Value Array::GetFieldByName(const String& field, bool sandboxed, const DebugInfo return Get(index); } -void Array::SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) +void Array::SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) { ObjectLock olock(this); @@ -352,9 +358,9 @@ void Array::SetFieldByName(const String& field, const Value& value, const DebugI BOOST_THROW_EXCEPTION(ScriptError("Array index '" + Convert::ToString(index) + "' is out of bounds.", debugInfo)); if (static_cast(index) >= GetLength()) - Resize(index + 1); + Resize(index + 1, overrideFrozen); - Set(index, value); + Set(index, value, overrideFrozen); } Array::Iterator icinga::begin(const Array::Ptr& x) diff --git a/lib/base/array.hpp b/lib/base/array.hpp index 62bcf7e2e..d6f7fcdfc 100644 --- a/lib/base/array.hpp +++ b/lib/base/array.hpp @@ -55,9 +55,9 @@ public: Array(std::initializer_list init); Value Get(SizeType index) const; - void Set(SizeType index, const Value& value); - void Set(SizeType index, Value&& value); - void Add(Value value); + void Set(SizeType index, const Value& value, bool overrideFrozen = false); + void Set(SizeType index, Value&& value, bool overrideFrozen = false); + void Add(Value value, bool overrideFrozen = false); Iterator Begin(); Iterator End(); @@ -65,14 +65,14 @@ public: size_t GetLength() const; bool Contains(const Value& value) const; - void Insert(SizeType index, Value value); - void Remove(SizeType index); - void Remove(Iterator it); + void Insert(SizeType index, Value value, bool overrideFrozen = false); + void Remove(SizeType index, bool overrideFrozen = false); + void Remove(Iterator it, bool overrideFrozen = false); - void Resize(SizeType newSize); - void Clear(); + void Resize(SizeType newSize, bool overrideFrozen = false); + void Clear(bool overrideFrozen = false); - void Reserve(SizeType newSize); + void Reserve(SizeType newSize, bool overrideFrozen = false); void CopyTo(const Array::Ptr& dest) const; Array::Ptr ShallowClone() const; @@ -108,7 +108,7 @@ public: Array::Ptr Reverse() const; - void Sort(); + void Sort(bool overrideFrozen = false); String ToString() const override; @@ -116,7 +116,7 @@ public: void Freeze(); Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const override; - void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) override; + void SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) override; private: std::vector m_Data; /**< The data for the array. */ diff --git a/lib/base/dictionary.cpp b/lib/base/dictionary.cpp index a64540404..99fd5591f 100644 --- a/lib/base/dictionary.cpp +++ b/lib/base/dictionary.cpp @@ -89,13 +89,14 @@ bool Dictionary::Get(const String& key, Value *result) const * * @param key The key. * @param value The value. + * @param overrideFrozen Whether to allow modifying frozen dictionaries. */ -void Dictionary::Set(const String& key, Value value) +void Dictionary::Set(const String& key, Value value, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) - BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionary must not be modified.")); + if (m_Frozen && !overrideFrozen) + BOOST_THROW_EXCEPTION(std::invalid_argument("Value in dictionary must not be modified.")); m_Data[key] = std::move(value); } @@ -157,12 +158,13 @@ Dictionary::Iterator Dictionary::End() * Removes the item specified by the iterator from the dictionary. * * @param it The iterator. + * @param overrideFrozen Whether to allow modifying frozen dictionaries. */ -void Dictionary::Remove(Dictionary::Iterator it) +void Dictionary::Remove(Dictionary::Iterator it, bool overrideFrozen) { ASSERT(OwnsLock()); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionary must not be modified.")); m_Data.erase(it); @@ -172,12 +174,13 @@ void Dictionary::Remove(Dictionary::Iterator it) * Removes the specified key from the dictionary. * * @param key The key. + * @param overrideFrozen Whether to allow modifying frozen dictionaries. */ -void Dictionary::Remove(const String& key) +void Dictionary::Remove(const String& key, bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionary must not be modified.")); Dictionary::Iterator it; @@ -191,12 +194,14 @@ void Dictionary::Remove(const String& key) /** * Removes all dictionary items. + * + * @param overrideFrozen Whether to allow modifying frozen dictionaries. */ -void Dictionary::Clear() +void Dictionary::Clear(bool overrideFrozen) { ObjectLock olock(this); - if (m_Frozen) + if (m_Frozen && !overrideFrozen) BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionary must not be modified.")); m_Data.clear(); @@ -288,9 +293,9 @@ Value Dictionary::GetFieldByName(const String& field, bool, const DebugInfo& deb return GetPrototypeField(const_cast(this), field, false, debugInfo); } -void Dictionary::SetFieldByName(const String& field, const Value& value, const DebugInfo&) +void Dictionary::SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo&) { - Set(field, value); + Set(field, value, overrideFrozen); } bool Dictionary::HasOwnField(const String& field) const diff --git a/lib/base/dictionary.hpp b/lib/base/dictionary.hpp index 97ca81b78..9523528a6 100644 --- a/lib/base/dictionary.hpp +++ b/lib/base/dictionary.hpp @@ -58,7 +58,7 @@ public: Value Get(const String& key) const; bool Get(const String& key, Value *result) const; - void Set(const String& key, Value value); + void Set(const String& key, Value value, bool overrideFrozen = false); bool Contains(const String& key) const; Iterator Begin(); @@ -66,11 +66,11 @@ public: size_t GetLength() const; - void Remove(const String& key); + void Remove(const String& key, bool overrideFrozen = false); - void Remove(Iterator it); + void Remove(Iterator it, bool overrideFrozen = false); - void Clear(); + void Clear(bool overrideFrozen = false); void CopyTo(const Dictionary::Ptr& dest) const; Dictionary::Ptr ShallowClone() const; @@ -86,7 +86,7 @@ public: void Freeze(); Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const override; - void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) override; + void SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) override; bool HasOwnField(const String& field) const override; bool GetOwnField(const String& field, Value *result) const override; diff --git a/lib/base/object.cpp b/lib/base/object.cpp index b1fff79d2..e3ec8f7aa 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -138,7 +138,7 @@ Value Object::GetFieldByName(const String& field, bool sandboxed, const DebugInf return GetField(fid); } -void Object::SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo) +void Object::SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) { Type::Ptr type = GetReflectionType(); diff --git a/lib/base/object.hpp b/lib/base/object.hpp index 7836d2644..9d64d4af3 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -183,7 +183,7 @@ public: virtual void SetField(int id, const Value& value, bool suppress_events = false, const Value& cookie = Empty); virtual Value GetField(int id) const; virtual Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const; - virtual void SetFieldByName(const String& field, const Value& value, const DebugInfo& debugInfo); + virtual void SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo); virtual bool HasOwnField(const String& field) const; virtual bool GetOwnField(const String& field, Value *result) const; virtual void ValidateField(int id, const Lazy& lvalue, const ValidationUtils& utils); diff --git a/lib/base/reference.cpp b/lib/base/reference.cpp index 53f6e9e2e..855b60115 100644 --- a/lib/base/reference.cpp +++ b/lib/base/reference.cpp @@ -41,7 +41,7 @@ Value Reference::Get() const void Reference::Set(const Value& value) { - m_Parent->SetFieldByName(m_Index, value, DebugInfo()); + m_Parent->SetFieldByName(m_Index, value, false, DebugInfo()); } Object::Ptr Reference::GetParent() const diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 94a966375..af3a7399e 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -608,7 +608,7 @@ ExpressionResult SetExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) } } - VMOps::SetField(parent, index, operand2.GetValue(), m_DebugInfo); + VMOps::SetField(parent, index, operand2.GetValue(), m_OverrideFrozen, m_DebugInfo); if (psdhint) { psdhint->AddMessage("=", m_DebugInfo); @@ -620,6 +620,11 @@ ExpressionResult SetExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) return Empty; } +void SetExpression::SetOverrideFrozen() +{ + m_OverrideFrozen = true; +} + ExpressionResult ConditionalExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { ExpressionResult condition = m_Condition->Evaluate(frame, dhint); @@ -699,7 +704,7 @@ bool IndexerExpression::GetReference(ScriptFrame& frame, bool init_dict, Value * Value old_value = VMOps::GetField(vparent, vindex, frame.Sandboxed, m_Operand1->GetDebugInfo()); if (old_value.IsEmpty() && !old_value.IsString()) - VMOps::SetField(vparent, vindex, new Dictionary(), m_Operand1->GetDebugInfo()); + VMOps::SetField(vparent, vindex, new Dictionary(), m_OverrideFrozen, m_Operand1->GetDebugInfo()); } *parent = VMOps::GetField(vparent, vindex, frame.Sandboxed, m_DebugInfo); @@ -725,6 +730,11 @@ bool IndexerExpression::GetReference(ScriptFrame& frame, bool init_dict, Value * return true; } +void IndexerExpression::SetOverrideFrozen() +{ + m_OverrideFrozen = true; +} + void icinga::BindToScope(std::unique_ptr& expr, ScopeSpecifier scopeSpec) { auto *dexpr = dynamic_cast(expr.get()); diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index ff25519b7..4a7e9b0c8 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -644,11 +644,14 @@ public: : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo), m_Op(op) { } + void SetOverrideFrozen(); + protected: ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; private: CombinedSetOp m_Op; + bool m_OverrideFrozen{false}; friend void BindToScope(std::unique_ptr& expr, ScopeSpecifier scopeSpec); }; @@ -739,7 +742,11 @@ public: : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo) { } + void SetOverrideFrozen(); + protected: + bool m_OverrideFrozen{false}; + ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const override; diff --git a/lib/config/vmops.hpp b/lib/config/vmops.hpp index 503381730..24224af0a 100644 --- a/lib/config/vmops.hpp +++ b/lib/config/vmops.hpp @@ -244,12 +244,12 @@ public: return object->GetFieldByName(field, sandboxed, debugInfo); } - static inline void SetField(const Object::Ptr& context, const String& field, const Value& value, const DebugInfo& debugInfo = DebugInfo()) + static inline void SetField(const Object::Ptr& context, const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo = DebugInfo()) { if (!context) BOOST_THROW_EXCEPTION(ScriptError("Cannot set field '" + field + "' on a value that is not an object.", debugInfo)); - return context->SetFieldByName(field, value, debugInfo); + return context->SetFieldByName(field, value, overrideFrozen, debugInfo); } private: From 1a8692d972c4d9c5e6aa79a042cedd1b84941b8a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0143/1162] Implement support for namespaces --- doc/17-language-reference.md | 32 ++++ icinga-app/icinga.cpp | 20 ++- itl/hangman | 4 +- lib/base/CMakeLists.txt | 1 + lib/base/function.hpp | 20 ++- lib/base/json-script.cpp | 16 +- lib/base/json.cpp | 21 +++ lib/base/math-script.cpp | 73 ++++---- lib/base/namespace-script.cpp | 101 +++++++++++ lib/base/namespace.cpp | 223 +++++++++++++++++++++++++ lib/base/namespace.hpp | 123 ++++++++++++++ lib/base/scriptglobal.cpp | 22 ++- lib/base/scriptglobal.hpp | 9 +- lib/base/scriptutils.cpp | 8 +- lib/base/serializer.cpp | 22 +++ lib/base/type.cpp | 21 ++- lib/config/config_parser.yy | 2 +- lib/config/configitembuilder.cpp | 1 + lib/config/expression.cpp | 34 +++- lib/config/expression.hpp | 13 ++ lib/config/vmops.hpp | 21 +++ lib/db_ido/db_ido-itl.conf | 6 +- lib/db_ido/idochecktask.cpp | 2 +- lib/icinga/cib.cpp | 6 +- lib/icinga/icinga-itl.conf | 6 +- lib/icinga/legacytimeperiod.cpp | 2 +- lib/methods/clusterchecktask.cpp | 2 +- lib/methods/clusterzonechecktask.cpp | 2 +- lib/methods/dummychecktask.cpp | 2 +- lib/methods/exceptionchecktask.cpp | 2 +- lib/methods/icingachecktask.cpp | 2 +- lib/methods/methods-itl.conf | 62 +++---- lib/methods/nullchecktask.cpp | 2 +- lib/methods/nulleventtask.cpp | 2 +- lib/methods/pluginchecktask.cpp | 2 +- lib/methods/plugineventtask.cpp | 2 +- lib/methods/pluginnotificationtask.cpp | 2 +- lib/methods/randomchecktask.cpp | 2 +- lib/methods/timeperiodtask.cpp | 4 +- lib/remote/consolehandler.cpp | 12 +- lib/remote/jsonrpc.cpp | 2 +- lib/remote/statushandler.cpp | 14 +- lib/remote/variablequeryhandler.cpp | 7 +- 43 files changed, 789 insertions(+), 143 deletions(-) create mode 100644 lib/base/namespace-script.cpp create mode 100644 lib/base/namespace.cpp create mode 100644 lib/base/namespace.hpp diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index f7fae4695..0e48a6c25 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -203,6 +203,38 @@ to dereference a reference: *p = "Hi!" log(value) // Prints "Hi!" because the variable was changed +### Namespaces + +Namespaces can be used to organize variables and functions. They are used to avoid name conflicts. The `namespace` +keyword is used to create a new namespace: + + namespace Utils { + function calculate() { + return 2 + 2 + } + } + +The namespace is made available as a global variable which has the namespace's name (e.g. `Utils`): + + Utils.calculate() + +The `using` keyword can be used to make all attributes in a namespace available to a script without having to +explicitly specify the namespace's name for each access: + + using Utils + calculate() + +The `using` keyword only has an effect for the current file and only for code that follows the keyword: + + calculate() // This will not work. + using Utils + +The following namespaces are automatically imported as if by using the `using` keyword: + +* System +* Types +* Icinga + ### Function Calls Functions can be called using the `()` operator: diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 26ed4cf69..24da88644 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -21,6 +21,7 @@ #include "config/configcompilercontext.hpp" #include "config/configcompiler.hpp" #include "config/configitembuilder.hpp" +#include "config/expression.hpp" #include "base/application.hpp" #include "base/logger.hpp" #include "base/timer.hpp" @@ -440,7 +441,24 @@ static int Main() key = define; value = "1"; } - ScriptGlobal::Set(key, value); + + std::vector keyTokens = key.Split("."); + + std::unique_ptr expr; + std::unique_ptr varExpr{new VariableExpression(keyTokens[0], {}, DebugInfo())}; + expr = std::move(varExpr); + + for (size_t i = 1; i < keyTokens.size(); i++) { + std::unique_ptr indexerExpr{new IndexerExpression(std::move(expr), MakeLiteral(keyTokens[i]))}; + indexerExpr->SetOverrideFrozen(); + expr = std::move(indexerExpr); + } + + std::unique_ptr setExpr{new SetExpression(std::move(expr), OpSetLiteral, MakeLiteral(value))}; + setExpr->SetOverrideFrozen(); + + ScriptFrame frame(true); + setExpr->Evaluate(frame); } } diff --git a/itl/hangman b/itl/hangman index f4dc118e0..48cd177d7 100644 --- a/itl/hangman +++ b/itl/hangman @@ -17,8 +17,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -if (!globals.irc) { - globals.irc = globals.log +if (!globals.contains("irc")) { + globals.irc = log } hm = { diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index e784a3957..3cdc08556 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -54,6 +54,7 @@ set(base_SOURCES math-script.cpp netstring.cpp netstring.hpp networkstream.cpp networkstream.hpp + namespace.cpp namespace.hpp namespace-script.cpp number.cpp number.hpp number-script.cpp object.cpp object.hpp object-script.cpp objectlock.cpp objectlock.hpp diff --git a/lib/base/function.hpp b/lib/base/function.hpp index eae0a0792..493be13ee 100644 --- a/lib/base/function.hpp +++ b/lib/base/function.hpp @@ -75,13 +75,29 @@ private: #define REGISTER_FUNCTION(ns, name, callback, args) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ - ScriptGlobal::Set(#ns "." #name, sf); \ + Namespace::Ptr nsp = ScriptGlobal::Get(#ns); \ + nsp->SetAttribute(#name, std::make_shared(sf)); \ }, 10) #define REGISTER_SAFE_FUNCTION(ns, name, callback, args) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), true); \ - ScriptGlobal::Set(#ns "." #name, sf); \ + Namespace::Ptr nsp = ScriptGlobal::Get(#ns); \ + nsp->SetAttribute(#name, std::make_shared(sf)); \ + }, 10) + +#define REGISTER_FUNCTION_NONCONST(ns, name, callback, args) \ + INITIALIZE_ONCE_WITH_PRIORITY([]() { \ + Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ + Namespace::Ptr nsp = ScriptGlobal::Get(#ns); \ + nsp->SetAttribute(#name, std::make_shared(sf)); \ + }, 10) + +#define REGISTER_SAFE_FUNCTION_NONCONST(ns, name, callback, args) \ + INITIALIZE_ONCE_WITH_PRIORITY([]() { \ + Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), true); \ + Namespace::Ptr nsp = ScriptGlobal::Get(#ns); \ + nsp->SetAttribute(#name, std::make_shared(sf)); \ }, 10) } diff --git a/lib/base/json-script.cpp b/lib/base/json-script.cpp index 9df6ee783..d99c71bde 100644 --- a/lib/base/json-script.cpp +++ b/lib/base/json-script.cpp @@ -32,11 +32,15 @@ static String JsonEncodeShim(const Value& value) } INITIALIZE_ONCE([]() { - Dictionary::Ptr jsonObj = new Dictionary({ - /* Methods */ - { "encode", new Function("Json#encode", JsonEncodeShim, { "value" }, true) }, - { "decode", new Function("Json#decode", JsonDecode, { "value" }, true) } - }); + auto jsonNSBehavior = new ConstNamespaceBehavior(); + Namespace::Ptr jsonNS = new Namespace(jsonNSBehavior); - ScriptGlobal::Set("Json", jsonObj); + /* Methods */ + jsonNS->Set("encode", new Function("Json#encode", JsonEncodeShim, { "value" }, true)); + jsonNS->Set("decode", new Function("Json#decode", JsonDecode, { "value" }, true)); + + jsonNSBehavior->Freeze(); + + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + systemNS->SetAttribute("Json", std::make_shared(jsonNS)); }); diff --git a/lib/base/json.cpp b/lib/base/json.cpp index c074aed56..27119f434 100644 --- a/lib/base/json.cpp +++ b/lib/base/json.cpp @@ -19,6 +19,7 @@ #include "base/json.hpp" #include "base/debug.hpp" +#include "base/namespace.hpp" #include "base/dictionary.hpp" #include "base/array.hpp" #include "base/objectlock.hpp" @@ -39,6 +40,19 @@ typedef unsigned int yajl_size; typedef size_t yajl_size; #endif /* YAJL_MAJOR */ +static void EncodeNamespace(yajl_gen handle, const Namespace::Ptr& ns) +{ + yajl_gen_map_open(handle); + + ObjectLock olock(ns); + for (const Namespace::Pair& kv : ns) { + yajl_gen_string(handle, reinterpret_cast(kv.first.CStr()), kv.first.GetLength()); + Encode(handle, kv.second->Get()); + } + + yajl_gen_map_close(handle); +} + static void EncodeDictionary(yajl_gen handle, const Dictionary::Ptr& dict) { yajl_gen_map_open(handle); @@ -83,6 +97,13 @@ static void Encode(yajl_gen handle, const Value& value) case ValueObject: { const Object::Ptr& obj = value.Get(); + Namespace::Ptr ns = dynamic_pointer_cast(obj); + + if (ns) { + EncodeNamespace(handle, ns); + break; + } + Dictionary::Ptr dict = dynamic_pointer_cast(obj); if (dict) { diff --git a/lib/base/math-script.cpp b/lib/base/math-script.cpp index dab48a5df..288cbca12 100644 --- a/lib/base/math-script.cpp +++ b/lib/base/math-script.cpp @@ -22,6 +22,7 @@ #include "base/functionwrapper.hpp" #include "base/scriptframe.hpp" #include "base/initialize.hpp" +#include "base/namespace.hpp" #include #include @@ -158,40 +159,44 @@ static double MathSign(double x) } INITIALIZE_ONCE([]() { - Dictionary::Ptr mathObj = new Dictionary({ - /* Constants */ - { "E", 2.71828182845904523536 }, - { "LN2", 0.693147180559945309417 }, - { "LN10", 2.30258509299404568402 }, - { "LOG2E", 1.44269504088896340736 }, - { "LOG10E", 0.434294481903251827651 }, - { "PI", 3.14159265358979323846 }, - { "SQRT1_2", 0.707106781186547524401 }, - { "SQRT2", 1.41421356237309504880 }, + auto mathNSBehavior = new ConstNamespaceBehavior(); + Namespace::Ptr mathNS = new Namespace(mathNSBehavior); - /* Methods */ - { "abs", new Function("Math#abs", MathAbs, { "x" }, true) }, - { "acos", new Function("Math#acos", MathAcos, { "x" }, true) }, - { "asin", new Function("Math#asin", MathAsin, { "x" }, true) }, - { "atan", new Function("Math#atan", MathAtan, { "x" }, true) }, - { "atan2", new Function("Math#atan2", MathAtan2, { "x", "y" }, true) }, - { "ceil", new Function("Math#ceil", MathCeil, { "x" }, true) }, - { "cos", new Function("Math#cos", MathCos, { "x" }, true) }, - { "exp", new Function("Math#exp", MathExp, { "x" }, true) }, - { "floor", new Function("Math#floor", MathFloor, { "x" }, true) }, - { "log", new Function("Math#log", MathLog, { "x" }, true) }, - { "max", new Function("Math#max", MathMax, {}, true) }, - { "min", new Function("Math#min", MathMin, {}, true) }, - { "pow", new Function("Math#pow", MathPow, { "x", "y" }, true) }, - { "random", new Function("Math#random", MathRandom, {}, true) }, - { "round", new Function("Math#round", MathRound, { "x" }, true) }, - { "sin", new Function("Math#sin", MathSin, { "x" }, true) }, - { "sqrt", new Function("Math#sqrt", MathSqrt, { "x" }, true) }, - { "tan", new Function("Math#tan", MathTan, { "x" }, true) }, - { "isnan", new Function("Math#isnan", MathIsnan, { "x" }, true) }, - { "isinf", new Function("Math#isinf", MathIsinf, { "x" }, true) }, - { "sign", new Function("Math#sign", MathSign, { "x" }, true) } - }); + /* Constants */ + mathNS->Set("E", 2.71828182845904523536); + mathNS->Set("LN2", 0.693147180559945309417); + mathNS->Set("LN10", 2.30258509299404568402); + mathNS->Set("LOG2E", 1.44269504088896340736); + mathNS->Set("LOG10E", 0.434294481903251827651); + mathNS->Set("PI", 3.14159265358979323846); + mathNS->Set("SQRT1_2", 0.707106781186547524401); + mathNS->Set("SQRT2", 1.41421356237309504880); - ScriptGlobal::Set("Math", mathObj); + /* Methods */ + mathNS->Set("abs", new Function("Math#abs", MathAbs, { "x" }, true)); + mathNS->Set("acos", new Function("Math#acos", MathAcos, { "x" }, true)); + mathNS->Set("asin", new Function("Math#asin", MathAsin, { "x" }, true)); + mathNS->Set("atan", new Function("Math#atan", MathAtan, { "x" }, true)); + mathNS->Set("atan2", new Function("Math#atan2", MathAtan2, { "x", "y" }, true)); + mathNS->Set("ceil", new Function("Math#ceil", MathCeil, { "x" }, true)); + mathNS->Set("cos", new Function("Math#cos", MathCos, { "x" }, true)); + mathNS->Set("exp", new Function("Math#exp", MathExp, { "x" }, true)); + mathNS->Set("floor", new Function("Math#floor", MathFloor, { "x" }, true)); + mathNS->Set("log", new Function("Math#log", MathLog, { "x" }, true)); + mathNS->Set("max", new Function("Math#max", MathMax, {}, true)); + mathNS->Set("min", new Function("Math#min", MathMin, {}, true)); + mathNS->Set("pow", new Function("Math#pow", MathPow, { "x", "y" }, true)); + mathNS->Set("random", new Function("Math#random", MathRandom, {}, true)); + mathNS->Set("round", new Function("Math#round", MathRound, { "x" }, true)); + mathNS->Set("sin", new Function("Math#sin", MathSin, { "x" }, true)); + mathNS->Set("sqrt", new Function("Math#sqrt", MathSqrt, { "x" }, true)); + mathNS->Set("tan", new Function("Math#tan", MathTan, { "x" }, true)); + mathNS->Set("isnan", new Function("Math#isnan", MathIsnan, { "x" }, true)); + mathNS->Set("isinf", new Function("Math#isinf", MathIsinf, { "x" }, true)); + mathNS->Set("sign", new Function("Math#sign", MathSign, { "x" }, true)); + + mathNSBehavior->Freeze(); + + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + systemNS->SetAttribute("Math", std::make_shared(mathNS)); }); diff --git a/lib/base/namespace-script.cpp b/lib/base/namespace-script.cpp new file mode 100644 index 000000000..9f5471d60 --- /dev/null +++ b/lib/base/namespace-script.cpp @@ -0,0 +1,101 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/namespace.hpp" +#include "base/function.hpp" +#include "base/functionwrapper.hpp" +#include "base/scriptframe.hpp" +#include "base/array.hpp" + +using namespace icinga; + +static void NamespaceSet(const String& key, const Value& value) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + self->Set(key, value); +} + +static Value NamespaceGet(const String& key) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + return self->Get(key); +} + +static void NamespaceRemove(const String& key) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + self->Remove(key); +} + +static bool NamespaceContains(const String& key) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + return self->Contains(key); +} + +static Array::Ptr NamespaceKeys() +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + + ArrayData keys; + ObjectLock olock(self); + for (const Namespace::Pair& kv : self) { + keys.push_back(kv.first); + } + return new Array(std::move(keys)); +} + +static Array::Ptr NamespaceValues() +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Namespace::Ptr self = static_cast(vframe->Self); + REQUIRE_NOT_NULL(self); + + ArrayData values; + ObjectLock olock(self); + for (const Namespace::Pair& kv : self) { + values.push_back(kv.second->Get()); + } + return new Array(std::move(values)); +} + +Object::Ptr Namespace::GetPrototype() +{ + static Dictionary::Ptr prototype = new Dictionary({ + { "set", new Function("Namespace#set", NamespaceSet, { "key", "value" }) }, + { "get", new Function("Namespace#get", NamespaceGet, { "key" }) }, + { "remove", new Function("Namespace#remove", NamespaceRemove, { "key" }) }, + { "contains", new Function("Namespace#contains", NamespaceContains, { "key" }, true) }, + { "keys", new Function("Namespace#keys", NamespaceKeys, {}, true) }, + { "values", new Function("Namespace#values", NamespaceValues, {}, true) }, + }); + + return prototype; +} + diff --git a/lib/base/namespace.cpp b/lib/base/namespace.cpp new file mode 100644 index 000000000..d106a0ee3 --- /dev/null +++ b/lib/base/namespace.cpp @@ -0,0 +1,223 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/namespace.hpp" +#include "base/objectlock.hpp" +#include "base/debug.hpp" +#include "base/primitivetype.hpp" +#include "base/debuginfo.hpp" +#include "base/exception.hpp" +#include + +using namespace icinga; + +template class std::map >; + +REGISTER_PRIMITIVE_TYPE(Namespace, Object, Namespace::GetPrototype()); + +Namespace::Namespace(NamespaceBehavior *behavior) + : m_Behavior(std::unique_ptr(behavior)) +{ } + +Value Namespace::Get(const String& field) const +{ + Value value; + if (!GetOwnField(field, &value)) + BOOST_THROW_EXCEPTION(ScriptError("Namespace does not contain field '" + field + "'")); + return value; +} + +bool Namespace::Get(const String& field, Value *value) const +{ + auto nsVal = GetAttribute(field); + + if (!nsVal) + return false; + + *value = nsVal->Get(DebugInfo()); + return true; +} + +void Namespace::Set(const String& field, const Value& value, bool overrideFrozen) +{ + return SetFieldByName(field, value, overrideFrozen, DebugInfo()); +} + +bool Namespace::Contains(const String& field) const +{ + return HasOwnField(field); +} + +void Namespace::Remove(const String& field, bool overrideFrozen) +{ + m_Behavior->Remove(this, field, overrideFrozen); +} + +void Namespace::RemoveAttribute(const String& field) +{ + ObjectLock olock(this); + + Namespace::Iterator it; + it = m_Data.find(field); + + if (it == m_Data.end()) + return; + + m_Data.erase(it); +} + +std::shared_ptr Namespace::GetAttribute(const String& key) const +{ + ObjectLock olock(this); + + auto it = m_Data.find(key); + + if (it == m_Data.end()) + return nullptr; + + return it->second; +} + +void Namespace::SetAttribute(const String& key, const std::shared_ptr& nsVal) +{ + ObjectLock olock(this); + + m_Data[key] = nsVal; +} + +Value Namespace::GetFieldByName(const String& field, bool, const DebugInfo& debugInfo) const +{ + auto nsVal = GetAttribute(field); + + if (nsVal) + return nsVal->Get(debugInfo); + else + return GetPrototypeField(const_cast(this), field, true, debugInfo); +} + +void Namespace::SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) +{ + auto nsVal = GetAttribute(field); + + if (!nsVal) + m_Behavior->Register(this, field, value, overrideFrozen, debugInfo); + else + nsVal->Set(value, overrideFrozen, debugInfo); +} + +bool Namespace::HasOwnField(const String& field) const +{ + return GetAttribute(field) != nullptr; +} + +bool Namespace::GetOwnField(const String& field, Value *result) const +{ + auto nsVal = GetAttribute(field); + + if (!nsVal) + return false; + + *result = nsVal->Get(DebugInfo()); + return true; +} + +EmbeddedNamespaceValue::EmbeddedNamespaceValue(const Value& value) + : m_Value(value) +{ } + +Value EmbeddedNamespaceValue::Get(const DebugInfo& debugInfo) const +{ + return m_Value; +} + +void EmbeddedNamespaceValue::Set(const Value& value, bool, const DebugInfo&) +{ + m_Value = value; +} + +void ConstEmbeddedNamespaceValue::Set(const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) +{ + if (!overrideFrozen) + BOOST_THROW_EXCEPTION(ScriptError("Constant must not be modified.", debugInfo)); + + EmbeddedNamespaceValue::Set(value, overrideFrozen, debugInfo); +} + +void NamespaceBehavior::Register(const Namespace::Ptr& ns, const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) const +{ + ns->SetAttribute(field, std::make_shared(value)); +} + +void NamespaceBehavior::Remove(const Namespace::Ptr& ns, const String& field, bool overrideFrozen) +{ + if (!overrideFrozen) { + auto attr = ns->GetAttribute(field); + + if (dynamic_pointer_cast(attr)) + BOOST_THROW_EXCEPTION(ScriptError("Constants must not be removed.")); + } + + ns->RemoveAttribute(field); +} + +void ConstNamespaceBehavior::Register(const Namespace::Ptr& ns, const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) const +{ + if (m_Frozen && !overrideFrozen) + BOOST_THROW_EXCEPTION(ScriptError("Namespace is read-only and must not be modified.", debugInfo)); + + ns->SetAttribute(field, std::make_shared(value)); +} + +void ConstNamespaceBehavior::Remove(const Namespace::Ptr& ns, const String& field, bool overrideFrozen) +{ + if (m_Frozen && !overrideFrozen) + BOOST_THROW_EXCEPTION(ScriptError("Namespace is read-only and must not be modified.")); + + NamespaceBehavior::Remove(ns, field, overrideFrozen); +} + +void ConstNamespaceBehavior::Freeze() +{ + m_Frozen = true; +} + +Namespace::Iterator Namespace::Begin() +{ + ASSERT(OwnsLock()); + + return m_Data.begin(); +} + +Namespace::Iterator Namespace::End() +{ + ASSERT(OwnsLock()); + + return m_Data.end(); +} + +Namespace::Iterator icinga::begin(const Namespace::Ptr& x) +{ + return x->Begin(); +} + +Namespace::Iterator icinga::end(const Namespace::Ptr& x) +{ + return x->End(); +} + diff --git a/lib/base/namespace.hpp b/lib/base/namespace.hpp new file mode 100644 index 000000000..21ebe929b --- /dev/null +++ b/lib/base/namespace.hpp @@ -0,0 +1,123 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#ifndef NAMESPACE_H +#define NAMESPACE_H + +#include "base/i2-base.hpp" +#include "base/object.hpp" +#include "base/value.hpp" +#include "base/debuginfo.hpp" +#include +#include + +namespace icinga +{ + +struct NamespaceValue +{ + virtual Value Get(const DebugInfo& debugInfo = DebugInfo()) const = 0; + virtual void Set(const Value& value, bool overrideFrozen, const DebugInfo& debugInfo = DebugInfo()) = 0; +}; + +struct EmbeddedNamespaceValue : public NamespaceValue +{ + EmbeddedNamespaceValue(const Value& value); + + Value Get(const DebugInfo& debugInfo) const override; + void Set(const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) override; + +private: + Value m_Value; +}; + +struct ConstEmbeddedNamespaceValue : public EmbeddedNamespaceValue +{ + using EmbeddedNamespaceValue::EmbeddedNamespaceValue; + + void Set(const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) override; +}; + +class Namespace; + +struct NamespaceBehavior +{ + virtual void Register(const boost::intrusive_ptr& ns, const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) const; + virtual void Remove(const boost::intrusive_ptr& ns, const String& field, bool overrideFrozen); +}; + +struct ConstNamespaceBehavior : public NamespaceBehavior +{ + void Register(const boost::intrusive_ptr& ns, const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) const override; + void Remove(const boost::intrusive_ptr& ns, const String& field, bool overrideFrozen) override; + void Freeze(); + +private: + bool m_Frozen; +}; + +/** + * A namespace. + * + * @ingroup base + */ +class Namespace final : public Object +{ +public: + DECLARE_OBJECT(Namespace); + + typedef std::map >::iterator Iterator; + + typedef std::map >::value_type Pair; + + Namespace(NamespaceBehavior *behavior = new NamespaceBehavior); + + Value Get(const String& field) const; + bool Get(const String& field, Value *value) const; + void Set(const String& field, const Value& value, bool overrideFrozen = false); + bool Contains(const String& field) const; + void Remove(const String& field, bool overrideFrozen = false); + + std::shared_ptr GetAttribute(const String& field) const; + void SetAttribute(const String& field, const std::shared_ptr& nsVal); + void RemoveAttribute(const String& field); + + Iterator Begin(); + Iterator End(); + + Value GetFieldByName(const String& field, bool sandboxed, const DebugInfo& debugInfo) const override; + void SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) override; + bool HasOwnField(const String& field) const override; + bool GetOwnField(const String& field, Value *result) const override; + + static Object::Ptr GetPrototype(); + +private: + std::map > m_Data; + std::unique_ptr m_Behavior; +}; + +Namespace::Iterator begin(const Namespace::Ptr& x); +Namespace::Iterator end(const Namespace::Ptr& x); + +} + +extern template class std::map >; + +#endif /* NAMESPACE_H */ diff --git a/lib/base/scriptglobal.cpp b/lib/base/scriptglobal.cpp index 225bb695b..69ccac06e 100644 --- a/lib/base/scriptglobal.cpp +++ b/lib/base/scriptglobal.cpp @@ -26,11 +26,12 @@ #include "base/convert.hpp" #include "base/objectlock.hpp" #include "base/exception.hpp" +#include "base/namespace.hpp" #include using namespace icinga; -Dictionary::Ptr ScriptGlobal::m_Globals = new Dictionary(); +Namespace::Ptr ScriptGlobal::m_Globals = new Namespace(); Value ScriptGlobal::Get(const String& name, const Value *defaultValue) { @@ -46,7 +47,7 @@ Value ScriptGlobal::Get(const String& name, const Value *defaultValue) return result; } -void ScriptGlobal::Set(const String& name, const Value& value) +void ScriptGlobal::Set(const String& name, const Value& value, bool overrideFrozen) { std::vector tokens = name.Split("."); @@ -56,7 +57,7 @@ void ScriptGlobal::Set(const String& name, const Value& value) { ObjectLock olock(m_Globals); - Dictionary::Ptr parent = m_Globals; + Namespace::Ptr parent = m_Globals; for (std::vector::size_type i = 0; i < tokens.size(); i++) { const String& token = tokens[i]; @@ -65,7 +66,7 @@ void ScriptGlobal::Set(const String& name, const Value& value) Value vparent; if (!parent->Get(token, &vparent)) { - Dictionary::Ptr dict = new Dictionary(); + Namespace::Ptr dict = new Namespace(); parent->Set(token, dict); parent = dict; } else { @@ -74,16 +75,21 @@ void ScriptGlobal::Set(const String& name, const Value& value) } } - parent->Set(tokens[tokens.size() - 1], value); + parent->SetFieldByName(tokens[tokens.size() - 1], value, overrideFrozen, DebugInfo()); } } +void ScriptGlobal::SetConst(const String& name, const Value& value) +{ + GetGlobals()->SetAttribute(name, std::make_shared(value)); +} + bool ScriptGlobal::Exists(const String& name) { return m_Globals->Contains(name); } -Dictionary::Ptr ScriptGlobal::GetGlobals() +Namespace::Ptr ScriptGlobal::GetGlobals() { return m_Globals; } @@ -102,8 +108,8 @@ void ScriptGlobal::WriteToFile(const String& filename) StdioStream::Ptr sfp = new StdioStream(&fp, false); ObjectLock olock(m_Globals); - for (const Dictionary::Pair& kv : m_Globals) { - Value value = kv.second; + for (const Namespace::Pair& kv : m_Globals) { + Value value = kv.second->Get(); if (value.IsObject()) value = Convert::ToString(value); diff --git a/lib/base/scriptglobal.hpp b/lib/base/scriptglobal.hpp index e2b5a8f41..562152bb4 100644 --- a/lib/base/scriptglobal.hpp +++ b/lib/base/scriptglobal.hpp @@ -21,7 +21,7 @@ #define SCRIPTGLOBAL_H #include "base/i2-base.hpp" -#include "base/dictionary.hpp" +#include "base/namespace.hpp" namespace icinga { @@ -35,15 +35,16 @@ class ScriptGlobal { public: static Value Get(const String& name, const Value *defaultValue = nullptr); - static void Set(const String& name, const Value& value); + static void Set(const String& name, const Value& value, bool overrideFrozen = false); + static void SetConst(const String& name, const Value& value); static bool Exists(const String& name); static void WriteToFile(const String& filename); - static Dictionary::Ptr GetGlobals(); + static Namespace::Ptr GetGlobals(); private: - static Dictionary::Ptr m_Globals; + static Namespace::Ptr m_Globals; }; } diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index d0c947e6e..befccde5f 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -83,11 +83,11 @@ enum MatchType void ScriptUtils::StaticInitialize() { - ScriptGlobal::Set("MatchAll", MatchAll); - ScriptGlobal::Set("MatchAny", MatchAny); + ScriptGlobal::Set("MatchAll", MatchAll, true); + ScriptGlobal::Set("MatchAny", MatchAny, true); - ScriptGlobal::Set("GlobFile", GlobFile); - ScriptGlobal::Set("GlobDirectory", GlobDirectory); + ScriptGlobal::Set("GlobFile", GlobFile, true); + ScriptGlobal::Set("GlobDirectory", GlobDirectory, true); } String ScriptUtils::CastString(const Value& value) diff --git a/lib/base/serializer.cpp b/lib/base/serializer.cpp index 1bd8b0c8c..82e55983b 100644 --- a/lib/base/serializer.cpp +++ b/lib/base/serializer.cpp @@ -23,6 +23,7 @@ #include "base/objectlock.hpp" #include "base/convert.hpp" #include "base/exception.hpp" +#include "base/namespace.hpp" #include #include @@ -119,6 +120,22 @@ static Dictionary::Ptr SerializeDictionary(const Dictionary::Ptr& input, int att return new Dictionary(std::move(result)); } +static Dictionary::Ptr SerializeNamespace(const Namespace::Ptr& input, int attributeTypes, SerializeStack& stack) +{ + DictionaryData result; + + ObjectLock olock(input); + + for (const Namespace::Pair& kv : input) { + Value val = kv.second->Get(); + stack.Push(kv.first, val); + result.emplace_back(kv.first, Serialize(val, attributeTypes)); + stack.Pop(); + } + + return new Dictionary(std::move(result)); +} + static Object::Ptr SerializeObject(const Object::Ptr& input, int attributeTypes, SerializeStack& stack) { Type::Ptr type = input->GetReflectionType(); @@ -243,6 +260,11 @@ static Value SerializeInternal(const Value& value, int attributeTypes, Serialize if (dict) return SerializeDictionary(dict, attributeTypes, stack); + Namespace::Ptr ns = dynamic_pointer_cast(input); + + if (ns) + return SerializeNamespace(ns, attributeTypes, stack); + return SerializeObject(input, attributeTypes, stack); } diff --git a/lib/base/type.cpp b/lib/base/type.cpp index 138269a87..b8bddd7fb 100644 --- a/lib/base/type.cpp +++ b/lib/base/type.cpp @@ -19,6 +19,7 @@ #include "base/type.hpp" #include "base/scriptglobal.hpp" +#include "base/namespace.hpp" #include "base/objectlock.hpp" using namespace icinga; @@ -39,19 +40,19 @@ String Type::ToString() const void Type::Register(const Type::Ptr& type) { - VERIFY(!GetByName(type->GetName())); - - ScriptGlobal::Set("Types." + type->GetName(), type); + ScriptGlobal::Set("Types." + type->GetName(), type, true); } Type::Ptr Type::GetByName(const String& name) { - Dictionary::Ptr typesNS = ScriptGlobal::Get("Types", &Empty); + Namespace::Ptr typesNS = ScriptGlobal::Get("Types", &Empty); if (!typesNS) return nullptr; - Value ptype = typesNS->Get(name); + Value ptype; + if (!typesNS->Get(name, &ptype)) + return nullptr; if (!ptype.IsObjectType()) return nullptr; @@ -63,14 +64,16 @@ std::vector Type::GetAllTypes() { std::vector types; - Dictionary::Ptr typesNS = ScriptGlobal::Get("Types", &Empty); + Namespace::Ptr typesNS = ScriptGlobal::Get("Types", &Empty); if (typesNS) { ObjectLock olock(typesNS); - for (const Dictionary::Pair& kv : typesNS) { - if (kv.second.IsObjectType()) - types.push_back(kv.second); + for (const Namespace::Pair& kv : typesNS) { + Value value = kv.second->Get(); + + if (value.IsObjectType()) + types.push_back(value); } } diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 497df8a38..889d144d3 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -648,7 +648,7 @@ lterm: T_LIBRARY rterm } | T_CONST T_IDENTIFIER T_SET rterm { - $$ = new SetExpression(MakeIndexer(ScopeGlobal, *$2), OpSetLiteral, std::unique_ptr($4)); + $$ = new SetConstExpression(*$2, std::unique_ptr($4), @$); delete $2; } | T_VAR rterm diff --git a/lib/config/configitembuilder.cpp b/lib/config/configitembuilder.cpp index d81b595d2..392156cae 100644 --- a/lib/config/configitembuilder.cpp +++ b/lib/config/configitembuilder.cpp @@ -31,6 +31,7 @@ ConfigItemBuilder::ConfigItemBuilder(const DebugInfo& debugInfo) void ConfigItemBuilder::SetType(const Type::Ptr& type) { + ASSERT(type); m_Type = type; } diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index af3a7399e..9cfc44a22 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -29,6 +29,7 @@ #include "base/scriptglobal.hpp" #include "base/loader.hpp" #include "base/reference.hpp" +#include "base/namespace.hpp" #include #include @@ -625,6 +626,28 @@ void SetExpression::SetOverrideFrozen() m_OverrideFrozen = true; } +ExpressionResult SetConstExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const +{ + auto globals = ScriptGlobal::GetGlobals(); + + auto attr = globals->GetAttribute(m_Name); + + if (dynamic_pointer_cast(attr)) { + std::ostringstream msgbuf; + msgbuf << "Value for constant '" << m_Name << "' was modified. This behaviour is deprecated.\n"; + ShowCodeLocation(msgbuf, GetDebugInfo(), false); + Log(LogWarning, msgbuf.str()); + } + + ExpressionResult operandres = m_Operand->Evaluate(frame); + CHECK_RESULT(operandres); + Value operand = operandres.GetValue(); + + globals->SetAttribute(m_Name, std::make_shared(operand)); + + return Empty; +} + ExpressionResult ConditionalExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { ExpressionResult condition = m_Condition->Evaluate(frame, dhint); @@ -701,7 +724,16 @@ bool IndexerExpression::GetReference(ScriptFrame& frame, bool init_dict, Value * if (m_Operand1->GetReference(frame, init_dict, &vparent, &vindex, &psdhint)) { if (init_dict) { - Value old_value = VMOps::GetField(vparent, vindex, frame.Sandboxed, m_Operand1->GetDebugInfo()); + Value old_value; + bool has_field = true; + + if (vparent.IsObject()) { + Object::Ptr oparent = vparent; + has_field = oparent->HasOwnField(vindex); + } + + if (has_field) + old_value = VMOps::GetField(vparent, vindex, frame.Sandboxed, m_Operand1->GetDebugInfo()); if (old_value.IsEmpty() && !old_value.IsString()) VMOps::SetField(vparent, vindex, new Dictionary(), m_OverrideFrozen, m_Operand1->GetDebugInfo()); diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index 4a7e9b0c8..865ded4a7 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -637,6 +637,19 @@ private: friend void BindToScope(std::unique_ptr& expr, ScopeSpecifier scopeSpec); }; +class SetConstExpression final : public UnaryExpression +{ +public: + SetConstExpression(const String& name, std::unique_ptr operand, const DebugInfo& debugInfo = DebugInfo()) + : UnaryExpression(std::move(operand), debugInfo), m_Name(name) + { } + +protected: + String m_Name; + + ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; +}; + class SetExpression final : public BinaryExpression { public: diff --git a/lib/config/vmops.hpp b/lib/config/vmops.hpp index 24224af0a..7bfa5628d 100644 --- a/lib/config/vmops.hpp +++ b/lib/config/vmops.hpp @@ -28,6 +28,7 @@ #include "base/debuginfo.hpp" #include "base/array.hpp" #include "base/dictionary.hpp" +#include "base/namespace.hpp" #include "base/function.hpp" #include "base/scriptglobal.hpp" #include "base/exception.hpp" @@ -225,6 +226,26 @@ public: ExpressionResult res = expression->Evaluate(frame); CHECK_RESULT_LOOP(res); } + } else if (value.IsObjectType()) { + if (fvvar.IsEmpty()) + BOOST_THROW_EXCEPTION(ScriptError("Cannot use array iterator for namespace.", debugInfo)); + + Namespace::Ptr ns = value; + std::vector keys; + + { + ObjectLock olock(ns); + for (const Namespace::Pair& kv : ns) { + keys.push_back(kv.first); + } + } + + for (const String& key : keys) { + frame.Locals->Set(fkvar, key); + frame.Locals->Set(fvvar, ns->Get(key)); + ExpressionResult res = expression->Evaluate(frame); + CHECK_RESULT_LOOP(res); + } } else BOOST_THROW_EXCEPTION(ScriptError("Invalid type in for expression: " + value.GetTypeName(), debugInfo)); diff --git a/lib/db_ido/db_ido-itl.conf b/lib/db_ido/db_ido-itl.conf index e6958234a..ca1272a01 100644 --- a/lib/db_ido/db_ido-itl.conf +++ b/lib/db_ido/db_ido-itl.conf @@ -18,10 +18,8 @@ ******************************************************************************/ System.assert(Internal.run_with_activation_context(function() { - var _Internal = Internal.clone() - - template CheckCommand "ido-check-command" use (_Internal) { - execute = _Internal.IdoCheck + template CheckCommand "ido-check-command" use (checkFunc = Internal.IdoCheck) { + execute = checkFunc } object CheckCommand "ido" { diff --git a/lib/db_ido/idochecktask.cpp b/lib/db_ido/idochecktask.cpp index 20fc57d0b..ed87b9e0b 100644 --- a/lib/db_ido/idochecktask.cpp +++ b/lib/db_ido/idochecktask.cpp @@ -32,7 +32,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, IdoCheck, &IdoCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, IdoCheck, &IdoCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void IdoCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/icinga/cib.cpp b/lib/icinga/cib.cpp index e68df57ad..d84dad4c8 100644 --- a/lib/icinga/cib.cpp +++ b/lib/icinga/cib.cpp @@ -268,13 +268,13 @@ std::pair CIB::GetFeatureStats() Dictionary::Ptr status = new Dictionary(); Array::Ptr perfdata = new Array(); - Dictionary::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); + Namespace::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); if (statsFunctions) { ObjectLock olock(statsFunctions); - for (const Dictionary::Pair& kv : statsFunctions) - static_cast(kv.second)->Invoke({ status, perfdata }); + for (const Namespace::Pair& kv : statsFunctions) + static_cast(kv.second->Get())->Invoke({ status, perfdata }); } return std::make_pair(status, perfdata); diff --git a/lib/icinga/icinga-itl.conf b/lib/icinga/icinga-itl.conf index 6fcfaf518..b734a7032 100644 --- a/lib/icinga/icinga-itl.conf +++ b/lib/icinga/icinga-itl.conf @@ -18,10 +18,8 @@ ******************************************************************************/ System.assert(Internal.run_with_activation_context(function() { - var _Internal = Internal.clone() - - template TimePeriod "legacy-timeperiod" use (_Internal) default { - update = _Internal.LegacyTimePeriod + template TimePeriod "legacy-timeperiod" use (LegacyTimePeriod = Internal.LegacyTimePeriod) default { + update = LegacyTimePeriod } })) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 8075d2810..777a1cc10 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -28,7 +28,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, LegacyTimePeriod, &LegacyTimePeriod::ScriptFunc, "tp:begin:end"); +REGISTER_FUNCTION_NONCONST(Internal, LegacyTimePeriod, &LegacyTimePeriod::ScriptFunc, "tp:begin:end"); bool LegacyTimePeriod::IsInTimeRange(tm *begin, tm *end, int stride, tm *reference) { diff --git a/lib/methods/clusterchecktask.cpp b/lib/methods/clusterchecktask.cpp index 3e9bdea21..da51f5343 100644 --- a/lib/methods/clusterchecktask.cpp +++ b/lib/methods/clusterchecktask.cpp @@ -33,7 +33,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, ClusterCheck, &ClusterCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, ClusterCheck, &ClusterCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ClusterCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 2b1badf0c..67ce5f85b 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, ClusterZoneCheck, &ClusterZoneCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, ClusterZoneCheck, &ClusterZoneCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/dummychecktask.cpp b/lib/methods/dummychecktask.cpp index 51cc63480..85985f367 100644 --- a/lib/methods/dummychecktask.cpp +++ b/lib/methods/dummychecktask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, DummyCheck, &DummyCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, DummyCheck, &DummyCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void DummyCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/exceptionchecktask.cpp b/lib/methods/exceptionchecktask.cpp index 3f07c396a..e68a66aa8 100644 --- a/lib/methods/exceptionchecktask.cpp +++ b/lib/methods/exceptionchecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, ExceptionCheck, &ExceptionCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, ExceptionCheck, &ExceptionCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void ExceptionCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index ae263a4dc..0f10739a7 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -34,7 +34,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/methods-itl.conf b/lib/methods/methods-itl.conf index a45439ccd..22d8fff26 100644 --- a/lib/methods/methods-itl.conf +++ b/lib/methods/methods-itl.conf @@ -18,68 +18,58 @@ ******************************************************************************/ System.assert(Internal.run_with_activation_context(function() { - var _Internal = Internal.clone() - - template CheckCommand "icinga-check-command" use (_Internal) { - execute = _Internal.IcingaCheck + template CheckCommand "icinga-check-command" use (IcingaCheck = Internal.IcingaCheck) { + execute = IcingaCheck vars.icinga_min_version = "" } - template CheckCommand "cluster-check-command" use (_Internal) { - execute = _Internal.ClusterCheck + template CheckCommand "cluster-check-command" use (ClusterCheck = Internal.ClusterCheck) { + execute = ClusterCheck } - template CheckCommand "cluster-zone-check-command" use (_Internal) { - execute = _Internal.ClusterZoneCheck + template CheckCommand "cluster-zone-check-command" use (ClusterZoneCheck = Internal.ClusterZoneCheck) { + execute = ClusterZoneCheck } - template CheckCommand "plugin-check-command" use (_Internal) default { - execute = _Internal.PluginCheck + template CheckCommand "plugin-check-command" use (PluginCheck = Internal.PluginCheck) default { + execute = PluginCheck } - template CheckCommand "clr-check-command" use (_Internal) { - if (_Internal.ClrCheck) { - execute = _Internal.ClrCheck - } else { - execute = _Internal.NullCheck - } + template NotificationCommand "plugin-notification-command" use (PluginNotification = Internal.PluginNotification) default { + execute = PluginNotification } - template NotificationCommand "plugin-notification-command" use (_Internal) default { - execute = _Internal.PluginNotification + template EventCommand "plugin-event-command" use (PluginEvent = Internal.PluginEvent) default { + execute = PluginEvent } - template EventCommand "plugin-event-command" use (_Internal) default { - execute = _Internal.PluginEvent + template CheckCommand "dummy-check-command" use (DummyCheck = Internal.DummyCheck) { + execute = DummyCheck } - template CheckCommand "dummy-check-command" use (_Internal) { - execute = _Internal.DummyCheck + template CheckCommand "random-check-command" use (RandomCheck = Internal.RandomCheck) { + execute = RandomCheck } - template CheckCommand "random-check-command" use (_Internal) { - execute = _Internal.RandomCheck + template CheckCommand "exception-check-command" use (ExceptionCheck = Internal.ExceptionCheck) { + execute = ExceptionCheck } - template CheckCommand "exception-check-command" use (_Internal) { - execute = _Internal.ExceptionCheck + template CheckCommand "null-check-command" use (NullCheck = Internal.NullCheck) { + execute = NullCheck } - template CheckCommand "null-check-command" use (_Internal) { - execute = _Internal.NullCheck + template EventCommand "null-event-command" use (NullEvent = Internal.NullEvent) { + execute = NullEvent } - template EventCommand "null-event-command" use (_Internal) { - execute = _Internal.NullEvent + template TimePeriod "empty-timeperiod" use (EmptyTimePeriod = Internal.EmptyTimePeriod) { + update = EmptyTimePeriod } - template TimePeriod "empty-timeperiod" use (_Internal) { - update = _Internal.EmptyTimePeriod - } - - template TimePeriod "even-minutes-timeperiod" use (_Internal) { - update = _Internal.EvenMinutesTimePeriod + template TimePeriod "even-minutes-timeperiod" use (EvenMinutesTimePeriod = Internal.EvenMinutesTimePeriod) { + update = EvenMinutesTimePeriod } })) diff --git a/lib/methods/nullchecktask.cpp b/lib/methods/nullchecktask.cpp index 85ee94444..c141decfe 100644 --- a/lib/methods/nullchecktask.cpp +++ b/lib/methods/nullchecktask.cpp @@ -30,7 +30,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, NullCheck, &NullCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, NullCheck, &NullCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void NullCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/nulleventtask.cpp b/lib/methods/nulleventtask.cpp index 1805e3e9f..e5a80ed76 100644 --- a/lib/methods/nulleventtask.cpp +++ b/lib/methods/nulleventtask.cpp @@ -23,7 +23,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, NullEvent, &NullEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, NullEvent, &NullEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); void NullEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index 402c36e0a..1709583a4 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, PluginCheck, &PluginCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, PluginCheck, &PluginCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void PluginCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index 00b55fb8a..d42db23f3 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -31,7 +31,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, PluginEvent, &PluginEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, PluginEvent, &PluginEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); void PluginEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index e345e2a01..948f2dbed 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -32,7 +32,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:itype:author:comment:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, PluginNotification, &PluginNotificationTask::ScriptFunc, "notification:user:cr:itype:author:comment:resolvedMacros:useResolvedMacros"); void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification, const User::Ptr& user, const CheckResult::Ptr& cr, int itype, diff --git a/lib/methods/randomchecktask.cpp b/lib/methods/randomchecktask.cpp index c228057a5..25b3b593a 100644 --- a/lib/methods/randomchecktask.cpp +++ b/lib/methods/randomchecktask.cpp @@ -29,7 +29,7 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, RandomCheck, &RandomCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); +REGISTER_FUNCTION_NONCONST(Internal, RandomCheck, &RandomCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); void RandomCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) diff --git a/lib/methods/timeperiodtask.cpp b/lib/methods/timeperiodtask.cpp index 9cef126ed..ccd7bc979 100644 --- a/lib/methods/timeperiodtask.cpp +++ b/lib/methods/timeperiodtask.cpp @@ -22,8 +22,8 @@ using namespace icinga; -REGISTER_FUNCTION(Internal, EmptyTimePeriod, &TimePeriodTask::EmptyTimePeriodUpdate, "tp:begin:end"); -REGISTER_FUNCTION(Internal, EvenMinutesTimePeriod, &TimePeriodTask::EvenMinutesTimePeriodUpdate, "tp:begin:end"); +REGISTER_FUNCTION_NONCONST(Internal, EmptyTimePeriod, &TimePeriodTask::EmptyTimePeriodUpdate, "tp:begin:end"); +REGISTER_FUNCTION_NONCONST(Internal, EvenMinutesTimePeriod, &TimePeriodTask::EvenMinutesTimePeriodUpdate, "tp:begin:end"); Array::Ptr TimePeriodTask::EmptyTimePeriodUpdate(const TimePeriod::Ptr& tp, double, double) { diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index 5c5af049d..045cb59d5 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -27,6 +27,7 @@ #include "base/logger.hpp" #include "base/serializer.hpp" #include "base/timer.hpp" +#include "base/namespace.hpp" #include "base/initialize.hpp" #include #include @@ -233,6 +234,15 @@ static void AddSuggestions(std::vector& matches, const String& word, con } } + if (value.IsObjectType()) { + Namespace::Ptr ns = value; + + ObjectLock olock(ns); + for (const Namespace::Pair& kv : ns) { + AddSuggestion(matches, word, prefix + kv.first); + } + } + if (withFields) { Type::Ptr type = value.GetReflectionType(); @@ -275,7 +285,7 @@ std::vector ConsoleHandler::GetAutocompletionSuggestions(const String& w { ObjectLock olock(ScriptGlobal::GetGlobals()); - for (const Dictionary::Pair& kv : ScriptGlobal::GetGlobals()) { + for (const Namespace::Pair& kv : ScriptGlobal::GetGlobals()) { AddSuggestion(matches, word, kv.first); } } diff --git a/lib/remote/jsonrpc.cpp b/lib/remote/jsonrpc.cpp index fa6c3df00..710d184aa 100644 --- a/lib/remote/jsonrpc.cpp +++ b/lib/remote/jsonrpc.cpp @@ -37,7 +37,7 @@ static bool GetDebugJsonRpcCached() debugJsonRpc = false; - Dictionary::Ptr internal = ScriptGlobal::Get("Internal", &Empty); + Namespace::Ptr internal = ScriptGlobal::Get("Internal", &Empty); if (!internal) return false; diff --git a/lib/remote/statushandler.cpp b/lib/remote/statushandler.cpp index b2a9fca10..7ef59ed68 100644 --- a/lib/remote/statushandler.cpp +++ b/lib/remote/statushandler.cpp @@ -22,6 +22,7 @@ #include "remote/filterutility.hpp" #include "base/serializer.hpp" #include "base/statsfunction.hpp" +#include "base/namespace.hpp" using namespace icinga; @@ -35,24 +36,29 @@ public: void FindTargets(const String& type, const std::function& addTarget) const override { - Dictionary::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); + Namespace::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); if (statsFunctions) { ObjectLock olock(statsFunctions); - for (const Dictionary::Pair& kv : statsFunctions) + for (const Namespace::Pair& kv : statsFunctions) addTarget(GetTargetByName("Status", kv.first)); } } Value GetTargetByName(const String& type, const String& name) const override { - Dictionary::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); + Namespace::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty); if (!statsFunctions) BOOST_THROW_EXCEPTION(std::invalid_argument("No status functions are available.")); - Function::Ptr func = statsFunctions->Get(name); + Value vfunc; + + if (!statsFunctions->Get(name, &vfunc)) + BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid status function name.")); + + Function::Ptr func = vfunc; if (!func) BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid status function name.")); diff --git a/lib/remote/variablequeryhandler.cpp b/lib/remote/variablequeryhandler.cpp index 4a36fc8ce..04cc254b9 100644 --- a/lib/remote/variablequeryhandler.cpp +++ b/lib/remote/variablequeryhandler.cpp @@ -24,6 +24,7 @@ #include "base/scriptglobal.hpp" #include "base/logger.hpp" #include "base/serializer.hpp" +#include "base/namespace.hpp" #include using namespace icinga; @@ -48,10 +49,10 @@ public: const std::function& addTarget) const override { { - Dictionary::Ptr globals = ScriptGlobal::GetGlobals(); + Namespace::Ptr globals = ScriptGlobal::GetGlobals(); ObjectLock olock(globals); - for (const Dictionary::Pair& kv : globals) { - addTarget(GetTargetForVar(kv.first, kv.second)); + for (const Namespace::Pair& kv : globals) { + addTarget(GetTargetForVar(kv.first, kv.second->Get())); } } } From 10d6f70a855237e8697de4b5e77b0d95304eb349 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0144/1162] Move constants and functions into different namespaces --- icinga-app/icinga.cpp | 16 ++++++------- lib/base/logger.cpp | 10 ++++---- lib/base/sysloglogger.cpp | 40 ++++++++++++++++---------------- lib/cli/daemonutility.cpp | 6 ++++- lib/db_ido/dbquery.cpp | 30 ++++++++++++------------ lib/icinga/checkresult.cpp | 12 +++++----- lib/icinga/icingaapplication.cpp | 13 ++++++++--- lib/icinga/notification.cpp | 30 ++++++++++++------------ lib/icinga/objectutils.cpp | 22 +++++++++--------- 9 files changed, 95 insertions(+), 84 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 24da88644..5e8cbd8ec 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -300,15 +300,15 @@ static int Main() ScriptGlobal::Set("AttachDebugger", false); - ScriptGlobal::Set("PlatformKernel", Utility::GetPlatformKernel()); - ScriptGlobal::Set("PlatformKernelVersion", Utility::GetPlatformKernelVersion()); - ScriptGlobal::Set("PlatformName", Utility::GetPlatformName()); - ScriptGlobal::Set("PlatformVersion", Utility::GetPlatformVersion()); - ScriptGlobal::Set("PlatformArchitecture", Utility::GetPlatformArchitecture()); + ScriptGlobal::Set("System.PlatformKernel", Utility::GetPlatformKernel(), true); + ScriptGlobal::Set("System.PlatformKernelVersion", Utility::GetPlatformKernelVersion(), true); + ScriptGlobal::Set("System.PlatformName", Utility::GetPlatformName(), true); + ScriptGlobal::Set("System.PlatformVersion", Utility::GetPlatformVersion(), true); + ScriptGlobal::Set("System.PlatformArchitecture", Utility::GetPlatformArchitecture(), true); - ScriptGlobal::Set("BuildHostName", ICINGA_BUILD_HOST_NAME); - ScriptGlobal::Set("BuildCompilerName", ICINGA_BUILD_COMPILER_NAME); - ScriptGlobal::Set("BuildCompilerVersion", ICINGA_BUILD_COMPILER_VERSION); + ScriptGlobal::Set("System.BuildHostName", ICINGA_BUILD_HOST_NAME, true); + ScriptGlobal::Set("System.BuildCompilerName", ICINGA_BUILD_COMPILER_NAME, true); + ScriptGlobal::Set("System.BuildCompilerVersion", ICINGA_BUILD_COMPILER_VERSION, true); if (!autocomplete) Application::SetResourceLimits(); diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index 376296ada..9a59d199f 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -49,11 +49,11 @@ bool Logger::m_TimestampEnabled = true; LogSeverity Logger::m_ConsoleLogSeverity = LogInformation; INITIALIZE_ONCE([]() { - ScriptGlobal::Set("LogDebug", LogDebug); - ScriptGlobal::Set("LogNotice", LogNotice); - ScriptGlobal::Set("LogInformation", LogInformation); - ScriptGlobal::Set("LogWarning", LogWarning); - ScriptGlobal::Set("LogCritical", LogCritical); + ScriptGlobal::Set("System.LogDebug", LogDebug, true); + ScriptGlobal::Set("System.LogNotice", LogNotice, true); + ScriptGlobal::Set("System.LogInformation", LogInformation, true); + ScriptGlobal::Set("System.LogWarning", LogWarning, true); + ScriptGlobal::Set("System.LogCritical", LogCritical, true); }); /** diff --git a/lib/base/sysloglogger.cpp b/lib/base/sysloglogger.cpp index b5d735a80..673a27930 100644 --- a/lib/base/sysloglogger.cpp +++ b/lib/base/sysloglogger.cpp @@ -35,26 +35,26 @@ std::map SyslogLogger::m_FacilityMap; void SyslogLogger::StaticInitialize() { - ScriptGlobal::Set("FacilityAuth", "LOG_AUTH"); - ScriptGlobal::Set("FacilityAuthPriv", "LOG_AUTHPRIV"); - ScriptGlobal::Set("FacilityCron", "LOG_CRON"); - ScriptGlobal::Set("FacilityDaemon", "LOG_DAEMON"); - ScriptGlobal::Set("FacilityFtp", "LOG_FTP"); - ScriptGlobal::Set("FacilityKern", "LOG_KERN"); - ScriptGlobal::Set("FacilityLocal0", "LOG_LOCAL0"); - ScriptGlobal::Set("FacilityLocal1", "LOG_LOCAL1"); - ScriptGlobal::Set("FacilityLocal2", "LOG_LOCAL2"); - ScriptGlobal::Set("FacilityLocal3", "LOG_LOCAL3"); - ScriptGlobal::Set("FacilityLocal4", "LOG_LOCAL4"); - ScriptGlobal::Set("FacilityLocal5", "LOG_LOCAL5"); - ScriptGlobal::Set("FacilityLocal6", "LOG_LOCAL6"); - ScriptGlobal::Set("FacilityLocal7", "LOG_LOCAL7"); - ScriptGlobal::Set("FacilityLpr", "LOG_LPR"); - ScriptGlobal::Set("FacilityMail", "LOG_MAIL"); - ScriptGlobal::Set("FacilityNews", "LOG_NEWS"); - ScriptGlobal::Set("FacilitySyslog", "LOG_SYSLOG"); - ScriptGlobal::Set("FacilityUser", "LOG_USER"); - ScriptGlobal::Set("FacilityUucp", "LOG_UUCP"); + ScriptGlobal::Set("System.FacilityAuth", "LOG_AUTH", true); + ScriptGlobal::Set("System.FacilityAuthPriv", "LOG_AUTHPRIV", true); + ScriptGlobal::Set("System.FacilityCron", "LOG_CRON", true); + ScriptGlobal::Set("System.FacilityDaemon", "LOG_DAEMON", true); + ScriptGlobal::Set("System.FacilityFtp", "LOG_FTP", true); + ScriptGlobal::Set("System.FacilityKern", "LOG_KERN", true); + ScriptGlobal::Set("System.FacilityLocal0", "LOG_LOCAL0", true); + ScriptGlobal::Set("System.FacilityLocal1", "LOG_LOCAL1", true); + ScriptGlobal::Set("System.FacilityLocal2", "LOG_LOCAL2", true); + ScriptGlobal::Set("System.FacilityLocal3", "LOG_LOCAL3", true); + ScriptGlobal::Set("System.FacilityLocal4", "LOG_LOCAL4", true); + ScriptGlobal::Set("System.FacilityLocal5", "LOG_LOCAL5", true); + ScriptGlobal::Set("System.FacilityLocal6", "LOG_LOCAL6", true); + ScriptGlobal::Set("System.FacilityLocal7", "LOG_LOCAL7", true); + ScriptGlobal::Set("System.FacilityLpr", "LOG_LPR", true); + ScriptGlobal::Set("System.FacilityMail", "LOG_MAIL", true); + ScriptGlobal::Set("System.FacilityNews", "LOG_NEWS", true); + ScriptGlobal::Set("System.FacilitySyslog", "LOG_SYSLOG", true); + ScriptGlobal::Set("System.FacilityUser", "LOG_USER", true); + ScriptGlobal::Set("System.FacilityUucp", "LOG_UUCP", true); m_FacilityMap["LOG_AUTH"] = LOG_AUTH; m_FacilityMap["LOG_AUTHPRIV"] = LOG_AUTHPRIV; diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index 62d39c2f4..64d8b17c8 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -145,7 +145,11 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, if (!success) return false; - Type::Ptr appType = Type::GetByName(ScriptGlobal::Get("ApplicationType", &Empty)); + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + Value vAppType; + VERIFY(systemNS->Get("ApplicationType", &vAppType)); + + Type::Ptr appType = Type::GetByName(vAppType); if (ConfigItem::GetItems(appType).empty()) { ConfigItemBuilder builder; diff --git a/lib/db_ido/dbquery.cpp b/lib/db_ido/dbquery.cpp index cd3656c1f..d64904f53 100644 --- a/lib/db_ido/dbquery.cpp +++ b/lib/db_ido/dbquery.cpp @@ -29,22 +29,22 @@ std::map DbQuery::m_CategoryFilterMap; void DbQuery::StaticInitialize() { - ScriptGlobal::Set("DbCatConfig", DbCatConfig); - ScriptGlobal::Set("DbCatState", DbCatState); - ScriptGlobal::Set("DbCatAcknowledgement", DbCatAcknowledgement); - ScriptGlobal::Set("DbCatComment", DbCatComment); - ScriptGlobal::Set("DbCatDowntime", DbCatDowntime); - ScriptGlobal::Set("DbCatEventHandler", DbCatEventHandler); - ScriptGlobal::Set("DbCatExternalCommand", DbCatExternalCommand); - ScriptGlobal::Set("DbCatFlapping", DbCatFlapping); - ScriptGlobal::Set("DbCatCheck", DbCatCheck); - ScriptGlobal::Set("DbCatLog", DbCatLog); - ScriptGlobal::Set("DbCatNotification", DbCatNotification); - ScriptGlobal::Set("DbCatProgramStatus", DbCatProgramStatus); - ScriptGlobal::Set("DbCatRetention", DbCatRetention); - ScriptGlobal::Set("DbCatStateHistory", DbCatStateHistory); + ScriptGlobal::Set("Icinga.DbCatConfig", DbCatConfig, true); + ScriptGlobal::Set("Icinga.DbCatState", DbCatState, true); + ScriptGlobal::Set("Icinga.DbCatAcknowledgement", DbCatAcknowledgement, true); + ScriptGlobal::Set("Icinga.DbCatComment", DbCatComment, true); + ScriptGlobal::Set("Icinga.DbCatDowntime", DbCatDowntime, true); + ScriptGlobal::Set("Icinga.DbCatEventHandler", DbCatEventHandler, true); + ScriptGlobal::Set("Icinga.DbCatExternalCommand", DbCatExternalCommand, true); + ScriptGlobal::Set("Icinga.DbCatFlapping", DbCatFlapping, true); + ScriptGlobal::Set("Icinga.DbCatCheck", DbCatCheck, true); + ScriptGlobal::Set("Icinga.DbCatLog", DbCatLog, true); + ScriptGlobal::Set("Icinga.DbCatNotification", DbCatNotification, true); + ScriptGlobal::Set("Icinga.DbCatProgramStatus", DbCatProgramStatus, true); + ScriptGlobal::Set("Icinga.DbCatRetention", DbCatRetention, true); + ScriptGlobal::Set("Icinga.DbCatStateHistory", DbCatStateHistory, true); - ScriptGlobal::Set("DbCatEverything", DbCatEverything); + ScriptGlobal::Set("Icinga.DbCatEverything", DbCatEverything, true); m_CategoryFilterMap["DbCatConfig"] = DbCatConfig; m_CategoryFilterMap["DbCatState"] = DbCatState; diff --git a/lib/icinga/checkresult.cpp b/lib/icinga/checkresult.cpp index 52b1bb5e3..e1c8d160c 100644 --- a/lib/icinga/checkresult.cpp +++ b/lib/icinga/checkresult.cpp @@ -26,13 +26,13 @@ using namespace icinga; REGISTER_TYPE(CheckResult); INITIALIZE_ONCE([]() { - ScriptGlobal::Set("ServiceOK", ServiceOK); - ScriptGlobal::Set("ServiceWarning", ServiceWarning); - ScriptGlobal::Set("ServiceCritical", ServiceCritical); - ScriptGlobal::Set("ServiceUnknown", ServiceUnknown); + ScriptGlobal::Set("Icinga.ServiceOK", ServiceOK, true); + ScriptGlobal::Set("Icinga.ServiceWarning", ServiceWarning, true); + ScriptGlobal::Set("Icinga.ServiceCritical", ServiceCritical, true); + ScriptGlobal::Set("Icinga.ServiceUnknown", ServiceUnknown, true); - ScriptGlobal::Set("HostUp", HostUp); - ScriptGlobal::Set("HostDown", HostDown); + ScriptGlobal::Set("Icinga.HostUp", HostUp, true); + ScriptGlobal::Set("Icinga.HostDown", HostDown, true); }) double CheckResult::CalculateExecutionTime() const diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 4db75d852..fab5187a6 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -41,7 +41,7 @@ using namespace icinga; static Timer::Ptr l_RetentionTimer; REGISTER_TYPE(IcingaApplication); -INITIALIZE_ONCE(&IcingaApplication::StaticInitialize); +INITIALIZE_ONCE_WITH_PRIORITY(&IcingaApplication::StaticInitialize, 50); void IcingaApplication::StaticInitialize() { @@ -59,9 +59,16 @@ void IcingaApplication::StaticInitialize() ScriptGlobal::Set("NodeName", node_name); - ScriptGlobal::Set("ApplicationType", "IcingaApplication"); + ScriptGlobal::Set("System.ApplicationType", "IcingaApplication", true); - ScriptGlobal::Set("ApplicationVersion", Application::GetAppVersion()); + ScriptGlobal::Set("System.ApplicationVersion", Application::GetAppVersion(), true); + + Namespace::Ptr globalNS = ScriptGlobal::GetGlobals(); + + auto icingaNSBehavior = new ConstNamespaceBehavior(); + icingaNSBehavior->Freeze(); + Namespace::Ptr icingaNS = new Namespace(icingaNSBehavior); + globalNS->SetAttribute("Icinga", std::make_shared(icingaNS)); } REGISTER_STATSFUNCTION(IcingaApplication, &IcingaApplication::StatsFunc); diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index ea3fdc90e..a53c17e12 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -79,22 +79,22 @@ Dictionary::Ptr NotificationNameComposer::ParseName(const String& name) const void Notification::StaticInitialize() { - ScriptGlobal::Set("OK", "OK"); - ScriptGlobal::Set("Warning", "Warning"); - ScriptGlobal::Set("Critical", "Critical"); - ScriptGlobal::Set("Unknown", "Unknown"); - ScriptGlobal::Set("Up", "Up"); - ScriptGlobal::Set("Down", "Down"); + ScriptGlobal::Set("Icinga.OK", "OK", true); + ScriptGlobal::Set("Icinga.Warning", "Warning", true); + ScriptGlobal::Set("Icinga.Critical", "Critical", true); + ScriptGlobal::Set("Icinga.Unknown", "Unknown", true); + ScriptGlobal::Set("Icinga.Up", "Up", true); + ScriptGlobal::Set("Icinga.Down", "Down", true); - ScriptGlobal::Set("DowntimeStart", "DowntimeStart"); - ScriptGlobal::Set("DowntimeEnd", "DowntimeEnd"); - ScriptGlobal::Set("DowntimeRemoved", "DowntimeRemoved"); - ScriptGlobal::Set("Custom", "Custom"); - ScriptGlobal::Set("Acknowledgement", "Acknowledgement"); - ScriptGlobal::Set("Problem", "Problem"); - ScriptGlobal::Set("Recovery", "Recovery"); - ScriptGlobal::Set("FlappingStart", "FlappingStart"); - ScriptGlobal::Set("FlappingEnd", "FlappingEnd"); + ScriptGlobal::Set("Icinga.DowntimeStart", "DowntimeStart", true); + ScriptGlobal::Set("Icinga.DowntimeEnd", "DowntimeEnd", true); + ScriptGlobal::Set("Icinga.DowntimeRemoved", "DowntimeRemoved", true); + ScriptGlobal::Set("Icinga.Custom", "Custom", true); + ScriptGlobal::Set("Icinga.Acknowledgement", "Acknowledgement", true); + ScriptGlobal::Set("Icinga.Problem", "Problem", true); + ScriptGlobal::Set("Icinga.Recovery", "Recovery", true); + ScriptGlobal::Set("Icinga.FlappingStart", "FlappingStart", true); + ScriptGlobal::Set("Icinga.FlappingEnd", "FlappingEnd", true); m_StateFilterMap["OK"] = StateFilterOK; m_StateFilterMap["Warning"] = StateFilterWarning; diff --git a/lib/icinga/objectutils.cpp b/lib/icinga/objectutils.cpp index b8057ef18..0f77502b2 100644 --- a/lib/icinga/objectutils.cpp +++ b/lib/icinga/objectutils.cpp @@ -29,17 +29,17 @@ using namespace icinga; -REGISTER_FUNCTION(System, get_host, &Host::GetByName, "name"); -REGISTER_FUNCTION(System, get_service, &ObjectUtils::GetService, "host:name"); -REGISTER_FUNCTION(System, get_services, &ObjectUtils::GetServices, "host"); -REGISTER_FUNCTION(System, get_user, &User::GetByName, "name"); -REGISTER_FUNCTION(System, get_check_command, &CheckCommand::GetByName, "name"); -REGISTER_FUNCTION(System, get_event_command, &EventCommand::GetByName, "name"); -REGISTER_FUNCTION(System, get_notification_command, &NotificationCommand::GetByName, "name"); -REGISTER_FUNCTION(System, get_host_group, &HostGroup::GetByName, "name"); -REGISTER_FUNCTION(System, get_service_group, &ServiceGroup::GetByName, "name"); -REGISTER_FUNCTION(System, get_user_group, &UserGroup::GetByName, "name"); -REGISTER_FUNCTION(System, get_time_period, &TimePeriod::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_host, &Host::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_service, &ObjectUtils::GetService, "host:name"); +REGISTER_FUNCTION(Icinga, get_services, &ObjectUtils::GetServices, "host"); +REGISTER_FUNCTION(Icinga, get_user, &User::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_check_command, &CheckCommand::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_event_command, &EventCommand::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_notification_command, &NotificationCommand::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_host_group, &HostGroup::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_service_group, &ServiceGroup::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_user_group, &UserGroup::GetByName, "name"); +REGISTER_FUNCTION(Icinga, get_time_period, &TimePeriod::GetByName, "name"); Service::Ptr ObjectUtils::GetService(const Value& host, const String& name) { From 8fda8d72acb5c96565665903a0b6116dff5680ba Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0145/1162] Implement support for the namespace and using keywords --- lib/base/configwriter.cpp | 3 +- lib/base/scriptframe.cpp | 54 ++++++++++++++++------------------- lib/base/scriptframe.hpp | 4 --- lib/config/config_lexer.ll | 3 +- lib/config/config_parser.yy | 23 ++++++++++++--- lib/config/configcompiler.cpp | 9 ++++++ lib/config/configcompiler.hpp | 4 +++ lib/config/expression.cpp | 40 ++++++++++++++------------ lib/config/expression.hpp | 33 +++++++++++---------- lib/config/vmops.hpp | 16 +++++------ lib/remote/consolehandler.cpp | 10 ++----- 11 files changed, 107 insertions(+), 92 deletions(-) diff --git a/lib/base/configwriter.cpp b/lib/base/configwriter.cpp index 58851c2cf..a085be915 100644 --- a/lib/base/configwriter.cpp +++ b/lib/base/configwriter.cpp @@ -239,7 +239,8 @@ const std::vector& ConfigWriter::GetKeywords() keywords.emplace_back("globals"); keywords.emplace_back("locals"); keywords.emplace_back("use"); - keywords.emplace_back("__using"); + keywords.emplace_back("using"); + keywords.emplace_back("namespace"); keywords.emplace_back("default"); keywords.emplace_back("ignore_on_error"); keywords.emplace_back("current_filename"); diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index 65597a783..01f871ec4 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -19,27 +19,41 @@ #include "base/scriptframe.hpp" #include "base/scriptglobal.hpp" +#include "base/namespace.hpp" #include "base/exception.hpp" using namespace icinga; boost::thread_specific_ptr > ScriptFrame::m_ScriptFrames; -Array::Ptr ScriptFrame::m_Imports; + +static auto l_InternalNSBehavior = new ConstNamespaceBehavior(); INITIALIZE_ONCE_WITH_PRIORITY([]() { - Dictionary::Ptr systemNS = new Dictionary(); - ScriptGlobal::Set("System", systemNS); - ScriptFrame::AddImport(systemNS); + Namespace::Ptr globalNS = ScriptGlobal::GetGlobals(); - Dictionary::Ptr typesNS = new Dictionary(); - ScriptGlobal::Set("Types", typesNS); - ScriptFrame::AddImport(typesNS); + auto systemNSBehavior = new ConstNamespaceBehavior(); + systemNSBehavior->Freeze(); + Namespace::Ptr systemNS = new Namespace(systemNSBehavior); + globalNS->SetAttribute("System", std::make_shared(systemNS)); - Dictionary::Ptr deprecatedNS = new Dictionary(); - ScriptGlobal::Set("Deprecated", deprecatedNS); - ScriptFrame::AddImport(deprecatedNS); + auto typesNSBehavior = new ConstNamespaceBehavior(); + typesNSBehavior->Freeze(); + Namespace::Ptr typesNS = new Namespace(typesNSBehavior); + globalNS->SetAttribute("Types", std::make_shared(typesNS)); + + auto statsNSBehavior = new ConstNamespaceBehavior(); + statsNSBehavior->Freeze(); + Namespace::Ptr statsNS = new Namespace(statsNSBehavior); + globalNS->SetAttribute("StatsFunctions", std::make_shared(statsNS)); + + Namespace::Ptr internalNS = new Namespace(l_InternalNSBehavior); + globalNS->SetAttribute("Internal", std::make_shared(internalNS)); }, 50); +INITIALIZE_ONCE_WITH_PRIORITY([]() { + l_InternalNSBehavior->Freeze(); +}, 0); + ScriptFrame::ScriptFrame(bool allocLocals) : Locals(allocLocals ? new Dictionary() : nullptr), Self(ScriptGlobal::GetGlobals()), Sandboxed(false), Depth(0) { @@ -120,23 +134,3 @@ void ScriptFrame::PushFrame(ScriptFrame *frame) frames->push(frame); } - -Array::Ptr ScriptFrame::GetImports() -{ - return m_Imports; -} - -void ScriptFrame::AddImport(const Object::Ptr& import) -{ - Array::Ptr imports; - - if (!m_Imports) - imports = new Array(); - else - imports = m_Imports->ShallowClone(); - - imports->Add(import); - - m_Imports = imports; -} - diff --git a/lib/base/scriptframe.hpp b/lib/base/scriptframe.hpp index 16a6592f5..56ff4f922 100644 --- a/lib/base/scriptframe.hpp +++ b/lib/base/scriptframe.hpp @@ -45,12 +45,8 @@ struct ScriptFrame static ScriptFrame *GetCurrentFrame(); - static Array::Ptr GetImports(); - static void AddImport(const Object::Ptr& import); - private: static boost::thread_specific_ptr > m_ScriptFrames; - static Array::Ptr m_Imports; static void PushFrame(ScriptFrame *frame); static ScriptFrame *PopFrame(); diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index 6a2d84027..899280ff7 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -180,7 +180,7 @@ this return T_THIS; globals return T_GLOBALS; locals return T_LOCALS; use return T_USE; -__using return T_USING; +using return T_USING; apply return T_APPLY; default return T_DEFAULT; to return T_TO; @@ -203,6 +203,7 @@ ignore_on_error return T_IGNORE_ON_ERROR; current_filename return T_CURRENT_FILENAME; current_line return T_CURRENT_LINE; debugger return T_DEBUGGER; +namespace return T_NAMESPACE; =\> return T_FOLLOWS; \<\< return T_SHIFT_LEFT; \>\> return T_SHIFT_RIGHT; diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 889d144d3..5db8f5598 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -149,8 +149,9 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig %token T_CURRENT_FILENAME "current_filename (T_CURRENT_FILENAME)" %token T_CURRENT_LINE "current_line (T_CURRENT_LINE)" %token T_DEBUGGER "debugger (T_DEBUGGER)" +%token T_NAMESPACE "namespace (T_NAMESPACE)" %token T_USE "use (T_USE)" -%token T_USING "__using (T_USING)" +%token T_USING "using (T_USING)" %token T_OBJECT "object (T_OBJECT)" %token T_TEMPLATE "template (T_TEMPLATE)" %token T_INCLUDE "include (T_INCLUDE)" @@ -602,9 +603,23 @@ lterm: T_LIBRARY rterm { $$ = new BreakpointExpression(@$); } + | T_NAMESPACE rterm + { + BeginFlowControlBlock(context, FlowControlReturn, false); + } + rterm_scope_require_side_effect + { + EndFlowControlBlock(context); + + std::unique_ptr expr{$2}; + BindToScope(expr, ScopeGlobal); + $$ = new SetExpression(std::move(expr), OpSetLiteral, std::unique_ptr(new NamespaceExpression(std::unique_ptr($4), @$)), @$); + } | T_USING rterm { - $$ = new UsingExpression(std::unique_ptr($2), @$); + std::shared_ptr expr{$2}; + context->AddImport(expr); + $$ = MakeLiteralRaw(); } | apply | object @@ -879,7 +894,7 @@ rterm_no_side_effect_no_dict: T_STRING } | T_IDENTIFIER { - $$ = new VariableExpression(*$1, @1); + $$ = new VariableExpression(*$1, context->GetImports(), @1); delete $1; } | T_MULTIPLY rterm %prec DEREF_OP @@ -1105,7 +1120,7 @@ use_specifier_items: use_specifier_item use_specifier_item: identifier { - $$ = new std::pair >(*$1, std::unique_ptr(new VariableExpression(*$1, @1))); + $$ = new std::pair >(*$1, std::unique_ptr(new VariableExpression(*$1, context->GetImports(), @1))); delete $1; } | identifier T_SET rterm diff --git a/lib/config/configcompiler.cpp b/lib/config/configcompiler.cpp index f8b754bb9..05db34e02 100644 --- a/lib/config/configcompiler.cpp +++ b/lib/config/configcompiler.cpp @@ -361,3 +361,12 @@ bool ConfigCompiler::IsAbsolutePath(const String& path) #endif /* _WIN32 */ } +void ConfigCompiler::AddImport(const std::shared_ptr& import) +{ + m_Imports.push_back(import); +} + +std::vector > ConfigCompiler::GetImports() const +{ + return m_Imports; +} diff --git a/lib/config/configcompiler.hpp b/lib/config/configcompiler.hpp index d4a03681e..4bbc5c083 100644 --- a/lib/config/configcompiler.hpp +++ b/lib/config/configcompiler.hpp @@ -109,6 +109,9 @@ public: void SetPackage(const String& package); String GetPackage() const; + void AddImport(const std::shared_ptr& import); + std::vector > GetImports() const; + static void CollectIncludes(std::vector >& expressions, const String& file, const String& zone, const String& package); @@ -134,6 +137,7 @@ private: std::istream *m_Input; String m_Zone; String m_Package; + std::vector > m_Imports; void *m_Scanner; diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 9cfc44a22..7600b130e 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -117,6 +117,14 @@ const DebugInfo& DebuggableExpression::GetDebugInfo() const return m_DebugInfo; } +VariableExpression::VariableExpression(String variable, std::vector > imports, const DebugInfo& debugInfo) + : DebuggableExpression(debugInfo), m_Variable(std::move(variable)), m_Imports(std::move(imports)) +{ + m_Imports.push_back(MakeIndexer(ScopeGlobal, "System")); + m_Imports.push_back(MakeIndexer(ScopeGlobal, "Types")); + m_Imports.push_back(MakeIndexer(ScopeGlobal, "Icinga")); +} + ExpressionResult VariableExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { Value value; @@ -125,7 +133,7 @@ ExpressionResult VariableExpression::DoEvaluate(ScriptFrame& frame, DebugHint *d return value; else if (frame.Self.IsObject() && frame.Locals != frame.Self.Get() && frame.Self.Get()->GetOwnField(m_Variable, &value)) return value; - else if (VMOps::FindVarImport(frame, m_Variable, &value, m_DebugInfo)) + else if (VMOps::FindVarImport(frame, m_Imports, m_Variable, &value, m_DebugInfo)) return value; else return ScriptGlobal::Get(m_Variable); @@ -145,7 +153,7 @@ bool VariableExpression::GetReference(ScriptFrame& frame, bool init_dict, Value if (dhint && *dhint) *dhint = new DebugHint((*dhint)->GetChild(m_Variable)); - } else if (VMOps::FindVarImportRef(frame, m_Variable, parent, m_DebugInfo)) { + } else if (VMOps::FindVarImportRef(frame, m_Imports, m_Variable, parent, m_DebugInfo)) { return true; } else if (ScriptGlobal::Exists(m_Variable)) { *parent = ScriptGlobal::GetGlobals(); @@ -883,6 +891,17 @@ ExpressionResult ApplyExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhin m_Package, m_FKVar, m_FVVar, m_FTerm, m_ClosedVars, m_IgnoreOnError, m_Expression, m_DebugInfo); } +ExpressionResult NamespaceExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const +{ + Namespace::Ptr ns = new Namespace(new ConstNamespaceBehavior()); + + ScriptFrame innerFrame(true, ns); + ExpressionResult result = m_Expression->Evaluate(innerFrame); + CHECK_RESULT(result); + + return ns; +} + ExpressionResult ObjectExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { if (frame.Sandboxed) @@ -1006,23 +1025,6 @@ ExpressionResult BreakpointExpression::DoEvaluate(ScriptFrame& frame, DebugHint return Empty; } -ExpressionResult UsingExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const -{ - if (frame.Sandboxed) - BOOST_THROW_EXCEPTION(ScriptError("Using directives are not allowed in sandbox mode.", m_DebugInfo)); - - ExpressionResult importres = m_Name->Evaluate(frame); - CHECK_RESULT(importres); - Value import = importres.GetValue(); - - if (!import.IsObjectType()) - BOOST_THROW_EXCEPTION(ScriptError("The parameter must resolve to an object of type 'Dictionary'", m_DebugInfo)); - - ScriptFrame::AddImport(import); - - return Empty; -} - ExpressionResult TryExceptExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const { try { diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index 865ded4a7..c0fab4096 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -305,9 +305,7 @@ protected: class VariableExpression final : public DebuggableExpression { public: - VariableExpression(String variable, const DebugInfo& debugInfo = DebugInfo()) - : DebuggableExpression(debugInfo), m_Variable(std::move(variable)) - { } + VariableExpression(String variable, std::vector > imports, const DebugInfo& debugInfo = DebugInfo()); String GetVariable() const { @@ -320,6 +318,7 @@ protected: private: String m_Variable; + std::vector > m_Imports; friend void BindToScope(std::unique_ptr& expr, ScopeSpecifier scopeSpec); }; @@ -856,6 +855,20 @@ private: std::shared_ptr m_Expression; }; +class NamespaceExpression final : public DebuggableExpression +{ +public: + NamespaceExpression(std::unique_ptr expression, const DebugInfo& debugInfo = DebugInfo()) + : DebuggableExpression(debugInfo), m_Expression(std::move(expression)) + { } + +protected: + ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; + +private: + std::shared_ptr m_Expression; +}; + class ObjectExpression final : public DebuggableExpression { public: @@ -952,20 +965,6 @@ protected: ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; }; -class UsingExpression final : public DebuggableExpression -{ -public: - UsingExpression(std::unique_ptr name, const DebugInfo& debugInfo = DebugInfo()) - : DebuggableExpression(debugInfo), m_Name(std::move(name)) - { } - -protected: - ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override; - -private: - std::unique_ptr m_Name; -}; - class TryExceptExpression final : public DebuggableExpression { public: diff --git a/lib/config/vmops.hpp b/lib/config/vmops.hpp index 7bfa5628d..38f8507a7 100644 --- a/lib/config/vmops.hpp +++ b/lib/config/vmops.hpp @@ -43,15 +43,13 @@ namespace icinga class VMOps { public: - static inline bool FindVarImportRef(ScriptFrame& frame, const String& name, Value *result, const DebugInfo& debugInfo = DebugInfo()) + static inline bool FindVarImportRef(ScriptFrame& frame, const std::vector >& imports, const String& name, Value *result, const DebugInfo& debugInfo = DebugInfo()) { - Array::Ptr imports = ScriptFrame::GetImports(); - - ObjectLock olock(imports); - for (const Value& import : imports) { - Object::Ptr obj = import; + for (const auto& import : imports) { + ExpressionResult res = import->Evaluate(frame); + Object::Ptr obj = res.GetValue(); if (obj->HasOwnField(name)) { - *result = import; + *result = obj; return true; } } @@ -59,11 +57,11 @@ public: return false; } - static inline bool FindVarImport(ScriptFrame& frame, const String& name, Value *result, const DebugInfo& debugInfo = DebugInfo()) + static inline bool FindVarImport(ScriptFrame& frame, const std::vector >& imports, const String& name, Value *result, const DebugInfo& debugInfo = DebugInfo()) { Value parent; - if (FindVarImportRef(frame, name, &parent, debugInfo)) { + if (FindVarImportRef(frame, imports, name, &parent, debugInfo)) { *result = GetField(parent, name, frame.Sandboxed, debugInfo); return true; } diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index 045cb59d5..aff47a9a9 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -290,13 +290,9 @@ std::vector ConsoleHandler::GetAutocompletionSuggestions(const String& w } } - { - Array::Ptr imports = ScriptFrame::GetImports(); - ObjectLock olock(imports); - for (const Value& import : imports) { - AddSuggestions(matches, word, "", false, import); - } - } + AddSuggestions(matches, word, "", false, ScriptGlobal::Get("System")); + AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Types")); + AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Icinga")); String::SizeType cperiod = word.RFind("."); From 1a0311a49ff3d508d7735d6708f0d0c4b5f9c27f Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 7 Aug 2018 13:55:41 +0200 Subject: [PATCH 0146/1162] Implement namespace support for the keys() function --- lib/base/scriptutils.cpp | 22 +++++++++++++++++----- lib/base/scriptutils.hpp | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index befccde5f..4aa0b3bcd 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -30,6 +30,7 @@ #include "base/application.hpp" #include "base/dependencygraph.hpp" #include "base/initialize.hpp" +#include "base/namespace.hpp" #include #include #include @@ -83,11 +84,11 @@ enum MatchType void ScriptUtils::StaticInitialize() { - ScriptGlobal::Set("MatchAll", MatchAll, true); - ScriptGlobal::Set("MatchAny", MatchAny, true); + ScriptGlobal::Set("System.MatchAll", MatchAll, true); + ScriptGlobal::Set("System.MatchAny", MatchAny, true); - ScriptGlobal::Set("GlobFile", GlobFile, true); - ScriptGlobal::Set("GlobDirectory", GlobDirectory, true); + ScriptGlobal::Set("System.GlobFile", GlobFile, true); + ScriptGlobal::Set("System.GlobDirectory", GlobDirectory, true); } String ScriptUtils::CastString(const Value& value) @@ -397,10 +398,12 @@ Type::Ptr ScriptUtils::TypeOf(const Value& value) return value.GetReflectionType(); } -Array::Ptr ScriptUtils::Keys(const Dictionary::Ptr& obj) +Array::Ptr ScriptUtils::Keys(const Object::Ptr& obj) { ArrayData result; + Dictionary::Ptr dict = dynamic_pointer_cast(obj); + if (dict) { ObjectLock olock(dict); for (const Dictionary::Pair& kv : dict) { @@ -408,6 +411,15 @@ Array::Ptr ScriptUtils::Keys(const Dictionary::Ptr& obj) } } + Namespace::Ptr ns = dynamic_pointer_cast(obj); + + if (ns) { + ObjectLock olock(ns); + for (const Namespace::Pair& kv : ns) { + result.push_back(kv.first); + } + } + return new Array(std::move(result)); } diff --git a/lib/base/scriptutils.hpp b/lib/base/scriptutils.hpp index 9515b381e..fcb80f6e4 100644 --- a/lib/base/scriptutils.hpp +++ b/lib/base/scriptutils.hpp @@ -49,7 +49,7 @@ public: static void Log(const std::vector& arguments); static Array::Ptr Range(const std::vector& arguments); static Type::Ptr TypeOf(const Value& value); - static Array::Ptr Keys(const Dictionary::Ptr& dict); + static Array::Ptr Keys(const Object::Ptr& obj); static ConfigObject::Ptr GetObject(const Value& type, const String& name); static Array::Ptr GetObjects(const Type::Ptr& type); static void Assert(const Value& arg); From e44848a664be9cde4649c061aa77a971379ee7bb Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 13 Aug 2018 14:07:24 +0200 Subject: [PATCH 0147/1162] Remove #include for deprecated header file --- test/base-object-packer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/base-object-packer.cpp b/test/base-object-packer.cpp index b453d6901..62a09e72c 100644 --- a/test/base-object-packer.cpp +++ b/test/base-object-packer.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include using namespace icinga; From e678fa1aa57b079ccc75dfac4086b48bcf809b11 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 9 Aug 2018 15:37:23 +0200 Subject: [PATCH 0148/1162] Refactor Application::*Const() --- doc/17-language-reference.md | 1 + icinga-app/icinga.cpp | 122 ++++----- lib/base/CMakeLists.txt | 2 + lib/base/application.cpp | 102 +++---- lib/base/application.hpp | 6 +- lib/base/configobject.cpp | 2 +- lib/base/configuration.cpp | 370 ++++++++++++++++++++++++++ lib/base/configuration.hpp | 169 ++++++++++++ lib/base/configuration.ti | 176 ++++++++++++ lib/base/scriptframe.cpp | 3 + lib/base/socketevents.cpp | 4 +- lib/base/tlsutility.cpp | 2 +- lib/cli/apisetuputility.cpp | 6 +- lib/cli/daemoncommand.cpp | 12 +- lib/cli/daemonutility.cpp | 8 +- lib/cli/featureutility.cpp | 4 +- lib/cli/nodesetupcommand.cpp | 4 +- lib/cli/nodeutility.cpp | 10 +- lib/cli/nodewizardcommand.cpp | 6 +- lib/cli/objectlistcommand.cpp | 4 +- lib/cli/troubleshootcommand.cpp | 52 ++-- lib/cli/variablegetcommand.cpp | 2 +- lib/cli/variablelistcommand.cpp | 2 +- lib/cli/variableutility.cpp | 4 +- lib/compat/checkresultreader.ti | 2 +- lib/compat/compatlogger.ti | 2 +- lib/compat/externalcommandlistener.ti | 2 +- lib/compat/statusdatawriter.cpp | 2 +- lib/compat/statusdatawriter.ti | 4 +- lib/config/configitem.cpp | 6 +- lib/config/expression.cpp | 1 + lib/icinga/icingaapplication.cpp | 4 +- lib/livestatus/livestatuslistener.ti | 4 +- lib/perfdata/perfdatawriter.ti | 8 +- lib/remote/apilistener-filesync.cpp | 6 +- lib/remote/apilistener.cpp | 12 +- lib/remote/apilistener.ti | 4 +- lib/remote/configpackageutility.cpp | 2 +- lib/remote/consolehandler.cpp | 5 +- lib/remote/jsonrpcconnection.cpp | 2 +- 40 files changed, 910 insertions(+), 229 deletions(-) create mode 100644 lib/base/configuration.cpp create mode 100644 lib/base/configuration.hpp create mode 100644 lib/base/configuration.ti diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 0e48a6c25..4de8afbfd 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -232,6 +232,7 @@ The `using` keyword only has an effect for the current file and only for code th The following namespaces are automatically imported as if by using the `using` keyword: * System +* System.Configuration * Types * Icinga diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 5e8cbd8ec..a2bf8001c 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -23,6 +23,7 @@ #include "config/configitembuilder.hpp" #include "config/expression.hpp" #include "base/application.hpp" +#include "base/configuration.hpp" #include "base/logger.hpp" #include "base/timer.hpp" #include "base/utility.hpp" @@ -101,7 +102,7 @@ static void HandleLegacyDefines() String dataPrefix = Utility::GetIcingaDataPath(); #endif /* _WIN32 */ - Value localStateDir = Application::GetConst("LocalStateDir"); + Value localStateDir = Configuration::LocalStateDir; if (!localStateDir.IsEmpty()) { Log(LogWarning, "icinga-app") @@ -110,51 +111,51 @@ static void HandleLegacyDefines() << " For compatibility reasons, these are now set based on the 'LocalStateDir' constant."; #ifdef _WIN32 - ScriptGlobal::Set("DataDir", localStateDir + "\\lib\\icinga2"); - ScriptGlobal::Set("LogDir", localStateDir + "\\log\\icinga2"); - ScriptGlobal::Set("CacheDir", localStateDir + "\\cache\\icinga2"); - ScriptGlobal::Set("SpoolDir", localStateDir + "\\spool\\icinga2"); + Configuration::DataDir = localStateDir + "\\lib\\icinga2"; + Configuration::LogDir = localStateDir + "\\log\\icinga2"; + Configuration::CacheDir = localStateDir + "\\cache\\icinga2"; + Configuration::SpoolDir = localStateDir + "\\spool\\icinga2"; } else { - ScriptGlobal::Set("LocalStateDir", dataPrefix + "\\var"); + Configuration::LocalStateDir = dataPrefix + "\\var"; #else /* _WIN32 */ - ScriptGlobal::Set("DataDir", localStateDir + "/lib/icinga2"); - ScriptGlobal::Set("LogDir", localStateDir + "/log/icinga2"); - ScriptGlobal::Set("CacheDir", localStateDir + "/cache/icinga2"); - ScriptGlobal::Set("SpoolDir", localStateDir + "/spool/icinga2"); + Configuration::DataDir = localStateDir + "/lib/icinga2"; + Configuration::LogDir = localStateDir + "/log/icinga2"; + Configuration::CacheDir = localStateDir + "/cache/icinga2"; + Configuration::SpoolDir = localStateDir + "/spool/icinga2"; } else { - ScriptGlobal::Set("LocalStateDir", ICINGA_LOCALSTATEDIR); + Configuration::LocalStateDir = ICINGA_LOCALSTATEDIR; #endif /* _WIN32 */ } - Value sysconfDir = Application::GetConst("SysconfDir"); + Value sysconfDir = Configuration::SysconfDir; if (!sysconfDir.IsEmpty()) { Log(LogWarning, "icinga-app") << "Please do not set the deprecated 'Sysconfdir' constant, use the 'ConfigDir' constant instead! For compatibility reasons, their value is set based on the 'SysconfDir' constant."; #ifdef _WIN32 - ScriptGlobal::Set("ConfigDir", sysconfDir + "\\icinga2"); + Configuration::ConfigDir = sysconfDir + "\\icinga2"; } else { - ScriptGlobal::Set("SysconfDir", dataPrefix + "\\etc"); + Configuration::SysconfDir = dataPrefix + "\\etc"; #else /* _WIN32 */ - ScriptGlobal::Set("ConfigDir", sysconfDir + "/icinga2"); + Configuration::ConfigDir = sysconfDir + "/icinga2"; } else { - ScriptGlobal::Set("SysconfDir", ICINGA_SYSCONFDIR); + Configuration::SysconfDir = ICINGA_SYSCONFDIR; #endif /* _WIN32 */ } - Value runDir = Application::GetConst("RunDir"); + Value runDir = Configuration::RunDir; if (!runDir.IsEmpty()) { Log(LogWarning, "icinga-app") << "Please do not set the deprecated 'RunDir' constant, use the 'InitRunDir' constant instead! For compatiblity reasons, their value is set based on the 'RunDir' constant."; #ifdef _WIN32 - ScriptGlobal::Set("InitRunDir", runDir + "\\icinga2"); + Configuration::InitRunDir = runDir + "\\icinga2"; } else { - ScriptGlobal::Set("RunDir", dataPrefix + "\\var\\run"); + Configuration::RunDir = dataPrefix + "\\var\\run"; #else /* _WIN32 */ - ScriptGlobal::Set("InitRunDir", runDir + "/icinga2"); + Configuration::InitRunDir = runDir + "/icinga2"; } else { - ScriptGlobal::Set("RunDir", ICINGA_RUNDIR); + Configuration::RunDir = ICINGA_RUNDIR; #endif /* _WIN32 */ } } @@ -199,43 +200,43 @@ static int Main() String dataPrefix = Utility::GetIcingaDataPath(); if (!binaryPrefix.IsEmpty() && !dataPrefix.IsEmpty()) { - Application::DeclareConst("PrefixDir", binaryPrefix); - Application::DeclareConst("ProgramData", dataPrefix); + Configuration::PrefixDir = binaryPrefix; + Configuration::ProgramData = dataPrefix; - Application::DeclareConst("ConfigDir", dataPrefix + "\\etc\\icinga2"); + Configuration::ConfigDir = dataPrefix + "\\etc\\icinga2"; - Application::DeclareConst("DataDir", dataPrefix + "\\var\\lib\\icinga2"); - Application::DeclareConst("LogDir", dataPrefix + "\\var\\log\\icinga2"); - Application::DeclareConst("CacheDir", dataPrefix + "\\var\\cache\\icinga2"); - Application::DeclareConst("SpoolDir", dataPrefix + "\\var\\spool\\icinga2"); + Configuration::DataDir = dataPrefix + "\\var\\lib\\icinga2"; + Configuration::LogDir = dataPrefix + "\\var\\log\\icinga2"; + Configuration::CacheDir = dataPrefix + "\\var\\cache\\icinga2"; + Configuration::SpoolDir = dataPrefix + "\\var\\spool\\icinga2"; /* Internal constants. */ - Application::DeclareConst("PkgDataDir", binaryPrefix + "\\share\\icinga2"); - Application::DeclareConst("IncludeConfDir", binaryPrefix + "\\share\\icinga2\\include"); + Configuration::PkgDataDir = binaryPrefix + "\\share\\icinga2"; + Configuration::IncludeConfDir = binaryPrefix + "\\share\\icinga2\\include"; } else { Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths."); #endif /* _WIN32 */ - Application::DeclareConst("ConfigDir", ICINGA_CONFIGDIR); + Configuration::ConfigDir = ICINGA_CONFIGDIR; - Application::DeclareConst("DataDir", ICINGA_DATADIR); - Application::DeclareConst("LogDir", ICINGA_LOGDIR); - Application::DeclareConst("CacheDir", ICINGA_CACHEDIR); - Application::DeclareConst("SpoolDir", ICINGA_SPOOLDIR); + Configuration::DataDir = ICINGA_DATADIR; + Configuration::LogDir = ICINGA_LOGDIR; + Configuration::CacheDir = ICINGA_CACHEDIR; + Configuration::SpoolDir = ICINGA_SPOOLDIR; - Application::DeclareConst("PrefixDir", ICINGA_PREFIX); + Configuration::PrefixDir = ICINGA_PREFIX; /* Internal constants. */ - Application::DeclareConst("PkgDataDir", ICINGA_PKGDATADIR); - Application::DeclareConst("IncludeConfDir", ICINGA_INCLUDECONFDIR); + Configuration::PkgDataDir = ICINGA_PKGDATADIR; + Configuration::IncludeConfDir = ICINGA_INCLUDECONFDIR; - Application::DeclareConst("InitRunDir", ICINGA_INITRUNDIR); + Configuration::InitRunDir = ICINGA_INITRUNDIR; #ifdef _WIN32 } #endif /* _WIN32 */ - Application::DeclareConst("ZonesDir", Application::GetConst("ConfigDir") + "/zones.d"); + Configuration::ZonesDir = Configuration::ConfigDir + "/zones.d"; String icingaUser = Utility::GetFromEnvironment("ICINGA2_USER"); if (icingaUser.IsEmpty()) @@ -245,17 +246,17 @@ static int Main() if (icingaGroup.IsEmpty()) icingaGroup = ICINGA_GROUP; - Application::DeclareConst("RunAsUser", icingaUser); - Application::DeclareConst("RunAsGroup", icingaGroup); + Configuration::RunAsUser = icingaUser; + Configuration::RunAsGroup = icingaGroup; if (!autocomplete) { #ifdef RLIMIT_NOFILE String rLimitFiles = Utility::GetFromEnvironment("ICINGA2_RLIMIT_FILES"); if (rLimitFiles.IsEmpty()) - Application::DeclareConst("RLimitFiles", Application::GetDefaultRLimitFiles()); + Configuration::RLimitFiles = Application::GetDefaultRLimitFiles(); else { try { - Application::DeclareConst("RLimitFiles", Convert::ToLong(rLimitFiles)); + Configuration::RLimitFiles = Convert::ToLong(rLimitFiles); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_FILES\": " << ex.what() << '\n'; @@ -267,10 +268,10 @@ static int Main() #ifdef RLIMIT_NPROC String rLimitProcesses = Utility::GetFromEnvironment("ICINGA2_RLIMIT_PROCESSES"); if (rLimitProcesses.IsEmpty()) - Application::DeclareConst("RLimitProcesses", Application::GetDefaultRLimitProcesses()); + Configuration::RLimitProcesses = Application::GetDefaultRLimitProcesses(); else { try { - Application::DeclareConst("RLimitProcesses", Convert::ToLong(rLimitProcesses)); + Configuration::RLimitProcesses = Convert::ToLong(rLimitProcesses); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_PROCESSES\": " << ex.what() << '\n'; @@ -282,10 +283,10 @@ static int Main() #ifdef RLIMIT_STACK String rLimitStack = Utility::GetFromEnvironment("ICINGA2_RLIMIT_STACK"); if (rLimitStack.IsEmpty()) - Application::DeclareConst("RLimitStack", Application::GetDefaultRLimitStack()); + Configuration::RLimitStack = Application::GetDefaultRLimitStack(); else { try { - Application::DeclareConst("RLimitStack", Convert::ToLong(rLimitStack)); + Configuration::RLimitStack = Convert::ToLong(rLimitStack); } catch (const std::invalid_argument& ex) { std::cout << "Error setting \"ICINGA2_RLIMIT_STACK\": " << ex.what() << '\n'; @@ -295,10 +296,9 @@ static int Main() #endif /* RLIMIT_STACK */ } - Application::DeclareConst("Concurrency", std::thread::hardware_concurrency()); - Application::DeclareConst("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks()); + ScriptGlobal::Set("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks()); - ScriptGlobal::Set("AttachDebugger", false); + ScriptGlobal::Set("Environment", "production"); ScriptGlobal::Set("System.PlatformKernel", Utility::GetPlatformKernel(), true); ScriptGlobal::Set("System.PlatformKernelVersion", Utility::GetPlatformKernelVersion(), true); @@ -360,7 +360,7 @@ static int Main() std::ifstream userFile; /* The implicit string assignment is needed for Windows builds. */ - String configDir = Application::GetConst("ConfigDir"); + String configDir = Configuration::ConfigDir; userFile.open(configDir + "/user"); if (userFile && command && !Application::IsProcessElevated()) { @@ -462,19 +462,21 @@ static int Main() } } + Configuration::SetReadOnly(true); + /* Ensure that all defined constants work in the way we expect them. */ HandleLegacyDefines(); if (vm.count("script-debugger")) Application::SetScriptDebuggerEnabled(true); - Application::DeclareConst("StatePath", Application::GetConst("DataDir") + "/icinga2.state"); - Application::DeclareConst("ModAttrPath", Application::GetConst("DataDir") + "/modified-attributes.conf"); - Application::DeclareConst("ObjectsPath", Application::GetConst("CacheDir") + "/icinga2.debug"); - Application::DeclareConst("VarsPath", Application::GetConst("CacheDir") + "/icinga2.vars"); - Application::DeclareConst("PidPath", Application::GetConst("InitRunDir") + "/icinga2.pid"); + Configuration::StatePath = Configuration::DataDir + "/icinga2.state"; + Configuration::ModAttrPath = Configuration::DataDir + "/modified-attributes.conf"; + Configuration::ObjectsPath = Configuration::CacheDir + "/icinga2.debug"; + Configuration::VarsPath = Configuration::CacheDir + "/icinga2.vars"; + Configuration::PidPath = Configuration::InitRunDir + "/icinga2.pid"; - ConfigCompiler::AddIncludeSearchDir(Application::GetConst("IncludeConfDir")); + ConfigCompiler::AddIncludeSearchDir(Configuration::IncludeConfDir); if (!autocomplete && vm.count("include")) { for (const String& includePath : vm["include"].as >()) { @@ -584,8 +586,8 @@ static int Main() return 0; } } else if (command && command->GetImpersonationLevel() == ImpersonateIcinga) { - String group = Application::GetConst("RunAsGroup"); - String user = Application::GetConst("RunAsUser"); + String group = Configuration::RunAsGroup; + String user = Configuration::RunAsUser; errno = 0; struct group *gr = getgrnam(group.CStr()); diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 3cdc08556..9988d8e70 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -17,6 +17,7 @@ mkclass_target(application.ti application-ti.cpp application-ti.hpp) mkclass_target(configobject.ti configobject-ti.cpp configobject-ti.hpp) +mkclass_target(configuration.ti configuration-ti.cpp configuration-ti.hpp) mkclass_target(datetime.ti datetime-ti.cpp datetime-ti.hpp) mkclass_target(filelogger.ti filelogger-ti.cpp filelogger-ti.hpp) mkclass_target(function.ti function-ti.cpp function-ti.hpp) @@ -33,6 +34,7 @@ set(base_SOURCES boolean.cpp boolean.hpp boolean-script.cpp configobject.cpp configobject.hpp configobject-ti.hpp configobject-script.cpp configtype.cpp configtype.hpp + configuration.cpp configuration.hpp configuration-ti.hpp configwriter.cpp configwriter.hpp console.cpp console.hpp context.cpp context.hpp diff --git a/lib/base/application.cpp b/lib/base/application.cpp index bc8ec1bd4..5fa49a7ba 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -168,7 +168,7 @@ void Application::SetResourceLimits() rlimit rl; # ifdef RLIMIT_NOFILE - rlim_t fileLimit = GetConst("RLimitFiles"); + rlim_t fileLimit = Configuration::RLimitFiles; if (fileLimit != 0) { if (fileLimit < GetDefaultRLimitFiles()) { @@ -189,7 +189,7 @@ void Application::SetResourceLimits() } # ifdef RLIMIT_NPROC - rlim_t processLimit = GetConst("RLimitProcesses"); + rlim_t processLimit = Configuration::RLimitProcesses; if (processLimit != 0) { if (processLimit < GetDefaultRLimitProcesses()) { @@ -228,7 +228,7 @@ void Application::SetResourceLimits() rlim_t stackLimit; - stackLimit = GetConst("RLimitStack"); + stackLimit = Configuration::RLimitStack; if (stackLimit != 0) { if (stackLimit < GetDefaultRLimitStack()) { @@ -549,30 +549,32 @@ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion) << " Kernel version: " << Utility::GetPlatformKernelVersion() << "\n" << " Architecture: " << Utility::GetPlatformArchitecture() << "\n"; + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + os << "\nBuild information:\n" - << " Compiler: " << ScriptGlobal::Get("BuildCompilerName") << " " << ScriptGlobal::Get("BuildCompilerVersion") << "\n" - << " Build host: " << ScriptGlobal::Get("BuildHostName") << "\n"; + << " Compiler: " << systemNS->Get("BuildCompilerName") << " " << systemNS->Get("BuildCompilerVersion") << "\n" + << " Build host: " << systemNS->Get("BuildHostName") << "\n"; os << "\nApplication information:\n" << "\nGeneral paths:\n" - << " Config directory: " << GetConst("ConfigDir") << "\n" - << " Data directory: " << GetConst("DataDir") << "\n" - << " Log directory: " << GetConst("LogDir") << "\n" - << " Cache directory: " << GetConst("CacheDir") << "\n" - << " Spool directory: " << GetConst("SpoolDir") << "\n" - << " Run directory: " << GetConst("InitRunDir") << "\n" + << " Config directory: " << Configuration::ConfigDir << "\n" + << " Data directory: " << Configuration::DataDir << "\n" + << " Log directory: " << Configuration::LogDir << "\n" + << " Cache directory: " << Configuration::CacheDir << "\n" + << " Spool directory: " << Configuration::SpoolDir << "\n" + << " Run directory: " << Configuration::InitRunDir << "\n" << "\nOld paths (deprecated):\n" - << " Installation root: " << GetConst("PrefixDir") << "\n" - << " Sysconf directory: " << GetConst("SysconfDir") << "\n" - << " Run directory (base): " << GetConst("RunDir") << "\n" - << " Local state directory: " << GetConst("LocalStateDir") << "\n" + << " Installation root: " << Configuration::PrefixDir << "\n" + << " Sysconf directory: " << Configuration::SysconfDir << "\n" + << " Run directory (base): " << Configuration::RunDir << "\n" + << " Local state directory: " << Configuration::LocalStateDir << "\n" << "\nInternal paths:\n" - << " Package data directory: " << GetConst("PkgDataDir") << "\n" - << " State path: " << GetConst("StatePath") << "\n" - << " Modified attributes path: " << GetConst("ModAttrPath") << "\n" - << " Objects path: " << GetConst("ObjectsPath") << "\n" - << " Vars path: " << GetConst("VarsPath") << "\n" - << " PID path: " << GetConst("PidPath") << "\n"; + << " Package data directory: " << Configuration::PkgDataDir << "\n" + << " State path: " << Configuration::StatePath << "\n" + << " Modified attributes path: " << Configuration::ModAttrPath << "\n" + << " Objects path: " << Configuration::ObjectsPath << "\n" + << " Vars path: " << Configuration::VarsPath << "\n" + << " PID path: " << Configuration::PidPath << "\n"; } @@ -590,7 +592,7 @@ void Application::DisplayBugMessage(std::ostream& os) String Application::GetCrashReportFilename() { - return GetConst("LogDir") + "/crash/report." + Convert::ToString(Utility::GetTime()); + return Configuration::LogDir + "/crash/report." + Convert::ToString(Utility::GetTime()); } @@ -740,7 +742,7 @@ void Application::SigUsr2Handler(int) */ Application::Ptr instance = GetInstance(); try { - instance->UpdatePidFile(GetConst("PidPath"), m_ReloadProcess); + instance->UpdatePidFile(Configuration::PidPath, m_ReloadProcess); } catch (const std::exception&) { /* abort restart */ Log(LogCritical, "Application", "Cannot update PID file. Aborting restart operation."); @@ -783,7 +785,7 @@ void Application::SigAbrtHandler(int) } } - bool interactive_debugger = Convert::ToBool(ScriptGlobal::Get("AttachDebugger")); + bool interactive_debugger = Configuration::AttachDebugger; if (!interactive_debugger) { std::ofstream ofs; @@ -893,7 +895,7 @@ void Application::ExceptionHandler() } } - bool interactive_debugger = Convert::ToBool(ScriptGlobal::Get("AttachDebugger")); + bool interactive_debugger = Configuration::AttachDebugger; if (!interactive_debugger) { std::ofstream ofs; @@ -1012,10 +1014,10 @@ int Application::Run() #endif /* _WIN32 */ try { - UpdatePidFile(GetConst("PidPath")); + UpdatePidFile(Configuration::PidPath); } catch (const std::exception&) { Log(LogCritical, "Application") - << "Cannot update PID file '" << GetConst("PidPath") << "'. Aborting."; + << "Cannot update PID file '" << Configuration::PidPath << "'. Aborting."; return EXIT_FAILURE; } @@ -1097,7 +1099,7 @@ void Application::ClosePidFile(bool unlink) if (m_PidFile) { if (unlink) { - String pidpath = GetConst("PidPath"); + String pidpath = Configuration::PidPath; ::unlink(pidpath.CStr()); } @@ -1165,39 +1167,6 @@ pid_t Application::ReadPidFile(const String& filename) return runningpid; } -/** - * Declares a const with ScriptGlobal - * - * @param name The const name. - * @param value The new value. - */ -void Application::DeclareConst(const String& name, const Value& value) -{ - if (!ScriptGlobal::Exists(name)) - ScriptGlobal::Set(name, value); -} - -/** - * Returns the value of a const from ScriptGlobal - * - * @param name The const name. - */ -Value Application::GetConst(const String& name) -{ - return GetConst(name, Empty); -} - -/** - * Returns the value of a const from ScriptGlobal with default value - * - * @param name The const name. - * @param def The default value. - */ -Value Application::GetConst(const String& name, Value defaultValue) -{ - return ScriptGlobal::Get(name, &defaultValue); -} - int Application::GetDefaultRLimitFiles() { return 16 * 1024; @@ -1213,17 +1182,6 @@ int Application::GetDefaultRLimitStack() return 256 * 1024; } -/** - * Retrieves the concurrency level. - * - * @returns The concurrency level. - */ -int Application::GetConcurrency() -{ - Value defaultConcurrency = std::thread::hardware_concurrency(); - return ScriptGlobal::Get("Concurrency", &defaultConcurrency); -} - /** * Sets the max concurrent checks. * diff --git a/lib/base/application.hpp b/lib/base/application.hpp index 88fc51ab6..72a76b6ea 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -23,6 +23,7 @@ #include "base/i2-base.hpp" #include "base/application-ti.hpp" #include "base/logger.hpp" +#include "base/configuration.hpp" #include namespace icinga @@ -85,10 +86,6 @@ public: static String GetExePath(const String& argv0); - static void DeclareConst(const String& name, const Value& value); - static Value GetConst(const String& name); - static Value GetConst(const String& name, Value defaultValue); - #ifdef _WIN32 static bool IsProcessElevated(); #endif /* _WIN32 */ @@ -97,7 +94,6 @@ public: static int GetDefaultRLimitProcesses(); static int GetDefaultRLimitStack(); - static int GetConcurrency(); static int GetMaxConcurrentChecks(); static int GetDefaultMaxConcurrentChecks(); static void SetMaxConcurrentChecks(int maxChecks); diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index 6aedfaca6..b95a57818 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -571,7 +571,7 @@ void ConfigObject::RestoreObjects(const String& filename, int attributeTypes) unsigned long restored = 0; - WorkQueue upq(25000, Application::GetConcurrency()); + WorkQueue upq(25000, Configuration::Concurrency); upq.SetName("ConfigObject::RestoreObjects"); String message; diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp new file mode 100644 index 000000000..31f691265 --- /dev/null +++ b/lib/base/configuration.cpp @@ -0,0 +1,370 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/configuration.hpp" +#include "base/configuration-ti.cpp" +#include "base/exception.hpp" + +using namespace icinga; + +REGISTER_TYPE(Configuration); + +String Configuration::ApiBindHost; +String Configuration::ApiBindPort{"5665"}; +bool Configuration::AttachDebugger{false}; +String Configuration::CacheDir; +int Configuration::Concurrency{static_cast(std::thread::hardware_concurrency())}; +String Configuration::ConfigDir; +String Configuration::DataDir; +String Configuration::EventEngine; +String Configuration::IncludeConfDir; +String Configuration::InitRunDir; +String Configuration::LogDir; +String Configuration::ModAttrPath; +String Configuration::ObjectsPath; +String Configuration::PidPath; +String Configuration::PkgDataDir; +String Configuration::PrefixDir; +String Configuration::ProgramData; +int Configuration::RLimitFiles; +int Configuration::RLimitProcesses; +int Configuration::RLimitStack; +String Configuration::RunAsGroup; +String Configuration::RunAsUser; +String Configuration::SpoolDir; +String Configuration::StatePath; +String Configuration::VarsPath; +String Configuration::ZonesDir; + +/* deprecated */ +String Configuration::LocalStateDir; +String Configuration::RunDir; +String Configuration::SysconfDir; + +/* internal */ +bool Configuration::m_ReadOnly{false}; + +template +void HandleUserWrite(const String& name, T *target, const T& value, bool readOnly) +{ + if (readOnly) + BOOST_THROW_EXCEPTION(ScriptError("Configuration attribute '" + name + "' is read-only.")); + + *target = value; +} + +String Configuration::GetApiBindHost() const +{ + return Configuration::ApiBindHost; +} + +void Configuration::SetApiBindHost(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ApiBindHost", &Configuration::ApiBindHost, val, m_ReadOnly); +} + +String Configuration::GetApiBindPort() const +{ + return Configuration::ApiBindPort; +} + +void Configuration::SetApiBindPort(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ApiBindPort", &Configuration::ApiBindPort, val, m_ReadOnly); +} + +bool Configuration::GetAttachDebugger() const +{ + return Configuration::AttachDebugger; +} + +void Configuration::SetAttachDebugger(bool val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("AttachDebugger", &Configuration::AttachDebugger, val, m_ReadOnly); +} + +String Configuration::GetCacheDir() const +{ + return Configuration::CacheDir; +} + +void Configuration::SetCacheDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("CacheDir", &Configuration::CacheDir, val, m_ReadOnly); +} + +int Configuration::GetConcurrency() const +{ + return Configuration::Concurrency; +} + +void Configuration::SetConcurrency(int val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("Concurrency", &Configuration::Concurrency, val, m_ReadOnly); +} + +String Configuration::GetConfigDir() const +{ + return Configuration::ConfigDir; +} + +void Configuration::SetConfigDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ConfigDir", &Configuration::ConfigDir, val, m_ReadOnly); +} + +String Configuration::GetDataDir() const +{ + return Configuration::DataDir; +} + +void Configuration::SetDataDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("DataDir", &Configuration::DataDir, val, m_ReadOnly); +} + +String Configuration::GetEventEngine() const +{ + return Configuration::EventEngine; +} + +void Configuration::SetEventEngine(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("EventEngine", &Configuration::EventEngine, val, m_ReadOnly); +} + +String Configuration::GetIncludeConfDir() const +{ + return Configuration::IncludeConfDir; +} + +void Configuration::SetIncludeConfDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("IncludeConfDir", &Configuration::IncludeConfDir, val, m_ReadOnly); +} + +String Configuration::GetInitRunDir() const +{ + return Configuration::InitRunDir; +} + +void Configuration::SetInitRunDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("InitRunDir", &Configuration::InitRunDir, val, m_ReadOnly); +} + +String Configuration::GetLogDir() const +{ + return Configuration::LogDir; +} + +void Configuration::SetLogDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("LogDir", &Configuration::LogDir, val, m_ReadOnly); +} + +String Configuration::GetModAttrPath() const +{ + return Configuration::ModAttrPath; +} + +void Configuration::SetModAttrPath(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ModAttrPath", &Configuration::ModAttrPath, val, m_ReadOnly); +} + +String Configuration::GetObjectsPath() const +{ + return Configuration::ObjectsPath; +} + +void Configuration::SetObjectsPath(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ObjectsPath", &Configuration::ObjectsPath, val, m_ReadOnly); +} + +String Configuration::GetPidPath() const +{ + return Configuration::PidPath; +} + +void Configuration::SetPidPath(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("PidPath", &Configuration::PidPath, val, m_ReadOnly); +} + +String Configuration::GetPkgDataDir() const +{ + return Configuration::PkgDataDir; +} + +void Configuration::SetPkgDataDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("PkgDataDir", &Configuration::PkgDataDir, val, m_ReadOnly); +} + +String Configuration::GetPrefixDir() const +{ + return Configuration::PrefixDir; +} + +void Configuration::SetPrefixDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("PrefixDir", &Configuration::PrefixDir, val, m_ReadOnly); +} + +String Configuration::GetProgramData() const +{ + return Configuration::ProgramData; +} + +void Configuration::SetProgramData(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ProgramData", &Configuration::ProgramData, val, m_ReadOnly); +} + +int Configuration::GetRLimitFiles() const +{ + return Configuration::RLimitFiles; +} + +void Configuration::SetRLimitFiles(int val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RLimitFiles", &Configuration::RLimitFiles, val, m_ReadOnly); +} + +int Configuration::GetRLimitProcesses() const +{ + return RLimitProcesses; +} + +void Configuration::SetRLimitProcesses(int val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RLimitProcesses", &Configuration::RLimitProcesses, val, m_ReadOnly); +} + +int Configuration::GetRLimitStack() const +{ + return Configuration::RLimitStack; +} + +void Configuration::SetRLimitStack(int val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RLimitStack", &Configuration::RLimitStack, val, m_ReadOnly); +} + +String Configuration::GetRunAsGroup() const +{ + return Configuration::RunAsGroup; +} + +void Configuration::SetRunAsGroup(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RunAsGroup", &Configuration::RunAsGroup, val, m_ReadOnly); +} + +String Configuration::GetRunAsUser() const +{ + return Configuration::RunAsUser; +} + +void Configuration::SetRunAsUser(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RunAsUser", &Configuration::RunAsUser, val, m_ReadOnly); +} + +String Configuration::GetSpoolDir() const +{ + return Configuration::SpoolDir; +} + +void Configuration::SetSpoolDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("SpoolDir", &Configuration::SpoolDir, val, m_ReadOnly); +} + +String Configuration::GetStatePath() const +{ + return Configuration::StatePath; +} + +void Configuration::SetStatePath(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("StatePath", &Configuration::StatePath, val, m_ReadOnly); +} + +String Configuration::GetVarsPath() const +{ + return Configuration::VarsPath; +} + +void Configuration::SetVarsPath(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("VarsPath", &Configuration::VarsPath, val, m_ReadOnly); +} + +String Configuration::GetZonesDir() const +{ + return Configuration::ZonesDir; +} + +void Configuration::SetZonesDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ZonesDir", &Configuration::ZonesDir, val, m_ReadOnly); +} + +String Configuration::GetLocalStateDir() const +{ + return Configuration::LocalStateDir; +} + +void Configuration::SetLocalStateDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("LocalStateDir", &Configuration::LocalStateDir, val, m_ReadOnly); +} + +String Configuration::GetSysconfDir() const +{ + return Configuration::SysconfDir; +} + +void Configuration::SetSysconfDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("SysconfDir", &Configuration::SysconfDir, val, m_ReadOnly); +} + +String Configuration::GetRunDir() const +{ + return Configuration::RunDir; +} + +void Configuration::SetRunDir(const String& val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("RunDir", &Configuration::RunDir, val, m_ReadOnly); +} + +bool Configuration::GetReadOnly() +{ + return m_ReadOnly; +} + +void Configuration::SetReadOnly(bool readOnly) +{ + m_ReadOnly = readOnly; +} diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp new file mode 100644 index 000000000..02a516b87 --- /dev/null +++ b/lib/base/configuration.hpp @@ -0,0 +1,169 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#ifndef CONFIGURATION_H +#define CONFIGURATION_H + +#include "base/i2-base.hpp" +#include "base/configuration-ti.hpp" + +namespace icinga +{ + +/** + * Global configuration. + * + * @ingroup base + */ +class Configuration : public ObjectImpl +{ +public: + DECLARE_OBJECT(Configuration); + + String GetApiBindHost() const override; + void SetApiBindHost(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetApiBindPort() const override; + void SetApiBindPort(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + bool GetAttachDebugger() const override; + void SetAttachDebugger(bool value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetCacheDir() const override; + void SetCacheDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + int GetConcurrency() const override; + void SetConcurrency(int value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetConfigDir() const override; + void SetConfigDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetDataDir() const override; + void SetDataDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetEventEngine() const override; + void SetEventEngine(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetIncludeConfDir() const override; + void SetIncludeConfDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetInitRunDir() const override; + void SetInitRunDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetLogDir() const override; + void SetLogDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetModAttrPath() const override; + void SetModAttrPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetObjectsPath() const override; + void SetObjectsPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetPidPath() const override; + void SetPidPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetPkgDataDir() const override; + void SetPkgDataDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetPrefixDir() const override; + void SetPrefixDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetProgramData() const override; + void SetProgramData(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + int GetRLimitFiles() const override; + void SetRLimitFiles(int value, bool suppress_events = false, const Value& cookie = Empty) override; + + int GetRLimitProcesses() const override; + void SetRLimitProcesses(int value, bool suppress_events = false, const Value& cookie = Empty) override; + + int GetRLimitStack() const override; + void SetRLimitStack(int value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetRunAsGroup() const override; + void SetRunAsGroup(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetRunAsUser() const override; + void SetRunAsUser(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetSpoolDir() const override; + void SetSpoolDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetStatePath() const override; + void SetStatePath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetVarsPath() const override; + void SetVarsPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetZonesDir() const override; + void SetZonesDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + /* deprecated */ + String GetLocalStateDir() const override; + void SetLocalStateDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetSysconfDir() const override; + void SetSysconfDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + String GetRunDir() const override; + void SetRunDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + + static bool GetReadOnly(); + static void SetReadOnly(bool readOnly); + + static String ApiBindHost; + static String ApiBindPort; + static bool AttachDebugger; + static String CacheDir; + static int Concurrency; + static String ConfigDir; + static String DataDir; + static String EventEngine; + static String IncludeConfDir; + static String InitRunDir; + static String LogDir; + static String ModAttrPath; + static String ObjectsPath; + static String PidPath; + static String PkgDataDir; + static String PrefixDir; + static String ProgramData; + static int RLimitFiles; + static int RLimitProcesses; + static int RLimitStack; + static String RunAsGroup; + static String RunAsUser; + static String SpoolDir; + static String StatePath; + static String VarsPath; + static String ZonesDir; + + /* deprecated */ + static String LocalStateDir; + static String RunDir; + static String SysconfDir; + +private: + static bool m_ReadOnly; + +}; + +} + +#endif /* CONFIGURATION_H */ diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti new file mode 100644 index 000000000..abcba7d55 --- /dev/null +++ b/lib/base/configuration.ti @@ -0,0 +1,176 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +#include "base/configobject.hpp" + +library base; + +namespace icinga +{ + +abstract class Configuration +{ + [config, no_storage, virtual] String ApiBindHost { + get; + set; + }; + + [config, no_storage, virtual] String ApiBindPort { + get; + set; + }; + + [config, no_storage, virtual] bool AttachDebugger { + get; + set; + }; + + [config, no_storage, virtual] String CacheDir { + get; + set; + }; + + [config, no_storage, virtual] int Concurrency { + get; + set; + }; + + [config, no_storage, virtual] String ConfigDir { + get; + set; + }; + + [config, no_storage, virtual] String DataDir { + get; + set; + }; + + [config, no_storage, virtual] String EventEngine { + get; + set; + }; + + [config, no_storage, virtual] String IncludeConfDir { + get; + set; + }; + + [config, no_storage, virtual] String InitRunDir { + get; + set; + }; + + [config, no_storage, virtual] String LogDir { + get; + set; + }; + + [config, no_storage, virtual] String ModAttrPath { + get; + set; + }; + + [config, no_storage, virtual] String ObjectsPath { + get; + set; + }; + + [config, no_storage, virtual] String PidPath { + get; + set; + }; + + [config, no_storage, virtual] String PkgDataDir { + get; + set; + }; + + [config, no_storage, virtual] String PrefixDir { + get; + set; + }; + + [config, no_storage, virtual] String ProgramData { + get; + set; + }; + + [config, no_storage, virtual] int RLimitFiles { + get; + set; + }; + + [config, no_storage, virtual] int RLimitProcesses { + get; + set; + }; + + [config, no_storage, virtual] int RLimitStack { + get; + set; + }; + + [config, no_storage, virtual] String RunAsGroup { + get; + set; + }; + + [config, no_storage, virtual] String RunAsUser { + get; + set; + }; + + [config, no_storage, virtual] String SpoolDir { + get; + set; + }; + + [config, no_storage, virtual] String StatePath { + get; + set; + }; + + [config, no_storage, virtual] String VarsPath { + get; + set; + }; + + [config, no_storage, virtual] String ZonesDir { + get; + set; + }; + + /* deprecated */ + [config, no_storage, virtual] String LocalStateDir { + get; + set; + }; + + [config, no_storage, virtual] String RunDir { + get; + set; + }; + + [config, no_storage, virtual] String SysconfDir { + get; + set; + }; +}; + +} diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index 01f871ec4..90407613e 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -21,6 +21,7 @@ #include "base/scriptglobal.hpp" #include "base/namespace.hpp" #include "base/exception.hpp" +#include "base/configuration.hpp" using namespace icinga; @@ -36,6 +37,8 @@ INITIALIZE_ONCE_WITH_PRIORITY([]() { Namespace::Ptr systemNS = new Namespace(systemNSBehavior); globalNS->SetAttribute("System", std::make_shared(systemNS)); + systemNS->SetAttribute("Configuration", std::make_shared(new Configuration())); + auto typesNSBehavior = new ConstNamespaceBehavior(); typesNSBehavior->Freeze(); Namespace::Ptr typesNS = new Namespace(typesNSBehavior); diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index e54ca0e6f..b967a345f 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -79,7 +79,7 @@ void SocketEventEngine::WakeUpThread(int sid, bool wait) void SocketEvents::InitializeEngine() { - String eventEngine = ScriptGlobal::Get("EventEngine", &Empty); + String eventEngine = Configuration::EventEngine; if (eventEngine.IsEmpty()) #ifdef __linux__ @@ -105,7 +105,7 @@ void SocketEvents::InitializeEngine() l_SocketIOEngine->Start(); - ScriptGlobal::Set("EventEngine", eventEngine); + Configuration::EventEngine = eventEngine; } /** diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index 42fc92921..66abf2b86 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -535,7 +535,7 @@ std::shared_ptr CreateCert(EVP_PKEY *pubkey, X509_NAME *subject, X509_NAME String GetIcingaCADir() { - return Application::GetConst("DataDir") + "/ca"; + return Configuration::DataDir + "/ca"; } std::shared_ptr CreateCertIcingaCA(EVP_PKEY *pubkey, X509_NAME *subject) diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index a7739227c..640a878c9 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -40,7 +40,7 @@ using namespace icinga; String ApiSetupUtility::GetConfdPath() { - return Application::GetConst("ConfigDir") + "/conf.d"; + return Configuration::ConfigDir + "/conf.d"; } String ApiSetupUtility::GetApiUsersConfPath() @@ -80,8 +80,8 @@ bool ApiSetupUtility::SetupMasterCertificates(const String& cn) String pki_path = ApiListener::GetCertsDir(); Utility::MkDirP(pki_path, 0700); - String user = ScriptGlobal::Get("RunAsUser"); - String group = ScriptGlobal::Get("RunAsGroup"); + String user = Configuration::RunAsUser; + String group = Configuration::RunAsGroup; if (!Utility::SetFileOwnership(pki_path, user, group)) { Log(LogWarning, "cli") diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index ba20eb823..0cf7d3b91 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -72,7 +72,7 @@ static bool Daemonize() do { Utility::Sleep(0.1); - readpid = Application::ReadPidFile(Application::GetConst("PidPath")); + readpid = Application::ReadPidFile(Configuration::PidPath); ret = waitpid(pid, &status, WNOHANG); } while (readpid != pid && ret == 0); @@ -193,7 +193,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector 0) { Log(LogCritical, "cli") << "Another instance of Icinga already running with PID " << runningpid; @@ -206,7 +206,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector >(); else if (!vm.count("no-config")) { /* The implicit string assignment is needed for Windows builds. */ - String configDir = Application::GetConst("ConfigDir"); + String configDir = Configuration::ConfigDir; configs.push_back(configDir + "/icinga2.conf"); } @@ -214,7 +214,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector newItems; - if (!DaemonUtility::LoadConfigFiles(configs, newItems, Application::GetConst("ObjectsPath"), Application::GetConst("VarsPath"))) + if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath)) return EXIT_FAILURE; if (vm.count("validate")) { @@ -256,7 +256,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector& configs, * unfortunately moving it there is somewhat non-trivial. */ success = true; - String zonesEtcDir = Application::GetConst("ZonesDir"); + String zonesEtcDir = Configuration::ZonesDir; if (!zonesEtcDir.IsEmpty() && Utility::PathExists(zonesEtcDir)) Utility::Glob(zonesEtcDir + "/*", std::bind(&IncludeZoneDirRecursive, _1, "_etc", std::ref(success)), GlobDirectory); @@ -130,7 +130,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, /* Load package config files - they may contain additional zones which * are authoritative on this node and are checked in HasZoneConfigAuthority(). */ - String packagesVarDir = Application::GetConst("DataDir") + "/api/packages"; + String packagesVarDir = Configuration::DataDir + "/api/packages"; if (Utility::PathExists(packagesVarDir)) Utility::Glob(packagesVarDir + "/*", std::bind(&IncludePackage, _1, std::ref(success)), GlobDirectory); @@ -138,7 +138,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, return false; /* Load cluster synchronized configuration files */ - String zonesVarDir = Application::GetConst("DataDir") + "/api/zones"; + String zonesVarDir = Configuration::DataDir + "/api/zones"; if (Utility::PathExists(zonesVarDir)) Utility::Glob(zonesVarDir + "/*", std::bind(&IncludeNonLocalZone, _1, "_cluster", std::ref(success)), GlobDirectory); @@ -174,7 +174,7 @@ bool DaemonUtility::LoadConfigFiles(const std::vector& configs, return false; } - WorkQueue upq(25000, Application::GetConcurrency()); + WorkQueue upq(25000, Configuration::Concurrency); upq.SetName("DaemonUtility::LoadConfigFiles"); bool result = ConfigItem::CommitItems(ascope.GetContext(), upq, newItems); diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index e01834c70..74c7a75bd 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -31,12 +31,12 @@ using namespace icinga; String FeatureUtility::GetFeaturesAvailablePath() { - return Application::GetConst("ConfigDir") + "/features-available"; + return Configuration::ConfigDir + "/features-available"; } String FeatureUtility::GetFeaturesEnabledPath() { - return Application::GetConst("ConfigDir") + "/features-enabled"; + return Configuration::ConfigDir + "/features-enabled"; } std::vector FeatureUtility::GetFieldCompletionSuggestions(const String& word, bool enable) diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index 652f70f28..86581e6ea 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -353,8 +353,8 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm, String certsDir = ApiListener::GetCertsDir(); Utility::MkDirP(certsDir, 0700); - String user = ScriptGlobal::Get("RunAsUser"); - String group = ScriptGlobal::Get("RunAsGroup"); + String user = Configuration::RunAsUser; + String group = Configuration::RunAsGroup; if (!Utility::SetFileOwnership(certsDir, user, group)) { Log(LogWarning, "cli") diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index 259988259..101607fe0 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -43,12 +43,12 @@ using namespace icinga; String NodeUtility::GetConstantsConfPath() { - return Application::GetConst("ConfigDir") + "/constants.conf"; + return Configuration::ConfigDir + "/constants.conf"; } String NodeUtility::GetZonesConfPath() { - return Application::GetConst("ConfigDir") + "/zones.conf"; + return Configuration::ConfigDir + "/zones.conf"; } /* @@ -170,8 +170,8 @@ bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Pt Utility::MkDirP(path, 0755); - String user = ScriptGlobal::Get("RunAsUser"); - String group = ScriptGlobal::Get("RunAsGroup"); + String user = Configuration::RunAsUser; + String group = Configuration::RunAsGroup; if (!Utility::SetFileOwnership(path, user, group)) { Log(LogWarning, "cli") @@ -274,7 +274,7 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec */ bool NodeUtility::UpdateConfiguration(const String& value, bool include, bool recursive) { - String configurationFile = Application::GetConst("ConfigDir") + "/icinga2.conf"; + String configurationFile = Configuration::ConfigDir + "/icinga2.conf"; Log(LogInformation, "cli") << "Updating '" << value << "' include in '" << configurationFile << "'."; diff --git a/lib/cli/nodewizardcommand.cpp b/lib/cli/nodewizardcommand.cpp index 11e035aa7..96beba825 100644 --- a/lib/cli/nodewizardcommand.cpp +++ b/lib/cli/nodewizardcommand.cpp @@ -272,8 +272,8 @@ wizard_endpoint_loop_start: String certsDir = ApiListener::GetCertsDir(); Utility::MkDirP(certsDir, 0700); - String user = ScriptGlobal::Get("RunAsUser"); - String group = ScriptGlobal::Get("RunAsGroup"); + String user = Configuration::RunAsUser; + String group = Configuration::RunAsGroup; if (!Utility::SetFileOwnership(certsDir, user, group)) { Log(LogWarning, "cli") @@ -850,7 +850,7 @@ wizard_global_zone_loop_start: } /* Include api-users.conf */ - String apiUsersFilePath = Application::GetConst("ConfigDir") + "/conf.d/api-users.conf"; + String apiUsersFilePath = Configuration::ConfigDir + "/conf.d/api-users.conf"; std::cout << ConsoleColorTag(Console_Bold | Console_ForegroundGreen) << "Checking if the api-users.conf file exists...\n" diff --git a/lib/cli/objectlistcommand.cpp b/lib/cli/objectlistcommand.cpp index f5c347eed..32495153a 100644 --- a/lib/cli/objectlistcommand.cpp +++ b/lib/cli/objectlistcommand.cpp @@ -67,11 +67,11 @@ void ObjectListCommand::InitParameters(boost::program_options::options_descripti */ int ObjectListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - String objectfile = Application::GetConst("ObjectsPath"); + String objectfile = Configuration::ObjectsPath; if (!Utility::PathExists(objectfile)) { Log(LogCritical, "cli") - << "Cannot open objects file '" << Application::GetConst("ObjectsPath") << "'."; + << "Cannot open objects file '" << Configuration::ObjectsPath << "'."; Log(LogCritical, "cli", "Run 'icinga2 daemon -C' to validate config and generate the cache file."); return 1; } diff --git a/lib/cli/troubleshootcommand.cpp b/lib/cli/troubleshootcommand.cpp index 2770b5588..1e9892d9c 100644 --- a/lib/cli/troubleshootcommand.cpp +++ b/lib/cli/troubleshootcommand.cpp @@ -147,26 +147,26 @@ bool TroubleshootCommand::GeneralInfo(InfoLog& log, const boost::program_options //Application::DisplayInfoMessage() but formatted InfoLogLine(log) - << "\tApplication version: " << Application::GetConst("AppVersion") << '\n' + << "\tApplication version: " << Application::GetAppVersion() << '\n' << "\t\n" - << "\tConfig directory: " << Application::GetConst("ConfigDir") << "\n" - << "\tData directory: " << Application::GetConst("DataDir") << "\n" - << "\tLog directory: " << Application::GetConst("LogDir") << "\n" - << "\tCache directory: " << Application::GetConst("CacheDir") << "\n" - << "\tRun directory: " << Application::GetConst("InitRunDir") << "\n" + << "\tConfig directory: " << Configuration::ConfigDir << "\n" + << "\tData directory: " << Configuration::DataDir << "\n" + << "\tLog directory: " << Configuration::LogDir << "\n" + << "\tCache directory: " << Configuration::CacheDir << "\n" + << "\tRun directory: " << Configuration::InitRunDir << "\n" << "\t\n" << "Old paths (deprecated):\n" - << "\tInstallation root: " << Application::GetConst("PrefixDir") << '\n' - << "\tSysconf directory: " << Application::GetConst("SysconfDir") << '\n' - << "\tRun directory: " << Application::GetConst("RunDir") << '\n' - << "\tLocal state directory: " << Application::GetConst("LocalStateDir") << '\n' + << "\tInstallation root: " << Configuration::PrefixDir << '\n' + << "\tSysconf directory: " << Configuration::SysconfDir << '\n' + << "\tRun directory: " << Configuration::RunDir << '\n' + << "\tLocal state directory: " << Configuration::LocalStateDir << '\n' << "\t\n" << "Internal paths:\n" - << "\tPackage data directory: " << Application::GetConst("PkgDataDir") << '\n' - << "\tState path: " << Application::GetConst("StatePath") << '\n' - << "\tObjects path: " << Application::GetConst("ObjectsPath") << '\n' - << "\tVars path: " << Application::GetConst("VarsPath") << '\n' - << "\tPID path: " << Application::GetConst("PidPath") << '\n'; + << "\tPackage data directory: " << Configuration::PkgDataDir << '\n' + << "\tState path: " << Configuration::StatePath << '\n' + << "\tObjects path: " << Configuration::ObjectsPath << '\n' + << "\tVars path: " << Configuration::VarsPath << '\n' + << "\tPID path: " << Configuration::PidPath << '\n'; InfoLogLine(log) << '\n'; @@ -186,7 +186,7 @@ bool TroubleshootCommand::ObjectInfo(InfoLog& log, const boost::program_options: InfoLogLine(log, Console_ForegroundBlue) << std::string(14, '=') << " OBJECT INFORMATION " << std::string(14, '=') << "\n\n"; - String objectfile = Application::GetConst("ObjectsPath"); + String objectfile = Configuration::ObjectsPath; std::set configs; if (!Utility::PathExists(objectfile)) { @@ -262,14 +262,14 @@ bool TroubleshootCommand::ConfigInfo(InfoLog& log, const boost::program_options: InfoLogLine(log) << "A collection of important configuration files follows, please make sure to remove any sensitive data such as credentials, internal company names, etc\n"; - if (!PrintFile(log, Application::GetConst("ConfigDir") + "/icinga2.conf")) { + if (!PrintFile(log, Configuration::ConfigDir + "/icinga2.conf")) { InfoLogLine(log, 0, LogWarning) << "icinga2.conf not found, therefore skipping validation.\n" << "If you are using an icinga2.conf somewhere but the default path please validate it via 'icinga2 daemon -C -c \"path\to/icinga2.conf\"'\n" << "and provide it with your support request.\n"; } - if (!PrintFile(log, Application::GetConst("ConfigDir") + "/zones.conf")) { + if (!PrintFile(log, Configuration::ConfigDir + "/zones.conf")) { InfoLogLine(log, 0, LogWarning) << "zones.conf not found.\n" << "If you are using a zones.conf somewhere but the default path please provide it with your support request\n"; @@ -380,7 +380,7 @@ void TroubleshootCommand::GetLatestReport(const String& filename, time_t& bestTi bool TroubleshootCommand::PrintCrashReports(InfoLog& log) { - String spath = Application::GetConst("LogDir") + "/crash/report.*"; + String spath = Configuration::LogDir + "/crash/report.*"; time_t bestTimestamp = 0; String bestFilename; @@ -393,7 +393,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) if (int const * err = boost::get_error_info(ex)) { if (*err != 3) {//Error code for path does not exist InfoLogLine(log, 0, LogWarning) - << Application::GetConst("LogDir") + "/crash/ does not exist\n"; + << Configuration::LogDir + "/crash/ does not exist\n"; return false; } @@ -406,7 +406,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) #else catch (...) { InfoLogLine(log, 0, LogWarning) << "Error printing crash reports.\n" - << "Does " << Application::GetConst("LogDir") + "/crash/ exist?\n"; + << "Does " << Configuration::LogDir + "/crash/ exist?\n"; return false; } @@ -414,7 +414,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log) if (!bestTimestamp) InfoLogLine(log, Console_ForegroundYellow) - << "No crash logs found in " << Application::GetConst("LogDir") << "/crash/\n\n"; + << "No crash logs found in " << Configuration::LogDir << "/crash/\n\n"; else { InfoLogLine(log) << "Latest crash report is from " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", Utility::GetTime()) << '\n' @@ -454,8 +454,8 @@ bool TroubleshootCommand::PrintFile(InfoLog& log, const String& path) bool TroubleshootCommand::CheckConfig() { - String configDir = Application::GetConst("ConfigDir"); - String objectsPath = Application::GetConst("ObjectsPath"); + String configDir = Configuration::ConfigDir; + String objectsPath = Configuration::ObjectsPath; return DaemonUtility::ValidateConfigFiles({ configDir + "/icinga2.conf" }, objectsPath); } @@ -622,10 +622,10 @@ void TroubleshootCommand::InitParameters(boost::program_options::options_descrip int TroubleshootCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { #ifdef _WIN32 //Dislikes ':' in filenames - String path = Application::GetConst("LogDir") + "/troubleshooting-" + String path = Configuration::LogDir + "/troubleshooting-" + Utility::FormatDateTime("%Y-%m-%d_%H-%M-%S", Utility::GetTime()) + ".log"; #else - String path = Application::GetConst("LogDir") + "/troubleshooting-" + String path = Configuration::LogDir + "/troubleshooting-" + Utility::FormatDateTime("%Y-%m-%d_%H:%M:%S", Utility::GetTime()) + ".log"; #endif /*_WIN32*/ diff --git a/lib/cli/variablegetcommand.cpp b/lib/cli/variablegetcommand.cpp index 855770148..72e5b58b4 100644 --- a/lib/cli/variablegetcommand.cpp +++ b/lib/cli/variablegetcommand.cpp @@ -75,7 +75,7 @@ int VariableGetCommand::Run(const boost::program_options::variables_map& vm, con return 0; } - String varsfile = Application::GetConst("VarsPath"); + String varsfile = Configuration::VarsPath; if (!Utility::PathExists(varsfile)) { Log(LogCritical, "cli") diff --git a/lib/cli/variablelistcommand.cpp b/lib/cli/variablelistcommand.cpp index 9ebbadf11..612f912f8 100644 --- a/lib/cli/variablelistcommand.cpp +++ b/lib/cli/variablelistcommand.cpp @@ -53,7 +53,7 @@ String VariableListCommand::GetShortDescription() const */ int VariableListCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const { - String varsfile = Application::GetConst("VarsPath"); + String varsfile = Configuration::VarsPath; if (!Utility::PathExists(varsfile)) { Log(LogCritical, "cli") diff --git a/lib/cli/variableutility.cpp b/lib/cli/variableutility.cpp index ed9bd770d..1c03f25d7 100644 --- a/lib/cli/variableutility.cpp +++ b/lib/cli/variableutility.cpp @@ -31,7 +31,7 @@ using namespace icinga; Value VariableUtility::GetVariable(const String& name) { - String varsfile = Application::GetConst("VarsPath"); + String varsfile = Configuration::VarsPath; std::fstream fp; fp.open(varsfile.CStr(), std::ios_base::in); @@ -61,7 +61,7 @@ Value VariableUtility::GetVariable(const String& name) void VariableUtility::PrintVariables(std::ostream& outfp) { - String varsfile = Application::GetConst("VarsPath"); + String varsfile = Configuration::VarsPath; std::fstream fp; fp.open(varsfile.CStr(), std::ios_base::in); diff --git a/lib/compat/checkresultreader.ti b/lib/compat/checkresultreader.ti index cc558a553..1f97c22fd 100644 --- a/lib/compat/checkresultreader.ti +++ b/lib/compat/checkresultreader.ti @@ -30,7 +30,7 @@ class CheckResultReader : ConfigObject activation_priority 100; [config] String spool_dir { - default {{{ return Application::GetConst("DataDir") + "/spool/checkresults/"; }}} + default {{{ return Configuration::DataDir + "/spool/checkresults/"; }}} }; }; diff --git a/lib/compat/compatlogger.ti b/lib/compat/compatlogger.ti index 4066a72bd..0ea63ad1d 100644 --- a/lib/compat/compatlogger.ti +++ b/lib/compat/compatlogger.ti @@ -30,7 +30,7 @@ class CompatLogger : ConfigObject activation_priority 100; [config] String log_dir { - default {{{ return Application::GetConst("LogDir") + "/compat"; }}} + default {{{ return Configuration::LogDir + "/compat"; }}} }; [config] String rotation_method { default {{{ return "HOURLY"; }}} diff --git a/lib/compat/externalcommandlistener.ti b/lib/compat/externalcommandlistener.ti index 697b3a0c4..8ff99a5d3 100644 --- a/lib/compat/externalcommandlistener.ti +++ b/lib/compat/externalcommandlistener.ti @@ -30,7 +30,7 @@ class ExternalCommandListener : ConfigObject activation_priority 100; [config] String command_path { - default {{{ return Application::GetConst("InitRunDir") + "/cmd/icinga2.cmd"; }}} + default {{{ return Configuration::InitRunDir + "/cmd/icinga2.cmd"; }}} }; }; diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index e5a4578ac..b2b8ce376 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -559,7 +559,7 @@ void StatusDataWriter::UpdateObjectsCache() { CONTEXT("Writing objects.cache file"); - String objectsPath = Application::GetConst("ObjectsPath"); + String objectsPath = Configuration::ObjectsPath; std::fstream objectfp; String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0644, objectfp); diff --git a/lib/compat/statusdatawriter.ti b/lib/compat/statusdatawriter.ti index 846834f31..db81940ed 100644 --- a/lib/compat/statusdatawriter.ti +++ b/lib/compat/statusdatawriter.ti @@ -30,10 +30,10 @@ class StatusDataWriter : ConfigObject activation_priority 100; [config] String status_path { - default {{{ return Application::GetConst("CacheDir") + "/status.dat"; }}} + default {{{ return Configuration::CacheDir + "/status.dat"; }}} }; [config] String objects_path { - default {{{ return Application::GetConst("CacheDir") + "/objects.cache"; }}} + default {{{ return Configuration::CacheDir + "/objects.cache"; }}} }; [config] double update_interval { default {{{ return 15; }}} diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 53c889b4d..47b7e327c 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -577,8 +577,8 @@ bool ConfigItem::ActivateItems(WorkQueue& upq, const std::vector expression = ConfigCompiler::CompileFile(Application::GetConst("ModAttrPath")); + if (Utility::PathExists(Configuration::ModAttrPath)) { + std::unique_ptr expression = ConfigCompiler::CompileFile(Configuration::ModAttrPath); if (expression) { try { @@ -675,7 +675,7 @@ bool ConfigItem::RunWithActivationContext(const Function::Ptr& function) function->Invoke(); - WorkQueue upq(25000, Application::GetConcurrency()); + WorkQueue upq(25000, Configuration::Concurrency); upq.SetName("ConfigItem::RunWithActivationContext"); std::vector newItems; diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 7600b130e..e3910488e 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -121,6 +121,7 @@ VariableExpression::VariableExpression(String variable, std::vector(new IndexerExpression(MakeIndexer(ScopeGlobal, "System"), MakeLiteral("Configuration")))); m_Imports.push_back(MakeIndexer(ScopeGlobal, "Types")); m_Imports.push_back(MakeIndexer(ScopeGlobal, "Icinga")); } diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index fab5187a6..28ca04bbd 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -163,13 +163,13 @@ static void PersistModAttrHelper(std::fstream& fp, ConfigObject::Ptr& previousOb void IcingaApplication::DumpProgramState() { - ConfigObject::DumpObjects(GetConst("StatePath")); + ConfigObject::DumpObjects(Configuration::StatePath); DumpModifiedAttributes(); } void IcingaApplication::DumpModifiedAttributes() { - String path = GetConst("ModAttrPath"); + String path = Configuration::ModAttrPath; std::fstream fp; String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0644, fp); diff --git a/lib/livestatus/livestatuslistener.ti b/lib/livestatus/livestatuslistener.ti index 1a4729d5e..5c886176e 100644 --- a/lib/livestatus/livestatuslistener.ti +++ b/lib/livestatus/livestatuslistener.ti @@ -32,7 +32,7 @@ class LivestatusListener : ConfigObject { default {{{ return "unix"; }}} }; [config] String socket_path { - default {{{ return Application::GetConst("InitRunDir") + "/cmd/livestatus"; }}} + default {{{ return Configuration::InitRunDir + "/cmd/livestatus"; }}} }; [config] String bind_host { default {{{ return "127.0.0.1"; }}} @@ -41,7 +41,7 @@ class LivestatusListener : ConfigObject { default {{{ return "6558"; }}} }; [config] String compat_log_path { - default {{{ return Application::GetConst("LogDir") + "/compat"; }}} + default {{{ return Configuration::LogDir + "/compat"; }}} }; }; diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index 4b6560291..ab0a2b6d6 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -30,16 +30,16 @@ class PerfdataWriter : ConfigObject activation_priority 100; [config] String host_perfdata_path { - default {{{ return Application::GetConst("SpoolDir") + "/perfdata/host-perfdata"; }}} + default {{{ return Configuration::SpoolDir + "/perfdata/host-perfdata"; }}} }; [config] String service_perfdata_path { - default {{{ return Application::GetConst("SpoolDir") + "/perfdata/service-perfdata"; }}} + default {{{ return Configuration::SpoolDir + "/perfdata/service-perfdata"; }}} }; [config] String host_temp_path { - default {{{ return Application::GetConst("SpoolDir") + "/tmp/host-perfdata"; }}} + default {{{ return Configuration::SpoolDir + "/tmp/host-perfdata"; }}} }; [config] String service_temp_path { - default {{{ return Application::GetConst("SpoolDir") + "/tmp/service-perfdata"; }}} + default {{{ return Configuration::SpoolDir + "/tmp/service-perfdata"; }}} }; [config] String host_format_template { default {{{ diff --git a/lib/remote/apilistener-filesync.cpp b/lib/remote/apilistener-filesync.cpp index 0c8987237..5d3c1ddb9 100644 --- a/lib/remote/apilistener-filesync.cpp +++ b/lib/remote/apilistener-filesync.cpp @@ -202,7 +202,7 @@ void ApiListener::SyncZoneDir(const Zone::Ptr& zone) const if (sumUpdates == 0) return; - String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName(); + String oldDir = Configuration::DataDir + "/api/zones/" + zone->GetName(); Log(LogInformation, "ApiListener") << "Copying " << sumUpdates << " zone configuration files for zone '" << zone->GetName() << "' to '" << oldDir << "'."; @@ -240,7 +240,7 @@ void ApiListener::SendConfigUpdate(const JsonRpcConnection::Ptr& aclient) Dictionary::Ptr configUpdateV1 = new Dictionary(); Dictionary::Ptr configUpdateV2 = new Dictionary(); - String zonesDir = Application::GetConst("DataDir") + "/api/zones"; + String zonesDir = Configuration::DataDir + "/api/zones"; for (const Zone::Ptr& zone : ConfigType::GetObjectsByType()) { String zoneDir = zonesDir + "/" + zone->GetName(); @@ -315,7 +315,7 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D continue; } - String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName(); + String oldDir = Configuration::DataDir + "/api/zones/" + zone->GetName(); Utility::MkDirP(oldDir, 0700); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 8c0abf570..4dd914470 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -56,22 +56,22 @@ ApiListener::ApiListener() String ApiListener::GetApiDir() { - return Application::GetConst("DataDir") + "/api/"; + return Configuration::DataDir + "/api/"; } String ApiListener::GetCertsDir() { - return Application::GetConst("DataDir") + "/certs/"; + return Configuration::DataDir + "/certs/"; } String ApiListener::GetCaDir() { - return Application::GetConst("DataDir") + "/ca/"; + return Configuration::DataDir + "/ca/"; } String ApiListener::GetCertificateRequestsDir() { - return Application::GetConst("DataDir") + "/certificate-requests/"; + return Configuration::DataDir + "/certificate-requests/"; } String ApiListener::GetDefaultCertPath() @@ -1479,7 +1479,7 @@ String ApiListener::GetFromZoneName(const Zone::Ptr& fromZone) void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket) { - String path = Application::GetConst("CacheDir") + "/api-state.json"; + String path = Configuration::CacheDir + "/api-state.json"; std::pair details = socket->GetClientAddressDetails(); Utility::SaveJsonFile(path, 0644, new Dictionary({ @@ -1490,7 +1490,7 @@ void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket) void ApiListener::RemoveStatusFile() { - String path = Application::GetConst("CacheDir") + "/api-state.json"; + String path = Configuration::CacheDir + "/api-state.json"; if (Utility::PathExists(path)) { if (unlink(path.CStr()) < 0 && errno != ENOENT) { diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index 04e483270..e4227a6d1 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -42,10 +42,10 @@ class ApiListener : ConfigObject }; [config] String bind_host { - default {{{ return Application::GetConst("ApiBindHost"); }}} + default {{{ return Configuration::ApiBindHost; }}} }; [config] String bind_port { - default {{{ return Application::GetConst("ApiBindPort", "5665"); }}} + default {{{ return Configuration::ApiBindPort; }}} }; [config] bool accept_config; diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 19b1022e8..34620e1db 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -30,7 +30,7 @@ using namespace icinga; String ConfigPackageUtility::GetPackageDir() { - return Application::GetConst("DataDir") + "/api/packages"; + return Configuration::DataDir + "/api/packages"; } void ConfigPackageUtility::CreatePackage(const String& name) diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index aff47a9a9..22b49d4b7 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -290,7 +290,10 @@ std::vector ConsoleHandler::GetAutocompletionSuggestions(const String& w } } - AddSuggestions(matches, word, "", false, ScriptGlobal::Get("System")); + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + + AddSuggestions(matches, word, "", false, systemNS); + AddSuggestions(matches, word, "", true, systemNS->Get("Configuration")); AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Types")); AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Icinga")); diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 259679edc..0022d5072 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -59,7 +59,7 @@ void JsonRpcConnection::StaticInitialize() l_JsonRpcConnectionTimeoutTimer->SetInterval(15); l_JsonRpcConnectionTimeoutTimer->Start(); - l_JsonRpcConnectionWorkQueueCount = Application::GetConcurrency(); + l_JsonRpcConnectionWorkQueueCount = Configuration::Concurrency; l_JsonRpcConnectionWorkQueues = new WorkQueue[l_JsonRpcConnectionWorkQueueCount]; for (size_t i = 0; i < l_JsonRpcConnectionWorkQueueCount; i++) { From 15baa8e012bfa3609d084a659ed7e6fbd7061ef0 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 14 Aug 2018 15:26:59 +0200 Subject: [PATCH 0149/1162] Update documentation --- doc/17-language-reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 4de8afbfd..0b7ad7bbf 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -1067,6 +1067,8 @@ These keywords are reserved and must not be used as constants or custom attribut try except in + using + namespace You can escape reserved keywords using the `@` character. The following example tries to set `vars.include` which references a reserved keyword and generates From 7b4e93b52a78b48a5c5eba4d5a809e3ac1051e05 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Mon, 20 Aug 2018 10:37:47 +0200 Subject: [PATCH 0150/1162] windows: Allow suppression of extra actions in the MSI package By setting SUPPRESS_XTRA --- icinga-installer/icinga2.wixpatch.cmake | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake index 0666261d2..4232be01e 100644 --- a/icinga-installer/icinga2.wixpatch.cmake +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -8,11 +8,11 @@ - + - $CM_CP_sbin.icinga2_installer.exe>2 - $CM_CP_sbin.icinga2_installer.exe>2 - $CM_CP_sbin.icinga2_installer.exe=2 + $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA + $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA + $CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA @@ -24,9 +24,9 @@ Impersonate="no" /> - WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed From 9d66f3c73c391b97da56afd715caceb2b217483e Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Tue, 21 Aug 2018 12:09:43 +0200 Subject: [PATCH 0151/1162] Add ceph plugin to itl --- doc/10-icinga-template-library.md | 18 ++++++++++++ itl/plugins-contrib.d/storage.conf | 46 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 1ce1cd45a..08243d65f 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3062,6 +3062,24 @@ glusterfs_disk_critical | **Optional.** Return a critical error if disk usage glusterfs_inode_warning | **Optional.** Warn if inode usage is above *DISKWARN*. Defaults to 90 (percent). glusterfs_inode_critical | **Optional.** Return a critical error if inode usage is above *DISKCRIT*. Defaults to 95 (percent). +#### ceph + +The [ceph plugin](https://github.com/ceph/ceph-nagios-plugins) +is used to check the Ceph storage health on the server. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +---------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +ceph_exec_dir | **Optional.** Ceph executable. Default /usr/bin/ceph. +ceph_conf_file | **Optional.** Alternative ceph conf file. +ceph_mon_address | **Optional.** Ceph monitor address[:port]. +ceph_client_id | **Optional.** Ceph client id. +ceph_client_name | **Optional.** Ceph client name. +ceph_client_key | **Optional.** Ceph client keyring file. +ceph_whitelist | **Optional.** Whitelist regexp for ceph health warnings. +ceph_details | **Optional.** Run 'ceph health detail'. + ### Virtualization diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index 4cddb4fdd..40a3b5c2a 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -56,3 +56,49 @@ object CheckCommand "glusterfs" { vars.glusterfs_inode_warning = 90 vars.glusterfs_inode_critical = 95 } + +object CheckCommand "ceph" { + command = [ PluginDir + "/check_ceph.py" ] + + arguments = { + "-e" = { + value = "$service.vars.ceph_exec_dir$" + required = false + description = "ceph executable [/usr/bin/ceph]" + } + "-c" = { + value = "$service.vars.ceph_conf_file$" + required = false + description = "alternative ceph conf file" + } + "-m" = { + value = "$service.vars.ceph_mon_address$" + required = false + description = "ceph monitor address[:port]" + } + "-i" = { + value = "$service.vars.ceph_client_id$" + required = false + description = "ceph client id" + } + "-n" = { + value = "$service.vars.ceph_client_name$" + required = false + description = "ceph client name" + } + "-k" = { + value = "$service.vars.ceph_client_key$" + required = false + description = "ceph client keyring file" + } + "-w" = { + value = "$service.vars.ceph_whitelist$" + required = false + description = "whitelist regexp for ceph health warnings" + } + "-d" = { + set_if = "$service.vars.ceph_details$" + description = "exec 'ceph health detail'" + } + } +} From a4ad3c364fcf19f76fed23b93562f7e69985e67f Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Tue, 21 Aug 2018 15:51:20 +0200 Subject: [PATCH 0152/1162] Fix table format for ceph check doc --- doc/10-icinga-template-library.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 08243d65f..1aa75004f 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3069,8 +3069,8 @@ is used to check the Ceph storage health on the server. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): -Name | Description ----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Name | Description +-----------------|--------------------------------------------------------- ceph_exec_dir | **Optional.** Ceph executable. Default /usr/bin/ceph. ceph_conf_file | **Optional.** Alternative ceph conf file. ceph_mon_address | **Optional.** Ceph monitor address[:port]. From 31e72df9b0c162b215f627a4f21297247dc4cf51 Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Tue, 21 Aug 2018 20:00:19 +0200 Subject: [PATCH 0153/1162] Fix value attributes for ceph plugin --- itl/plugins-contrib.d/storage.conf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index 40a3b5c2a..b47e8af72 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -62,42 +62,42 @@ object CheckCommand "ceph" { arguments = { "-e" = { - value = "$service.vars.ceph_exec_dir$" + value = "$ceph_exec_dir$" required = false description = "ceph executable [/usr/bin/ceph]" } "-c" = { - value = "$service.vars.ceph_conf_file$" + value = "$ceph_conf_file$" required = false description = "alternative ceph conf file" } "-m" = { - value = "$service.vars.ceph_mon_address$" + value = "$ceph_mon_address$" required = false description = "ceph monitor address[:port]" } "-i" = { - value = "$service.vars.ceph_client_id$" + value = "$ceph_client_id$" required = false description = "ceph client id" } "-n" = { - value = "$service.vars.ceph_client_name$" + value = "$ceph_client_name$" required = false description = "ceph client name" } "-k" = { - value = "$service.vars.ceph_client_key$" + value = "$ceph_client_key$" required = false description = "ceph client keyring file" } "-w" = { - value = "$service.vars.ceph_whitelist$" + value = "$ceph_whitelist$" required = false description = "whitelist regexp for ceph health warnings" } "-d" = { - set_if = "$service.vars.ceph_details$" + set_if = "$ceph_details$" description = "exec 'ceph health detail'" } } From 4b5b5bdf5de42986569c7910852001e308af45de Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Tue, 21 Aug 2018 21:03:55 +0200 Subject: [PATCH 0154/1162] Add cloudera plugin to itl --- doc/10-icinga-template-library.md | 22 ++++++++++ itl/plugins-contrib.d/CMakeLists.txt | 2 +- itl/plugins-contrib.d/big-data.conf | 65 ++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 itl/plugins-contrib.d/big-data.conf diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 1ce1cd45a..3842193e7 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2184,6 +2184,28 @@ include This is enabled by default since Icinga 2 2.5.0. +### Big Data + +This category contains plugins for various Big Data systems. + +#### cloudera_service_status + +The [cloudera_service_status](https://github.com/miso231/icinga2-cloudera-plugin) plugin +uses Cloudera Manager API to monitor cluster services + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +----------------------|----------------------------------------------------------------- +cloudera_host | **Required.** Hostname of cloudera server. +cloudera_port | **Optional.** Port where cloudera is listening. Defaults to 443. +cloudera_user | **Required.** The username for the API connection. +cloudera_pass | **Required.** The password for the API connection. +cloudera_api_version | **Required.** API version of cloudera. +cloudera_cluster | **Required.** The cluster name in cloudera manager. +cloudera_service | **Required.** Name of cluster service to be checked. +cloudera_verify_ssl | **Optional.** Verify SSL. Defaults to true. + ### Databases This category contains plugins for various database servers. diff --git a/itl/plugins-contrib.d/CMakeLists.txt b/itl/plugins-contrib.d/CMakeLists.txt index 5d60a1b70..360836414 100644 --- a/itl/plugins-contrib.d/CMakeLists.txt +++ b/itl/plugins-contrib.d/CMakeLists.txt @@ -16,6 +16,6 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. install( - FILES databases.conf hardware.conf icingacli.conf ipmi.conf logmanagement.conf metrics.conf network-components.conf network-services.conf operating-system.conf raid-controller.conf smart-attributes.conf storage.conf virtualization.conf vmware.conf web.conf + FILES big-data.conf databases.conf hardware.conf icingacli.conf ipmi.conf logmanagement.conf metrics.conf network-components.conf network-services.conf operating-system.conf raid-controller.conf smart-attributes.conf storage.conf virtualization.conf vmware.conf web.conf DESTINATION ${ICINGA2_INCLUDEDIR}/plugins-contrib.d ) diff --git a/itl/plugins-contrib.d/big-data.conf b/itl/plugins-contrib.d/big-data.conf new file mode 100644 index 000000000..dc448009a --- /dev/null +++ b/itl/plugins-contrib.d/big-data.conf @@ -0,0 +1,65 @@ +/****************************************************************************** + * 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. * + ******************************************************************************/ + +object CheckCommand "cloudera_service_status" { + command = [ PluginDir + "/check_cloudera_service_status.py" ] + + arguments = { + "-H" = { + description = "host" + value = "$cloudera_host$" + required = true + } + "-P" = { + description = "port" + value = "$cloudera_port$" + required = false + } + "-u" = { + description = "user" + value = "$cloudera_user$" + required = true + } + "-p" = { + description = "pass" + value = "$cloudera_pass$" + required = true + } + "-v" = { + description = "api_version" + value = "$cloudera_api_version$" + required = true + } + "-c" = { + description = "cluster" + value = "$cloudera_cluster$" + required = true + } + "-s" = { + description = "service" + value = "$cloudera_service$" + required = true + } + "-k" = { + description = "verify_ssl" + value = "$cloudera_verify_ssl$" + required = false + } + } +} From 6a71b75f6363b2adc13b4afb93b5d828c39d21e3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 22 Aug 2018 12:57:47 +0200 Subject: [PATCH 0155/1162] ApiListener: Dump the state file port detail as number refs #6511 --- lib/remote/apilistener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 8c0abf570..ac11cb95e 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1484,7 +1484,7 @@ void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket) Utility::SaveJsonFile(path, 0644, new Dictionary({ {"host", details.first}, - {"port", details.second} + {"port", Convert::ToLong(details.second)} })); } From 0dd168fe80d6209c6cf066d263dfe26483e4eb8b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 23 Aug 2018 17:10:51 +0200 Subject: [PATCH 0156/1162] Increase limit for simultaneously connected anonymous TLS clients --- lib/remote/apilistener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 8c0abf570..1ac640d8b 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1384,7 +1384,7 @@ double ApiListener::CalculateZoneLag(const Endpoint::Ptr& endpoint) bool ApiListener::AddAnonymousClient(const JsonRpcConnection::Ptr& aclient) { boost::mutex::scoped_lock lock(m_AnonymousClientsLock); - if (m_AnonymousClients.size() > 25) + if (m_AnonymousClients.size() > 100) return false; m_AnonymousClients.insert(aclient); From 130a74d91c1fa42d6995425d1054bac2b8e65720 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 24 Aug 2018 11:03:29 +0200 Subject: [PATCH 0157/1162] Add note about workaround for broken custom vars --- doc/16-upgrading-icinga-2.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 4e4db7c7f..a266cfd87 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -134,6 +134,22 @@ With the removal of RHEL 5 as supported platform, we can finally use real unique This is reflected in generating names for e.g. API stage names. Previously it was a handcrafted mix of local FQDN, timestamps and random numbers. +### Custom Vars not updating + +A rare issue preventing the custom vars of objects created prior to 2.9.0 being updated when changed may occur. To +remedy this the config checksums of the affected type need to be reset to trigger a full update. The following is an +example of how to do this for Hosts in mysql: + +``` +$ mysql -uroot -picinga icinga +MariaDB [icinga]> UPDATE icinga_hosts SET config_hash = NULL; +MariaDB [icinga]> exit +Bye +$ sudo systemctl restart icinga2 +``` + +Custom vars should now be up to date. + ## Upgrading to v2.8.2 From 91b0b25b36492f0fb9d52dd8c4bbaffe8a8250f6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 24 Aug 2018 11:54:20 +0200 Subject: [PATCH 0158/1162] Update upgrading docs for v2.10 and namespaces --- doc/06-distributed-monitoring.md | 2 +- doc/16-upgrading-icinga-2.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 8795335ed..8964fcffd 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -2807,7 +2807,7 @@ or the `bind_host` and `bind_port` attributes of the [ApiListener](09-object-types.md#objecttype-apilistener) object. The environment must be set with the global constant `Environment` or as object attribute -of the [IcingaApplication](#objecttype-icingaapplication) object. +of the [IcingaApplication](09-object-types.md#objecttype-icingaapplication) object. In any case the constant is default value for the attribute and the direct configuration in the objects have more precedence. The constants have been added to allow the values being set from the CLI on startup. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 4e4db7c7f..1a4d54875 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -44,6 +44,11 @@ New [Icinga constants](17-language-reference.md#icinga-constants) have been adde * `Environment` for specifying the Icinga environment. Defaults to not set. * `ApiBindHost` and `ApiBindPort` to allow overriding the default ApiListener values. This will be used for an Icinga addon only. +### Configuration: Namespaces + +The keywords `namespace` and `using` are now [reserved](17-language-reference.md#reserved-keywords) for the namespace functionality provided +with v2.10. Read more about how it works [here](17-language-reference.md#namespaces). + ## Upgrading to v2.9 ### Deprecation and Removal Notes From 01fea22c77c6201701de876835e3d98ccaead1b3 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Wed, 8 Aug 2018 14:42:18 +0200 Subject: [PATCH 0159/1162] Add child_options to ScheduledDowntime refs #3935 --- doc/09-object-types.md | 1 + doc/12-icinga2-api.md | 2 +- lib/icinga/apiactions.cpp | 18 +++++++-------- lib/icinga/downtime.cpp | 26 ++++++++++++++++++++++ lib/icinga/downtime.hpp | 11 +++++++++ lib/icinga/scheduleddowntime.cpp | 38 +++++++++++++++++++++++++++++++- lib/icinga/scheduleddowntime.hpp | 1 + lib/icinga/scheduleddowntime.ti | 4 ++++ 8 files changed, 90 insertions(+), 11 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index d04f78156..8d91b7b30 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1385,6 +1385,7 @@ Configuration Attributes: fixed | Boolean | **Optional.** Whether this is a fixed downtime. Defaults to `true`. duration | Duration | **Optional.** How long the downtime lasts. Only has an effect for flexible (non-fixed) downtimes. ranges | Dictionary | **Required.** A dictionary containing information which days and durations apply to this timeperiod. + child\_options | String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. ScheduledDowntime objects have composite names, i.e. their names are based on the `host_name` and `service_name` attributes and the diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index 722b88a2b..50b107c88 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1117,7 +1117,7 @@ Send a `POST` request to the URL endpoint `/v1/actions/schedule-downtime`. fixed | Boolean | **Optional.** Defaults to `true`. If true, the downtime is `fixed` otherwise `flexible`. See [downtimes](08-advanced-topics.md#downtimes) for more information. duration | Number | **Required for flexible downtimes.** Duration of the downtime in seconds if `fixed` is set to false. trigger\_name | String | **Optional.** Sets the trigger for a triggered downtime. See [downtimes](08-advanced-topics.md#downtimes) for more information on triggered downtimes. - child\_options | Number | **Optional.** Schedule child downtimes. `0` does not do anything, `1` schedules child downtimes triggered by this downtime, `2` schedules non-triggered downtimes. Defaults to `0`. + child\_options| String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. In addition to these parameters a [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host` and `Service`. diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 2a373eb1c..0c28fe944 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -366,30 +366,30 @@ Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, }); /* Schedule downtime for all child objects. */ - int childOptions = 0; + DowntimeChildOptions childOptions = DowntimeNoChildren; if (params->Contains("child_options")) - childOptions = HttpUtility::GetLastParameter(params, "child_options"); + childOptions = Downtime::ChildOptionsFromValue(HttpUtility::GetLastParameter(params, "child_options")); - if (childOptions > 0) { - /* '1' schedules child downtimes triggered by the parent downtime. - * '2' schedules non-triggered downtimes for all children. + if (childOptions != DowntimeNoChildren) { + /* 'DowntimeTriggeredChildren' schedules child downtimes triggered by the parent downtime. + * 'DowntimeNonTriggeredChildren' schedules non-triggered downtimes for all children. */ - if (childOptions == 1) + if (childOptions == DowntimeTriggeredChildren) triggerName = downtimeName; - Log(LogCritical, "ApiActions") + Log(LogNotice, "ApiActions") << "Processing child options " << childOptions << " for downtime " << downtimeName; ArrayData childDowntimes; for (const Checkable::Ptr& child : checkable->GetAllChildren()) { - Log(LogCritical, "ApiActions") + Log(LogNotice, "ApiActions") << "Scheduling downtime for child object " << child->GetName(); String childDowntimeName = Downtime::AddDowntime(child, author, comment, startTime, endTime, fixed, triggerName, duration); - Log(LogCritical, "ApiActions") + Log(LogNotice, "ApiActions") << "Add child downtime '" << childDowntimeName << "'."; Downtime::Ptr childDowntime = Downtime::GetByName(childDowntimeName); diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 8c3584a4b..6e5bc0210 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -42,6 +42,15 @@ boost::signals2::signal Downtime::OnDowntimeTrigger REGISTER_TYPE(Downtime); +INITIALIZE_ONCE(&Downtime::StaticInitialize); + +void Downtime::StaticInitialize() +{ + ScriptGlobal::Set("DowntimeNoChildren", "DowntimeNoChildren"); + ScriptGlobal::Set("DowntimeTriggeredChildren", "DowntimeTriggeredChildren"); + ScriptGlobal::Set("DowntimeNonTriggeredChildren", "DowntimeNonTriggeredChildren"); +} + String DowntimeNameComposer::MakeName(const String& shortName, const Object::Ptr& context) const { Downtime::Ptr downtime = dynamic_pointer_cast(context); @@ -420,3 +429,20 @@ void Downtime::ValidateEndTime(const Lazy& lvalue, const ValidationUt if (lvalue() <= 0) BOOST_THROW_EXCEPTION(ValidationError(this, { "end_time" }, "End time must be greater than 0.")); } + +DowntimeChildOptions Downtime::ChildOptionsFromValue(const Value& options) +{ + if (options == "DowntimeNoChildren") + return DowntimeNoChildren; + else if (options == "DowntimeTriggeredChildren") + return DowntimeTriggeredChildren; + else if (options == "DowntimeNonTriggeredChildren") + return DowntimeNonTriggeredChildren; + else if (options.IsNumber()) { + int number = options; + if (number >= 0 && number <= 2) + return static_cast(number); + } + + BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid child option specified")); +} diff --git a/lib/icinga/downtime.hpp b/lib/icinga/downtime.hpp index 6d4ba0a21..c4646eabb 100644 --- a/lib/icinga/downtime.hpp +++ b/lib/icinga/downtime.hpp @@ -28,6 +28,13 @@ namespace icinga { +enum DowntimeChildOptions +{ + DowntimeNoChildren, + DowntimeTriggeredChildren, + DowntimeNonTriggeredChildren +}; + /** * A downtime. * @@ -51,6 +58,8 @@ public: bool IsExpired() const; bool HasValidConfigOwner() const; + static void StaticInitialize(); + static int GetNextDowntimeID(); static String AddDowntime(const intrusive_ptr& checkable, const String& author, @@ -65,6 +74,8 @@ public: static String GetDowntimeIDFromLegacyID(int id); + static DowntimeChildOptions ChildOptionsFromValue(const Value& options); + protected: void OnAllConfigLoaded() override; void Start(bool runtimeCreated) override; diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 6a715fc40..80d7617ba 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -191,9 +191,35 @@ void ScheduledDowntime::CreateNextDowntime() return; } - Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), + String downtimeName = Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), segment.first, segment.second, GetFixed(), String(), GetDuration(), GetName(), GetName()); + + Downtime::Ptr downtime = Downtime::GetByName(downtimeName); + + int childOptions = Downtime::ChildOptionsFromValue(GetChildOptions()); + if (childOptions > 0) { + /* 'DowntimeTriggeredChildren' schedules child downtimes triggered by the parent downtime. + * 'DowntimeNonTriggeredChildren' schedules non-triggered downtimes for all children. + */ + String triggerName; + if (childOptions == 1) + triggerName = downtimeName; + + Log(LogNotice, "ScheduledDowntime") + << "Processing child options " << childOptions << " for downtime " << downtimeName; + + for (const Checkable::Ptr& child : GetCheckable()->GetAllChildren()) { + Log(LogNotice, "ScheduledDowntime") + << "Scheduling downtime for child object " << child->GetName(); + + String childDowntimeName = Downtime::AddDowntime(child, GetAuthor(), GetComment(), + segment.first, segment.second, GetFixed(), triggerName, GetDuration(), GetName(), GetName()); + + Log(LogNotice, "ScheduledDowntime") + << "Add child downtime '" << childDowntimeName << "'."; + } + } } void ScheduledDowntime::ValidateRanges(const Lazy& lvalue, const ValidationUtils& utils) @@ -226,3 +252,13 @@ void ScheduledDowntime::ValidateRanges(const Lazy& lvalue, cons } } +void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateChildOptions(lvalue, utils); + + try { + Downtime::ChildOptionsFromValue(lvalue()); + } catch (const std::exception&) { + BOOST_THROW_EXCEPTION(ValidationError(this, { "child_options" }, "Invalid child_options specified")); + } +} \ No newline at end of file diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 86138fa04..7fbcd1e12 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -49,6 +49,7 @@ public: static void EvaluateApplyRules(const intrusive_ptr& service); void ValidateRanges(const Lazy& lvalue, const ValidationUtils& utils) override; + void ValidateChildOptions(const Lazy& lvalue, const ValidationUtils& utils) override; protected: void OnAllConfigLoaded() override; diff --git a/lib/icinga/scheduleddowntime.ti b/lib/icinga/scheduleddowntime.ti index e119eaa11..e2d2aca30 100644 --- a/lib/icinga/scheduleddowntime.ti +++ b/lib/icinga/scheduleddowntime.ti @@ -77,6 +77,10 @@ class ScheduledDowntime : CustomVarObject < ScheduledDowntimeNameComposer default {{{ return true; }}} }; + [config] Value child_options { + default {{{ return "DowntimeNoChildren"; }}} + }; + [config, required] Dictionary::Ptr ranges; }; From 2372abb49af8a9de6b07149d8ffdf63b638d8082 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 24 Aug 2018 14:56:04 +0200 Subject: [PATCH 0160/1162] Add upgrading docs for API schedule-downtime 'child_options' --- doc/09-object-types.md | 2 +- doc/12-icinga2-api.md | 2 +- doc/16-upgrading-icinga-2.md | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 8d91b7b30..4945b18ec 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1385,7 +1385,7 @@ Configuration Attributes: fixed | Boolean | **Optional.** Whether this is a fixed downtime. Defaults to `true`. duration | Duration | **Optional.** How long the downtime lasts. Only has an effect for flexible (non-fixed) downtimes. ranges | Dictionary | **Required.** A dictionary containing information which days and durations apply to this timeperiod. - child\_options | String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. + child\_options | String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeNonTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. ScheduledDowntime objects have composite names, i.e. their names are based on the `host_name` and `service_name` attributes and the diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index 50b107c88..c26ef937d 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1117,7 +1117,7 @@ Send a `POST` request to the URL endpoint `/v1/actions/schedule-downtime`. fixed | Boolean | **Optional.** Defaults to `true`. If true, the downtime is `fixed` otherwise `flexible`. See [downtimes](08-advanced-topics.md#downtimes) for more information. duration | Number | **Required for flexible downtimes.** Duration of the downtime in seconds if `fixed` is set to false. trigger\_name | String | **Optional.** Sets the trigger for a triggered downtime. See [downtimes](08-advanced-topics.md#downtimes) for more information on triggered downtimes. - child\_options| String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. + child\_options| String | **Optional.** Schedule child downtimes. `DowntimeNoChildren` does not do anything, `DowntimeTriggeredChildren` schedules child downtimes triggered by this downtime, `DowntimeNonTriggeredChildren` schedules non-triggered downtimes. Defaults to `DowntimeNoChildren`. In addition to these parameters a [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host` and `Service`. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index ab5bd649b..f483ff0e3 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -49,6 +49,11 @@ New [Icinga constants](17-language-reference.md#icinga-constants) have been adde The keywords `namespace` and `using` are now [reserved](17-language-reference.md#reserved-keywords) for the namespace functionality provided with v2.10. Read more about how it works [here](17-language-reference.md#namespaces). +### API: schedule-downtime Action + +The attribute `child_options` was previously accepting 0,1,2 for specific child downtime settings. +This behaviour stays intact, but the new proposed way are specific constants as values (`DowntimeNoChildren`, `DowntimeTriggeredChildren`, `DowntimeNonTriggeredChildren`). + ## Upgrading to v2.9 ### Deprecation and Removal Notes From a0fb0bbfe326b4cb07bc562107f0beaa6d61d39a Mon Sep 17 00:00:00 2001 From: Alan Jenkins Date: Mon, 28 May 2018 21:08:57 +0100 Subject: [PATCH 0161/1162] fix "Console" log to flush It's called "Console", which would be line-buffered anyway. But, it's implemented as std::cout. This might be piped to a logger, as in daemontools or systemd. In this case it will not be a TTY, and log lines should be flushed without too much delay. Let's just flush each message. Let's not introduce a static instance of StreamLogger (flushed by interval timer). That's too stressful to read, because static instances are really annoying to order. Example citation: "Yay, our static destructors are pretty much beyond repair at this point." -- application.cpp. I don't know if there will be any need to optimize logging syscalls. The init script uses `--daemonize`. I think the systemd service should also avoid using the "Console" log after startup (see next commit). The documentation does not warn that the syslog feature is less efficient in system calls than mainlog; deferred flusing does not seem to be a highly prominent feature. There's no cool comment in the code about how much the syscalls were slowing down some use case (or qualifying that this optimization can only eliminate syscalls on platforms with both mutexes and clocks that can work without syscalls). --- lib/base/logger.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index 9a59d199f..8af34d6ca 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -245,8 +245,13 @@ Log::~Log() #endif /* I2_DEBUG */ } - if (Logger::IsConsoleLogEnabled() && entry.Severity >= Logger::GetConsoleLogSeverity()) + if (Logger::IsConsoleLogEnabled() && entry.Severity >= Logger::GetConsoleLogSeverity()) { StreamLogger::ProcessLogEntry(std::cout, entry); + + /* "Console" might be a pipe/socket (systemd, daemontools, docker, ...), + * then cout will not flush lines automatically. */ + std::cout << std::flush; + } } Log& Log::operator<<(const char *val) From 50463a6a10ea1d1295758e0c8489c28f78b66eab Mon Sep 17 00:00:00 2001 From: Alan Jenkins Date: Wed, 30 May 2018 12:21:39 +0100 Subject: [PATCH 0162/1162] Daemonize(): use one error convention, not three Standardize on exit() / _exit() (this depends whether we are considered to be the "main" fork, which should run anything registered with atexit()). Exclude `return false` and throwing exceptions. This fixes the error path for fork(). Daemonize() would return false, but the `return false` error convention was not tested in the caller. It also fixes the error message for fork() to show the error code. Everyone loves `strace`, but sysadmins should not have to rerun their daemons under it just to see an error code. Also in case an exception is thrown, show its diagnostic information instead of dropping it on the floor. In the log message, I mention why we are uninitializing and then initializing the app at this point. For the reader, it pushes all the weirdness into the error convention of Daemonize(). This comes back to the exit() / _exit() distinction. Once we have forked, we technically don't want to allow the parent process to exit(), so we don't want to return to the caller. --- lib/cli/daemoncommand.cpp | 40 +++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 0cf7d3b91..02d8b1ea1 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -52,14 +52,28 @@ static void SigHupHandler(int) } #endif /* _WIN32 */ -static bool Daemonize() +/* + * Daemonize(). On error, this function logs by itself and exits (i.e. does not return). + * + * Implementation note: We're only supposed to call exit() in one of the forked processes. + * The other process calls _exit(). This prevents issues with exit handlers like atexit(). + */ +static void Daemonize() noexcept { #ifndef _WIN32 - Application::UninitializeBase(); + try { + Application::UninitializeBase(); + } catch (const std::exception& ex) { + Log(LogCritical, "cli") + << "Failed to stop thread pool before daemonizing, unexpected error: " << DiagnosticInformation(ex); + exit(EXIT_FAILURE); + } pid_t pid = fork(); if (pid == -1) { - return false; + Log(LogCritical, "cli") + << "fork() failed with error code " << errno << ", \"" << Utility::FormatErrorNumber(errno) << "\""; + exit(EXIT_FAILURE); } if (pid) { @@ -91,10 +105,14 @@ static bool Daemonize() Log(LogDebug, "Daemonize()") << "Child process with PID " << Utility::GetPid() << " continues; re-initializing base."; - Application::InitializeBase(); + try { + Application::InitializeBase(); + } catch (const std::exception& ex) { + Log(LogCritical, "cli") + << "Failed to re-initialize thread pool after daemonizing: " << DiagnosticInformation(ex); + exit(EXIT_FAILURE); + } #endif /* _WIN32 */ - - return true; } static bool SetDaemonIO(const String& stderrFile) @@ -245,12 +263,10 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector Date: Tue, 29 May 2018 17:24:05 +0100 Subject: [PATCH 0163/1162] Fix logging under systemd icinga2.service used `-e ${ICINGA2_ERROR_LOG}`, but this is documented as having no effect without `-d`. Furthermore, icinga2 under systemd unconditionally logged everything to the system log (but without setting the log level etc), which contradicted the documentation. (Issue #6339) Stop icinga2 on systemd from logging to stdout - and hence the system log - once it has finished starting up. Just like when you start icinga2 from a terminal using `-d`. And just like -d, we stop logging fatal errors to stderr, and instead write to the log file passed with `-e`. As per docs, mainlog (icinga2.log) is already enabled by default. And pre-startup messages including config errors will still appear in the system log. This uses a new option --close-stdio, which has the same effect on logging as --daemonize, but does not fork or call setsid(). For this purpose, I moved setsid() up and into Daemonize(). Consequence of that last point: if anyone is weird enough to specify a TTY device file as the fatal error log (-e option), that will become icinga's controlling terminal, which you generally don't want as a daemon. This makes it consistent with the existing behaviour for icinga mainlog. For this reason you're supposed to use O_NOCTTY in Linux daemons. But I wasn't sure where icinga would want to put the ugly `#ifdef _WIN32 ... #else ...`. --- doc/11-cli-commands.md | 4 +++- etc/initsystem/icinga2.service.cmake | 2 +- lib/cli/daemoncommand.cpp | 28 +++++++++++++++++----------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/doc/11-cli-commands.md b/doc/11-cli-commands.md index 012fe72f3..a6a625e5f 100644 --- a/doc/11-cli-commands.md +++ b/doc/11-cli-commands.md @@ -388,8 +388,10 @@ Command options: -z [ --no-config ] start without a configuration file -C [ --validate ] exit after validating the configuration -e [ --errorlog ] arg log fatal errors to the specified log file (only - works in combination with --daemonize) + works in combination with --daemonize or + --close-stdio) -d [ --daemonize ] detach from the controlling terminal + --close-stdio do not log to stdout (or stderr) after startup Report bugs at Icinga home page: diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 94b7dcd2f..9c7d81748 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -6,7 +6,7 @@ After=syslog.target network-online.target postgresql.service mariadb.service car Type=notify EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ -ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon -e ${ICINGA2_ERROR_LOG} +ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon --close-stdio -e ${ICINGA2_ERROR_LOG} PIDFile=@ICINGA2_INITRUNDIR@/icinga2.pid ExecReload=@CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload @ICINGA2_SYSCONFIGFILE@ TimeoutStartSec=30m diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 02d8b1ea1..d744d0dc1 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -105,6 +105,14 @@ static void Daemonize() noexcept Log(LogDebug, "Daemonize()") << "Child process with PID " << Utility::GetPid() << " continues; re-initializing base."; + // Detach from controlling terminal + pid_t sid = setsid(); + if (sid == -1) { + Log(LogCritical, "cli") + << "setsid() failed with error code " << errno << ", \"" << Utility::FormatErrorNumber(errno) << "\""; + exit(EXIT_FAILURE); + } + try { Application::InitializeBase(); } catch (const std::exception& ex) { @@ -115,7 +123,7 @@ static void Daemonize() noexcept #endif /* _WIN32 */ } -static bool SetDaemonIO(const String& stderrFile) +static void CloseStdIO(const String& stderrFile) { #ifndef _WIN32 int fdnull = open("/dev/null", O_RDWR); @@ -147,14 +155,7 @@ static bool SetDaemonIO(const String& stderrFile) if (fderr > 2) close(fderr); } - - pid_t sid = setsid(); - if (sid == -1) { - return false; - } #endif - - return true; } String DaemonCommand::GetDescription() const @@ -174,9 +175,10 @@ void DaemonCommand::InitParameters(boost::program_options::options_description& ("config,c", po::value >(), "parse a configuration file") ("no-config,z", "start without a configuration file") ("validate,C", "exit after validating the configuration") - ("errorlog,e", po::value(), "log fatal errors to the specified log file (only works in combination with --daemonize)") + ("errorlog,e", po::value(), "log fatal errors to the specified log file (only works in combination with --daemonize or --close-stdio)") #ifndef _WIN32 ("daemonize,d", "detach from the controlling terminal") + ("close-stdio", "do not log to stdout (or stderr) after startup") #endif /* _WIN32 */ ; @@ -290,12 +292,16 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector(); - SetDaemonIO(errorLog); + CloseStdIO(errorLog); Logger::DisableConsoleLog(); } From 17c713117716289e9249106a6ee1cc1ad36fe283 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sat, 25 Aug 2018 19:35:01 +0200 Subject: [PATCH 0164/1162] Move new downtime constants into the Icinga namespace --- lib/icinga/downtime.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 6e5bc0210..aafefadb2 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -46,9 +46,9 @@ INITIALIZE_ONCE(&Downtime::StaticInitialize); void Downtime::StaticInitialize() { - ScriptGlobal::Set("DowntimeNoChildren", "DowntimeNoChildren"); - ScriptGlobal::Set("DowntimeTriggeredChildren", "DowntimeTriggeredChildren"); - ScriptGlobal::Set("DowntimeNonTriggeredChildren", "DowntimeNonTriggeredChildren"); + ScriptGlobal::Set("Icinga.DowntimeNoChildren", "DowntimeNoChildren", true); + ScriptGlobal::Set("Icinga.DowntimeTriggeredChildren", "DowntimeTriggeredChildren", true); + ScriptGlobal::Set("Icinga.DowntimeNonTriggeredChildren", "DowntimeNonTriggeredChildren", true); } String DowntimeNameComposer::MakeName(const String& shortName, const Object::Ptr& context) const From 6fa76ea498d3d240534e1dd2840f10cc83e70f0e Mon Sep 17 00:00:00 2001 From: Jeon Sang Wan Date: Sun, 2 Sep 2018 22:11:19 +0900 Subject: [PATCH 0165/1162] Edited INSTALL.md File Edited the Mistake of the PostgreSQL_LIBRARY_DIR comment error. #6582 --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 044ea507d..10c3cd40a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -193,7 +193,7 @@ The following settings can be tuned for the PostgreSQL IDO feature. - `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON` - `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories -- `PostgreSQL_LIBRARY_DIR`: Top-level directory containing the PostgreSQL libraries +- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file) See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation. From bc844aca0604c31b77a00f282d56165bc8ef3c2d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Sep 2018 15:32:28 +0200 Subject: [PATCH 0166/1162] Fix non-unity builds on CentOS 7 with std::shared_ptr refs #6509 --- lib/base/namespace.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/base/namespace.hpp b/lib/base/namespace.hpp index 21ebe929b..eb4928620 100644 --- a/lib/base/namespace.hpp +++ b/lib/base/namespace.hpp @@ -26,6 +26,7 @@ #include "base/debuginfo.hpp" #include #include +#include namespace icinga { From 64305b44665498893760c60d3549b0b685d5432a Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Sep 2018 16:47:38 +0200 Subject: [PATCH 0167/1162] Fix using full path in prepare-dirs/safe-reload scripts This won't be visible with packages and overridden paths, just source builds which invoke the scripts manually. refs #6506 --- etc/initsystem/prepare-dirs.cmake | 6 +++--- etc/initsystem/safe-reload.cmake | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake index c0d96bdac..99dc60223 100644 --- a/etc/initsystem/prepare-dirs.cmake +++ b/etc/initsystem/prepare-dirs.cmake @@ -17,9 +17,9 @@ fi : ${ICINGA2_USER:="@ICINGA2_USER@"} : ${ICINGA2_GROUP:="@ICINGA2_GROUP@"} : ${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"} -: ${ICINGA2_INIT_RUN_DIR:="@ICINGA2_INITRUNDIR@"} -: ${ICINGA2_LOG_DIR:="@ICINGA2_LOGDIR@"} -: ${ICINGA2_CACHE_DIR:="@ICINGA2_CACHEDIR@"} +: ${ICINGA2_INIT_RUN_DIR:="@ICINGA2_FULL_INITRUNDIR@"} +: ${ICINGA2_LOG_DIR:="@ICINGA2_FULL_LOGDIR@"} +: ${ICINGA2_CACHE_DIR:="@ICINGA2_FULL_CACHEDIR@"} getent passwd $ICINGA2_USER >/dev/null 2>&1 || (echo "Icinga user '$ICINGA2_USER' does not exist. Exiting." && exit 6) getent group $ICINGA2_GROUP >/dev/null 2>&1 || (echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." && exit 6) diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake index a71ae9db5..a042fc66f 100644 --- a/etc/initsystem/safe-reload.cmake +++ b/etc/initsystem/safe-reload.cmake @@ -11,7 +11,7 @@ fi # Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" -: ${ICINGA2_PID_FILE:="@ICINGA2_INITRUNDIR@/icinga2.pid"} +: ${ICINGA2_PID_FILE:="@ICINGA2_FULL_INITRUNDIR@/icinga2.pid"} : ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"} printf "Validating config files: " From c721c302cd9c96bee25a20b3862dad347345648a Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 31 Aug 2018 13:11:50 +0200 Subject: [PATCH 0168/1162] Shuffle items before config validation --- lib/config/configitem.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 47b7e327c..9ac4fddaf 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -39,6 +39,8 @@ #include #include #include +#include +#include using namespace icinga; @@ -437,6 +439,10 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (items.empty()) return true; + // Shuffle all items to evenly distribute them over the threads of the workqueue. This increases perfomance + // noticably in environments with lots of objects and available threads. + std::shuffle(std::begin(items), std::end(items), std::default_random_engine {}); + for (const auto& ip : items) newItems.push_back(ip.first); From 13a8fa20f9e59f1c97bf6684f2f6724da59f6c5c Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 9 Aug 2018 11:55:20 +0200 Subject: [PATCH 0169/1162] Ensure that config object types are committed in dependent load order --- lib/config/configitem.cpp | 90 +++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 9ac4fddaf..258f38a35 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -443,27 +443,22 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue // noticably in environments with lots of objects and available threads. std::shuffle(std::begin(items), std::end(items), std::default_random_engine {}); +#ifdef I2_DEBUG + Log(LogDebug, "configitem") + << "Committing " << items.size() << " new items."; +#endif /* I2_DEBUG */ + for (const auto& ip : items) newItems.push_back(ip.first); - upq.ParallelFor(items, [](const ItemPair& ip) { - ip.first->Commit(ip.second); - }); - - upq.Join(); - - if (upq.HasExceptions()) - return false; - std::set types; + std::set completed_types; for (const Type::Ptr& type : Type::GetAllTypes()) { if (ConfigObject::TypeInstance->IsAssignableFrom(type)) types.insert(type); } - std::set completed_types; - while (types.size() != completed_types.size()) { for (const Type::Ptr& type : types) { if (completed_types.find(type) != completed_types.end()) @@ -483,7 +478,60 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (unresolved_dep) continue; - upq.ParallelFor(items, [&type](const ItemPair& ip) { + int commited_items = 0; + upq.ParallelFor(items, [&type, &commited_items](const ItemPair& ip) { + const ConfigItem::Ptr& item = ip.first; + + if (item->m_Type != type) + return; + + ip.first->Commit(ip.second); + commited_items++; + }); + + upq.Join(); + + completed_types.insert(type); + +#ifdef I2_DEBUG + if (commited_items > 0) + Log(LogDebug, "configitem") + << "Committed " << commited_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + + if (upq.HasExceptions()) + return false; + } + } + +#ifdef I2_DEBUG + Log(LogDebug, "configitem") + << "Committed " << items.size() << " items."; +#endif /* I2_DEBUG */ + + completed_types.clear(); + + while (types.size() != completed_types.size()) { + for (const Type::Ptr& type : types) { + if (completed_types.find(type) != completed_types.end()) + continue; + + bool unresolved_dep = false; + + /* skip this type (for now) if there are unresolved load dependencies */ + for (const String& loadDep : type->GetLoadDependencies()) { + Type::Ptr pLoadDep = Type::GetByName(loadDep); + if (types.find(pLoadDep) != types.end() && completed_types.find(pLoadDep) == completed_types.end()) { + unresolved_dep = true; + break; + } + } + + if (unresolved_dep) + continue; + + int notified_items = 0; + upq.ParallelFor(items, [&type, ¬ified_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (!item->m_Object || item->m_Type != type) @@ -491,6 +539,7 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue try { item->m_Object->OnAllConfigLoaded(); + notified_items++; } catch (const std::exception& ex) { if (!item->m_IgnoreOnError) throw; @@ -511,11 +560,18 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue upq.Join(); +#ifdef I2_DEBUG + if (notified_items > 0) + Log(LogDebug, "configitem") + << "Sent OnAllConfigLoaded to " << notified_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + if (upq.HasExceptions()) return false; + notified_items = 0; for (const String& loadDep : type->GetLoadDependencies()) { - upq.ParallelFor(items, [loadDep, &type](const ItemPair& ip) { + upq.ParallelFor(items, [loadDep, &type, ¬ified_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (!item->m_Object || item->m_Type->GetName() != loadDep) @@ -523,14 +579,22 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue ActivationScope ascope(item->m_ActivationContext); item->m_Object->CreateChildObjects(type); + notified_items++; }); } upq.Join(); +#ifdef I2_DEBUG + if (notified_items > 0) + Log(LogDebug, "configitem") + << "Sent CreateChildObjects to " << notified_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + if (upq.HasExceptions()) return false; + // Make sure to activate any additionally generated items if (!CommitNewItems(context, upq, newItems)) return false; } From 8fe490f945e69f6d91eea6228bbc73f7942fb641 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 22 Aug 2018 15:12:47 +0200 Subject: [PATCH 0170/1162] Update variable names --- lib/config/configitem.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 258f38a35..f435c9481 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -478,15 +478,15 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (unresolved_dep) continue; - int commited_items = 0; - upq.ParallelFor(items, [&type, &commited_items](const ItemPair& ip) { + int committed_items = 0; + upq.ParallelFor(items, [&type, &committed_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (item->m_Type != type) return; ip.first->Commit(ip.second); - commited_items++; + committed_items++; }); upq.Join(); @@ -494,9 +494,9 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue completed_types.insert(type); #ifdef I2_DEBUG - if (commited_items > 0) + if (committed_items > 0) Log(LogDebug, "configitem") - << "Committed " << commited_items << " items of type '" << type->GetName() << "'."; + << "Committed " << committed_items << " items of type '" << type->GetName() << "'."; #endif /* I2_DEBUG */ if (upq.HasExceptions()) From e1a963f0accd8febf21d1bf68682e9fffa3fb837 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Tue, 4 Sep 2018 13:33:48 +0200 Subject: [PATCH 0171/1162] Update workaround for custom vars This updates #6572 which did not work --- doc/16-upgrading-icinga-2.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index f483ff0e3..266e073f5 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -147,18 +147,20 @@ mix of local FQDN, timestamps and random numbers. ### Custom Vars not updating A rare issue preventing the custom vars of objects created prior to 2.9.0 being updated when changed may occur. To -remedy this the config checksums of the affected type need to be reset to trigger a full update. The following is an -example of how to do this for Hosts in mysql: +remedy this, truncate the customvar tables and restart Icinga 2. The following is an example of how to do this with mysql: ``` $ mysql -uroot -picinga icinga -MariaDB [icinga]> UPDATE icinga_hosts SET config_hash = NULL; +MariaDB [icinga]> truncate icinga_customvariables; +Query OK, 0 rows affected (0.05 sec) +MariaDB [icinga]> truncate icinga_customvariablestatus; +Query OK, 0 rows affected (0.03 sec) MariaDB [icinga]> exit Bye $ sudo systemctl restart icinga2 ``` -Custom vars should now be up to date. +Custom vars should now stay up to date. ## Upgrading to v2.8.2 From 19993df380dd0fa65c8faddab6f6b3e6099425db Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Sep 2018 13:17:34 +0000 Subject: [PATCH 0172/1162] Fix static initializer priority for namespaces in LTO builds fixes #6575 --- lib/base/function.hpp | 1 + lib/base/objecttype.cpp | 1 + lib/base/primitivetype.hpp | 1 + lib/base/scriptframe.cpp | 6 +++++- lib/base/type.cpp | 1 + lib/base/type.hpp | 1 + lib/cli/daemonutility.cpp | 5 ++++- lib/config/configfragment.hpp | 1 + lib/icinga/icingaapplication.cpp | 9 +++++++-- 9 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/base/function.hpp b/lib/base/function.hpp index 493be13ee..3eb7ce98d 100644 --- a/lib/base/function.hpp +++ b/lib/base/function.hpp @@ -72,6 +72,7 @@ private: bool side_effect_free, bool deprecated); }; +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ #define REGISTER_FUNCTION(ns, name, callback, args) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ Function::Ptr sf = new icinga::Function(#ns "#" #name, callback, String(args).Split(":"), false); \ diff --git a/lib/base/objecttype.cpp b/lib/base/objecttype.cpp index d77bfcdae..eff6696c9 100644 --- a/lib/base/objecttype.cpp +++ b/lib/base/objecttype.cpp @@ -23,6 +23,7 @@ using namespace icinga; +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ INITIALIZE_ONCE_WITH_PRIORITY([]() { Type::Ptr type = new ObjectType(); type->SetPrototype(Object::GetPrototype()); diff --git a/lib/base/primitivetype.hpp b/lib/base/primitivetype.hpp index 45ae8411a..61cedb6cb 100644 --- a/lib/base/primitivetype.hpp +++ b/lib/base/primitivetype.hpp @@ -48,6 +48,7 @@ private: ObjectFactory m_Factory; }; +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ #define REGISTER_BUILTIN_TYPE(type, prototype) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ icinga::Type::Ptr t = new PrimitiveType(#type, "None"); \ diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index 90407613e..36f75284e 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -29,6 +29,10 @@ boost::thread_specific_ptr > ScriptFrame::m_ScriptFram static auto l_InternalNSBehavior = new ConstNamespaceBehavior(); +/* Ensure that this gets called with highest priority + * and wins against other static initializers in lib/icinga, etc. + * LTO-enabled builds will cause trouble otherwise, see GH #6575. + */ INITIALIZE_ONCE_WITH_PRIORITY([]() { Namespace::Ptr globalNS = ScriptGlobal::GetGlobals(); @@ -51,7 +55,7 @@ INITIALIZE_ONCE_WITH_PRIORITY([]() { Namespace::Ptr internalNS = new Namespace(l_InternalNSBehavior); globalNS->SetAttribute("Internal", std::make_shared(internalNS)); -}, 50); +}, 1000); INITIALIZE_ONCE_WITH_PRIORITY([]() { l_InternalNSBehavior->Freeze(); diff --git a/lib/base/type.cpp b/lib/base/type.cpp index b8bddd7fb..a010d55a0 100644 --- a/lib/base/type.cpp +++ b/lib/base/type.cpp @@ -26,6 +26,7 @@ using namespace icinga; Type::Ptr Type::TypeInstance; +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ INITIALIZE_ONCE_WITH_PRIORITY([]() { Type::Ptr type = new TypeType(); type->SetPrototype(TypeType::GetPrototype()); diff --git a/lib/base/type.hpp b/lib/base/type.hpp index ef8ce6d23..a8fb7dc89 100644 --- a/lib/base/type.hpp +++ b/lib/base/type.hpp @@ -138,6 +138,7 @@ class TypeImpl { }; +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ #define REGISTER_TYPE(type) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ icinga::Type::Ptr t = new TypeImpl(); \ diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index ea1630c8a..cddbf4ec5 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -21,11 +21,11 @@ #include "base/utility.hpp" #include "base/logger.hpp" #include "base/application.hpp" +#include "base/scriptglobal.hpp" #include "config/configcompiler.hpp" #include "config/configcompilercontext.hpp" #include "config/configitembuilder.hpp" - using namespace icinga; static bool ExecuteExpression(Expression *expression) @@ -146,6 +146,9 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector& configs, return false; Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + VERIFY(systemNS); + + /* This is initialized inside the IcingaApplication class. */ Value vAppType; VERIFY(systemNS->Get("ApplicationType", &vAppType)); diff --git a/lib/config/configfragment.hpp b/lib/config/configfragment.hpp index bd3c5939b..cbc772737 100644 --- a/lib/config/configfragment.hpp +++ b/lib/config/configfragment.hpp @@ -26,6 +26,7 @@ #include "base/exception.hpp" #include "base/application.hpp" +/* Ensure that the priority is lower than the basic namespace initialization in scriptframe.cpp. */ #define REGISTER_CONFIG_FRAGMENT(name, fragment) \ INITIALIZE_ONCE_WITH_PRIORITY([]() { \ std::unique_ptr expression = icinga::ConfigCompiler::CompileText(name, fragment); \ diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index 28ca04bbd..a8d7104b3 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -41,6 +41,7 @@ using namespace icinga; static Timer::Ptr l_RetentionTimer; REGISTER_TYPE(IcingaApplication); +/* Ensure that the priority is lower than the basic System namespace initialization in scriptframe.cpp. */ INITIALIZE_ONCE_WITH_PRIORITY(&IcingaApplication::StaticInitialize, 50); void IcingaApplication::StaticInitialize() @@ -59,11 +60,15 @@ void IcingaApplication::StaticInitialize() ScriptGlobal::Set("NodeName", node_name); - ScriptGlobal::Set("System.ApplicationType", "IcingaApplication", true); + Namespace::Ptr systemNS = ScriptGlobal::Get("System"); + /* Ensure that the System namespace is already initialized. Otherwise this is a programming error. */ + VERIFY(systemNS); - ScriptGlobal::Set("System.ApplicationVersion", Application::GetAppVersion(), true); + systemNS->Set("ApplicationType", "IcingaApplication", true); + systemNS->Set("ApplicationVersion", Application::GetAppVersion(), true); Namespace::Ptr globalNS = ScriptGlobal::GetGlobals(); + VERIFY(globalNS); auto icingaNSBehavior = new ConstNamespaceBehavior(); icingaNSBehavior->Freeze(); From 46163700b4c18cd234fac17ddc4ec55d29576ce2 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 23 Aug 2018 22:08:02 +0200 Subject: [PATCH 0173/1162] Include api user configuration file during api setup refs #6557 --- lib/cli/apisetuputility.cpp | 9 ++++++++ lib/cli/nodeutility.cpp | 43 +++++++++++++++++++++++++++++++++++++ lib/cli/nodeutility.hpp | 1 + 3 files changed, 53 insertions(+) diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 640a878c9..141bc94d0 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -198,6 +198,15 @@ bool ApiSetupUtility::SetupMasterApiUser() bool ApiSetupUtility::SetupMasterEnableApi() { + /* + * Ensure the api-users.conf file is included, when conf.d inclusion is disabled. + */ + if (!NodeUtility::GetConfigurationIncludeState("\"conf.d\"", true)) + NodeUtility::UpdateConfiguration("\"conf.d/api-users.conf\"", true, false); + + /* + * Enable the API feature + */ Log(LogInformation, "cli", "Enabling the 'api' feature."); FeatureUtility::EnableFeatures({ "api" }); diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index 101607fe0..4d9fc2378 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -265,6 +265,49 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec fp << "}\n\n"; } +/* +* Returns true if the include is found, otherwise false +*/ +bool NodeUtility::GetConfigurationIncludeState(const String& value, bool recursive) { + String configurationFile = Application::GetConst("ConfigDir") + "/icinga2.conf"; + + Log(LogInformation, "cli") + << "Reading '" << configurationFile << "'."; + + std::ifstream ifp(configurationFile.CStr()); + + String affectedInclude = value; + + if (recursive) + affectedInclude = "include_recursive " + affectedInclude; + else + affectedInclude = "include " + affectedInclude; + + bool isIncluded = false; + + std::string line; + + while(std::getline(ifp, line)) { + /* + * Trying to find if the inclusion is enabled. + * First hit breaks out of the loop. + */ + + if (!line.compare(affectedInclude)) { + isIncluded = true; + + /* + * We can safely break out here, since an enabled include always win. + */ + break; + } + } + + ifp.close(); + + return isIncluded; +} + /* * include = false, will comment out the include statement * include = true, will add an include statement or uncomment a statement if one is existing diff --git a/lib/cli/nodeutility.hpp b/lib/cli/nodeutility.hpp index 3017a8ead..b25381905 100644 --- a/lib/cli/nodeutility.hpp +++ b/lib/cli/nodeutility.hpp @@ -44,6 +44,7 @@ public: static bool WriteNodeConfigObjects(const String& filename, const Array::Ptr& objects); + static bool GetConfigurationIncludeState(const String& value, bool recursive); static bool UpdateConfiguration(const String& value, bool include, bool recursive); static void UpdateConstant(const String& name, const String& value); From cc417ca1760189f9cf305e6bfa5f1bb991061868 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Tue, 4 Sep 2018 18:56:54 +0200 Subject: [PATCH 0174/1162] Fix CI builds --- lib/cli/nodeutility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index 4d9fc2378..d7ea8bce3 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -269,7 +269,7 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec * Returns true if the include is found, otherwise false */ bool NodeUtility::GetConfigurationIncludeState(const String& value, bool recursive) { - String configurationFile = Application::GetConst("ConfigDir") + "/icinga2.conf"; + String configurationFile = Configuration::ConfigDir + "/icinga2.conf"; Log(LogInformation, "cli") << "Reading '" << configurationFile << "'."; From 4afeda475817a74c9202cdbbeb3f1ee62d07d0fc Mon Sep 17 00:00:00 2001 From: dominik-r-s <43005480+dominik-r-s@users.noreply.github.com> Date: Wed, 5 Sep 2018 16:46:36 +0200 Subject: [PATCH 0175/1162] 09-object-types: notifications: states filter ignored for Acknowledgements! --- doc/09-object-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 4945b18ec..cf73e7c0c 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1137,7 +1137,7 @@ Configuration Attributes: period | Object name | **Optional.** The name of a time period which determines when this notification should be triggered. Not set by default. zone | Object name | **Optional.** The zone this object is a member of. Please read the [distributed monitoring](06-distributed-monitoring.md#distributed-monitoring) chapter for details. types | Array | **Optional.** A list of type filters when this notification should be triggered. By default everything is matched. - states | Array | **Optional.** A list of state filters when this notification should be triggered. By default everything is matched. + states | Array | **Optional.** A list of state filters when this notification should be triggered. By default everything is matched. Note that the states filter is ignored for notifications of type Acknowledgement! Available notification state filters for Service: From a1ec919f5b75508f060d38ef3359a8091afeacf4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Sep 2018 17:44:05 +0200 Subject: [PATCH 0176/1162] Raise the message size for anonymous client and pki request calls to 1MB If one sends the full certificate chain, this previous limit of 64KB could be hit. --- lib/remote/jsonrpcconnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 0022d5072..3733cdb45 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -248,7 +248,8 @@ void JsonRpcConnection::MessageHandler(const String& jsonString) bool JsonRpcConnection::ProcessMessage() { - ssize_t maxMessageLength = 64 * 1024; + /* Limit for anonymous clients (signing requests and not configured endpoints. */ + ssize_t maxMessageLength = 1024 * 1024; if (m_Endpoint) maxMessageLength = -1; /* no limit */ From 9a75f47fc5b6d53f686d2da05da3077abf647a7f Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Sep 2018 17:45:35 +0200 Subject: [PATCH 0177/1162] Allow to configure anonymous clients limit inside the ApiListener object Previously this was hardcoded, and for security reasons users might want to adjust this value. This affects CSR signing requests as well as clients which have not yet been configured as endpoints on the current node. refs #6566 --- doc/09-object-types.md | 1 + doc/16-upgrading-icinga-2.md | 8 ++++++++ lib/remote/apilistener.cpp | 13 ++++++++----- lib/remote/apilistener.ti | 3 +++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 4945b18ec..4c73a9057 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -61,6 +61,7 @@ Configuration Attributes: bind\_port | Number | **Optional.** The port the api listener should be bound to. Defaults to `5665`. accept\_config | Boolean | **Optional.** Accept zone configuration. Defaults to `false`. accept\_commands | Boolean | **Optional.** Accept remote commands. Defaults to `false`. + max\_anonymous\_clients | Number | **Optional.** Limit the number of anonymous client connections (not configured endpoints and signing requests). cipher\_list | String | **Optional.** Cipher list that is allowed. For a list of available ciphers run `openssl ciphers`. Defaults to `ALL:!LOW:!WEAK:!MEDIUM:!EXP:!NULL`. tls\_protocolmin | String | **Optional.** Minimum TLS protocol version. Must be one of `TLSv1`, `TLSv1.1` or `TLSv1.2`. Defaults to `TLSv1`. access\_control\_allow\_origin | Array | **Optional.** Specifies an array of origin URLs that may access the API. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Origin) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 266e073f5..9c8d79a23 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -49,6 +49,14 @@ New [Icinga constants](17-language-reference.md#icinga-constants) have been adde The keywords `namespace` and `using` are now [reserved](17-language-reference.md#reserved-keywords) for the namespace functionality provided with v2.10. Read more about how it works [here](17-language-reference.md#namespaces). +### Configuration: ApiListener + +Anonymous JSON-RPC connections in the cluster can now be configured with `max_anonymous_clients` +attribute. +The corresponding REST API results from `/v1/status/ApiListener` in `json_rpc` have been renamed +from `clients` to `anonymous_clients` to better reflect their purpose. Authenticated clients +are counted as connected endpoints. A similar change is there for the performance data metrics. + ### API: schedule-downtime Action The attribute `child_options` was previously accepting 0,1,2 for specific child downtime settings. diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 0750f7892..425ca6cc8 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -566,7 +566,9 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri m_SyncQueue.Enqueue(std::bind(&ApiListener::SyncClient, this, aclient, endpoint, needSync)); } else { if (!AddAnonymousClient(aclient)) { - Log(LogNotice, "ApiListener", "Ignoring anonymous JSON-RPC connection. Max connections exceeded."); + Log(LogNotice, "ApiListener") + << "Ignoring anonymous JSON-RPC connection " << conninfo + << ". Max connections (" << GetMaxAnonymousClients() << ") exceeded."; aclient->Disconnect(); } } @@ -1315,7 +1317,7 @@ std::pair ApiListener::GetStatus() } /* connection stats */ - size_t jsonRpcClients = GetAnonymousClients().size(); + size_t jsonRpcAnonymousClients = GetAnonymousClients().size(); size_t httpClients = GetHttpClients().size(); size_t workQueueItems = JsonRpcConnection::GetWorkQueueLength(); size_t workQueueCount = JsonRpcConnection::GetWorkQueueCount(); @@ -1336,7 +1338,7 @@ std::pair ApiListener::GetStatus() { "zones", connectedZones }, { "json_rpc", new Dictionary({ - { "clients", jsonRpcClients }, + { "anonymous_clients", jsonRpcAnonymousClients }, { "work_queue_items", workQueueItems }, { "work_queue_count", workQueueCount }, { "sync_queue_items", syncQueueItems }, @@ -1356,7 +1358,7 @@ std::pair ApiListener::GetStatus() perfdata->Set("num_conn_endpoints", Convert::ToDouble(allConnectedEndpoints->GetLength())); perfdata->Set("num_not_conn_endpoints", Convert::ToDouble(allNotConnectedEndpoints->GetLength())); - perfdata->Set("num_json_rpc_clients", jsonRpcClients); + perfdata->Set("num_json_rpc_anonymous_clients", jsonRpcAnonymousClients); perfdata->Set("num_http_clients", httpClients); perfdata->Set("num_json_rpc_work_queue_items", workQueueItems); perfdata->Set("num_json_rpc_work_queue_count", workQueueCount); @@ -1384,7 +1386,8 @@ double ApiListener::CalculateZoneLag(const Endpoint::Ptr& endpoint) bool ApiListener::AddAnonymousClient(const JsonRpcConnection::Ptr& aclient) { boost::mutex::scoped_lock lock(m_AnonymousClientsLock); - if (m_AnonymousClients.size() > 100) + + if (GetMaxAnonymousClients() >= 0 && m_AnonymousClients.size() + 1 > GetMaxAnonymousClients()) return false; m_AnonymousClients.insert(aclient); diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index e4227a6d1..b98dae1cb 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -50,6 +50,9 @@ class ApiListener : ConfigObject [config] bool accept_config; [config] bool accept_commands; + [config] int max_anonymous_clients { + default {{{ return -1; }}} + }; [config] String ticket_salt; From 1f4f6282c7d1d30c05aea257df9cebe1805550fa Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Sep 2018 20:42:55 +0200 Subject: [PATCH 0178/1162] Fix crash on API queries with Fedora 28 hardening and GCC 8 The actual fix is to handle nullptr references differently for an empty filter expression. The other changes include oob checks not necesarily involved. fixes #6533 --- lib/remote/filterutility.cpp | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/remote/filterutility.cpp b/lib/remote/filterutility.cpp index f17c5e3d4..7cf175673 100644 --- a/lib/remote/filterutility.cpp +++ b/lib/remote/filterutility.cpp @@ -127,7 +127,7 @@ static void FilteredAddTarget(ScriptFrame& permissionFrame, Expression *permissi ScriptFrame& frame, Expression *ufilter, std::vector& result, const String& variableName, const Object::Ptr& target) { if (FilterUtility::EvaluateFilter(permissionFrame, permissionFilter, target, variableName) && FilterUtility::EvaluateFilter(frame, ufilter, target, variableName)) - result.emplace_back(target); + result.emplace_back(std::move(target)); } void FilterUtility::CheckPermission(const ApiUser::Ptr& user, const String& permission, Expression **permissionFilter) @@ -206,7 +206,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c if (attr == "type") attr = "name"; - if (query->Contains(attr)) { + if (query && query->Contains(attr)) { String name = HttpUtility::GetLastParameter(query, attr); Object::Ptr target = provider->GetTargetByName(type, name); @@ -219,7 +219,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c attr = provider->GetPluralName(type); boost::algorithm::to_lower(attr); - if (query->Contains(attr)) { + if (query && query->Contains(attr)) { Array::Ptr names = query->Get(attr); if (names) { ObjectLock olock(names); @@ -235,7 +235,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c } } - if (query->Contains("filter") || result.empty()) { + if ((query && query->Contains("filter")) || result.empty()) { if (!query->Contains("type")) BOOST_THROW_EXCEPTION(std::invalid_argument("Type must be specified when using a filter.")); @@ -251,26 +251,31 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c frame.Sandboxed = true; Dictionary::Ptr uvars = new Dictionary(); - std::unique_ptr ufilter; - if (query->Contains("filter")) { String filter = HttpUtility::GetLastParameter(query, "filter"); - ufilter = ConfigCompiler::CompileText("", filter); - } + std::unique_ptr ufilter = ConfigCompiler::CompileText("", filter); - Dictionary::Ptr filter_vars = query->Get("filter_vars"); - if (filter_vars) { - ObjectLock olock(filter_vars); - for (const Dictionary::Pair& kv : filter_vars) { - uvars->Set(kv.first, kv.second); + Dictionary::Ptr filter_vars = query->Get("filter_vars"); + if (filter_vars) { + ObjectLock olock(filter_vars); + for (const Dictionary::Pair& kv : filter_vars) { + uvars->Set(kv.first, kv.second); + } } + + frame.Self = uvars; + + provider->FindTargets(type, std::bind(&FilteredAddTarget, + std::ref(permissionFrame), permissionFilter, + std::ref(frame), &*ufilter, std::ref(result), variableName, _1)); + } else { + /* Ensure to pass a nullptr as filter expression. + * GCC 8.1.1 on F28 causes problems, see GH #6533. + */ + provider->FindTargets(type, std::bind(&FilteredAddTarget, + std::ref(permissionFrame), permissionFilter, + std::ref(frame), nullptr, std::ref(result), variableName, _1)); } - - frame.Self = uvars; - - provider->FindTargets(type, std::bind(&FilteredAddTarget, - std::ref(permissionFrame), permissionFilter, - std::ref(frame), &*ufilter, std::ref(result), variableName, _1)); } return result; From 694a9923573a77eb67125590f5648ab6dc391ad8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Sep 2018 20:44:44 +0200 Subject: [PATCH 0179/1162] Add Fedora to development docs for debuginfo packages --- doc/21-development.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/21-development.md b/doc/21-development.md index cc591e506..94619a412 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -23,6 +23,10 @@ RHEL/CentOS: # yum install icinga2-debuginfo +Fedora: + + # dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo + SLES/openSUSE: # zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo From 3854ed683b2aaca43dac698d9ec31d8acf7cb2e7 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Thu, 6 Sep 2018 15:58:42 +0200 Subject: [PATCH 0180/1162] Improve TLS handshake exception logging --- lib/perfdata/elasticsearchwriter.cpp | 2 +- lib/perfdata/influxdbwriter.cpp | 2 +- lib/remote/apilistener.cpp | 4 ++-- lib/remote/pkiutility.cpp | 5 +++-- lib/remote/pkiutility.hpp | 1 + 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index d9d56b004..c10baf12d 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -434,7 +434,7 @@ void ElasticsearchWriter::SendRequest(const String& body) stream = Connect(); } catch (const std::exception& ex) { Log(LogWarning, "ElasticsearchWriter") - << "Flush failed, cannot connect to Elasticsearch."; + << "Flush failed, cannot connect to Elasticsearch: " << DiagnosticInformation(ex, false); return; } diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 89cf13220..27dd69831 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -425,7 +425,7 @@ void InfluxdbWriter::Flush() stream = Connect(); } catch (const std::exception& ex) { Log(LogWarning, "InfluxDbWriter") - << "Flush failed, cannot connect to InfluxDB."; + << "Flush failed, cannot connect to InfluxDB: " << DiagnosticInformation(ex, false); return; } diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 425ca6cc8..c9cbd3867 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -461,9 +461,9 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri try { tlsStream->Handshake(); - } catch (const std::exception&) { + } catch (const std::exception& ex) { Log(LogCritical, "ApiListener") - << "Client TLS handshake failed (" << conninfo << ")"; + << "Client TLS handshake failed (" << conninfo << "): " << DiagnosticInformation(ex, false); tlsStream->Close(); return; } diff --git a/lib/remote/pkiutility.cpp b/lib/remote/pkiutility.cpp index 20d9ca6c2..915b3ee2e 100644 --- a/lib/remote/pkiutility.cpp +++ b/lib/remote/pkiutility.cpp @@ -187,8 +187,9 @@ int PkiUtility::RequestCertificate(const String& host, const String& port, const try { stream->Handshake(); - } catch (const std::exception&) { - Log(LogCritical, "cli", "Client TLS handshake failed."); + } catch (const std::exception& ex) { + Log(LogCritical, "cli") + << "Client TLS handshake failed: " << DiagnosticInformation(ex, false); return 1; } diff --git a/lib/remote/pkiutility.hpp b/lib/remote/pkiutility.hpp index f73448b8f..8ddd20037 100644 --- a/lib/remote/pkiutility.hpp +++ b/lib/remote/pkiutility.hpp @@ -21,6 +21,7 @@ #define PKIUTILITY_H #include "remote/i2-remote.hpp" +#include "base/exception.hpp" #include "base/dictionary.hpp" #include "base/string.hpp" #include From d09085d72f282083703fdf3e37388d21194dbe63 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 24 Aug 2018 14:50:16 +0200 Subject: [PATCH 0181/1162] Fix operator precedence table Fixes #5573 --- doc/17-language-reference.md | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 380a9a5a2..039e3ad31 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -160,38 +160,38 @@ The following operators are supported in expressions. The operators are sorted b Operator | Precedence | Examples (Result) | Description ---------|------------|-----------------------------------------------|-------------------------------- -() | 1 | (3 + 3) * 5 | Groups sub-expressions -() | 1 | Math.random() | Calls a function -[] | 1 | a[3] | Array subscript -. | 1 | a.b | Element access -! | 2 | !"Hello" (false), !false (true) | Logical negation of the operand -~ | 2 | ~true (false) | Bitwise negation of the operand -+ | 2 | +3 | Unary plus -- | 2 | -3 | Unary minus -& | 2 | &var (reference to 'var') | Reference operator -* | 2 | *var | Indirection operator -* | 3 | 5m * 10 (3000) | Multiplies two numbers -/ | 3 | 5m / 5 (60) | Divides two numbers -% | 3 | 17 % 12 (5) | Remainder after division -+ | 4 | 1 + 3 (4), "hello " + "world" ("hello world") | Adds two numbers; concatenates strings -- | 4 | 3 - 1 (2) | Subtracts two numbers -<< | 5 | 4 << 8 (1024) | Left shift ->> | 5 | 1024 >> 4 (64) | Right shift -< | 6 | 3 < 5 (true) | Less than -> | 6 | 3 > 5 (false) | Greater than -<= | 6 | 3 <= 3 (true) | Less than or equal ->= | 6 | 3 >= 3 (true) | Greater than or equal -in | 7 | "foo" in [ "foo", "bar" ] (true) | Element contained in array -!in | 7 | "foo" !in [ "bar", "baz" ] (true) | Element not contained in array -== | 8 | "hello" == "hello" (true), 3 == 5 (false) | Equal to -!= | 8 | "hello" != "world" (true), 3 != 3 (false) | Not equal to -& | 9 | 7 & 3 (3) | Binary AND -^ | 10 | 17 ^ 12 (29) | Bitwise XOR -| | 11 | 2 | 3 (3) | Binary OR -&& | 13 | true && false (false), 3 && 7 (7), 0 && 7 (0) | Logical AND -|| | 14 | true || false (true), 0 || 7 (7)| Logical OR -= | 12 | a = 3 | Assignment -=> | 15 | x => x * x (function with arg x) | Lambda, for loop +`()` | 1 | (3 + 3) * 5 | Groups sub-expressions +`()` | 1 | Math.random() | Calls a function +`[]` | 1 | a[3] | Array subscript +`.` | 1 | a.b | Element access +`!` | 2 | !"Hello" (false), !false (true) | Logical negation of the operand +`~` | 2 | ~true (false) | Bitwise negation of the operand +`+` | 2 | +3 | Unary plus +`-` | 2 | -3 | Unary minus +`&` | 2 | &var (reference to 'var') | Reference operator +`*` | 2 | *var | Indirection operator +`*` | 3 | 5m * 10 (3000) | Multiplies two numbers +`/` | 3 | 5m / 5 (60) | Divides two numbers +`%` | 3 | 17 % 12 (5) | Remainder after division +`+` | 4 | 1 + 3 (4), "hello " + "world" ("hello world") | Adds two numbers; concatenates strings +`-` | 4 | 3 - 1 (2) | Subtracts two numbers +`<<` | 5 | 4 << 8 (1024) | Left shift +`>>` | 5 | 1024 >> 4 (64) | Right shift +`<` | 6 | 3 < 5 (true) | Less than +`>` | 6 | 3 > 5 (false) | Greater than +`<=` | 6 | 3 <= 3 (true) | Less than or equal +`>=` | 6 | 3 >= 3 (true) | Greater than or equal +`in` | 7 | "foo" in [ "foo", "bar" ] (true) | Element contained in array +`!in` | 7 | "foo" !in [ "bar", "baz" ] (true) | Element not contained in array +`==` | 8 | "hello" == "hello" (true), 3 == 5 (false) | Equal to +`!=` | 8 | "hello" != "world" (true), 3 != 3 (false) | Not equal to +`&` | 9 | 7 & 3 (3) | Binary AND +`^` | 10 | 17 ^ 12 (29) | Bitwise XOR +| | 11 | 2 | 3 (3) | Binary OR +|| | 12 | true || false (true), 0 || 7 (7)| Logical OR +`&&` | 13 | true && false (false), 3 && 7 (7), 0 && 7 (0) | Logical AND +`=` | 14 | a = 3 | Assignment +`=>` | 15 | x => x * x (function with arg x) | Lambda, for loop ### References From f297881e239953c788cedfaa37bf81fb54d10ff6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 10 Sep 2018 16:10:16 +0200 Subject: [PATCH 0182/1162] Call SSL_shutdown() at least twice --- lib/base/tlsstream.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index 33d72d465..0c6a76525 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -401,7 +401,20 @@ void TlsStream::CloseInternal(bool inDestructor) if (!m_SSL) return; - (void)SSL_shutdown(m_SSL.get()); + /* https://www.openssl.org/docs/manmaster/man3/SSL_shutdown.html + * + * It is recommended to do a bidirectional shutdown by checking + * the return value of SSL_shutdown() and call it again until + * it returns 1 or a fatal error. A maximum of 2x pending + 2x data + * is recommended. + */ + int rc = 0; + + for (int i = 0; i < 4; i++) { + if ((rc = SSL_shutdown(m_SSL.get()))) + break; + } + m_SSL.reset(); m_Socket->Close(); From 808276131de3bc0b0c7b09e4bd88d3321da8b405 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 11 Sep 2018 09:23:28 +0200 Subject: [PATCH 0183/1162] Rename branch schema from `fix/` to `bugfix/` --- CONTRIBUTING.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d6992b86..d2fc5fc2d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,12 +64,12 @@ Please continue to learn about [branches](CONTRIBUTING.md#contributing-branches) Choosing a proper name for a branch helps us identify its purpose and possibly find an associated bug or feature. -Generally a branch name should include a topic such as `fix` or `feature` followed +Generally a branch name should include a topic such as `bugfix` or `feature` followed by a description and an issue number if applicable. Branches should have only changes relevant to a specific issue. ``` -git checkout -b fix/service-template-typo-1234 +git checkout -b bugfix/service-template-typo-1234 git checkout -b feature/config-handling-1235 ``` @@ -111,13 +111,13 @@ Don't worry, you can squash those changes into a single commit later on. ## Pull Requests Once you've commited your changes, please update your local master -branch and rebase your fix/feature branch against it before submitting a PR. +branch and rebase your bugfix/feature branch against it before submitting a PR. ``` git checkout master git pull upstream HEAD -git checkout fix/notifications +git checkout bugfix/notifications git rebase master ``` @@ -126,12 +126,12 @@ It might be necessary to force push after rebasing - use with care! New branch: ``` -git push --set-upstream origin fix/notifications +git push --set-upstream origin bugfix/notifications ``` Existing branch: ``` -git push -f origin fix/notifications +git push -f origin bugfix/notifications ``` You can now either use the [hub](https://hub.github.com) CLI tool to create a PR, or nagivate @@ -168,7 +168,7 @@ git pull upstream HEAD Then change to your working branch and start rebasing it against master: ``` -git checkout fix/notifications +git checkout bugfix/notifications git rebase master ``` @@ -192,22 +192,22 @@ git rebase --continue Once succeeded ensure to push your changed history remotely. ``` -git push -f origin fix/notifications +git push -f origin bugfix/notifications ``` If you fear to break things, do the rebase in a backup branch first and later replace your current branch. ``` -git checkout fix/notifications -git checkout -b fix/notifications-rebase +git checkout bugfix/notifications +git checkout -b bugfix/notifications-rebase git rebase master -git branch -D fix/notifications -git checkout -b fix/notifications +git branch -D bugfix/notifications +git checkout -b bugfix/notifications -git push -f origin fix/notifications +git push -f origin bugfix/notifications ``` ### Squash Commits @@ -237,7 +237,7 @@ squash b37fd5377 Doc updates Save and let rebase to its job. Then force push the changes to the remote origin. ``` -git push -f origin fix/notifications +git push -f origin bugfix/notifications ``` @@ -246,7 +246,7 @@ git push -f origin fix/notifications Basic unit test coverage is provided by running `make test` during package builds. Read the [INSTALL.md](INSTALL.md) file for more information about development builds. -Snapshot packages from the laster development branch are available inside the +Snapshot packages from the latest development branch are available inside the [package repository](https://packages.icinga.com). You can help test-drive the latest Icinga 2 snapshot packages inside the @@ -466,7 +466,7 @@ By default, pull requests allow to push into the repository of the PR creator. Example for [#4956](https://github.com/Icinga/icinga2/pull/4956): -At the bottom it says "Add more commits by pushing to the fix/persistent-comments-are-not-persistent branch on TheFlyingCorpse/icinga2." +At the bottom it says "Add more commits by pushing to the bugfix/persistent-comments-are-not-persistent branch on TheFlyingCorpse/icinga2." First off, add the remote repository as additional origin and fetch its content: @@ -478,20 +478,20 @@ git fetch --all Checkout the mentioned remote branch into a local branch (Note: `theflyingcorpse` is the name of the remote): ``` -git checkout theflyingcorpse/fix/persistent-comments-are-not-persistent -b fix/persistent-comments-are-not-persistent +git checkout theflyingcorpse/bugfix/persistent-comments-are-not-persistent -b bugfix/persistent-comments-are-not-persistent ``` Rebase, amend, squash or add your own commits on top. -Once you are satisfied, push the changes to the remote `theflyingcorpse` and its branch `fix/persistent-comments-are-not-persistent`. +Once you are satisfied, push the changes to the remote `theflyingcorpse` and its branch `bugfix/persistent-comments-are-not-persistent`. The syntax here is `git push :`. ``` -git push theflyingcorpse fix/persistent-comments-are-not-persistent:fix/persistent-comments-are-not-persistent +git push theflyingcorpse bugfix/persistent-comments-are-not-persistent:bugfix/persistent-comments-are-not-persistent ``` In case you've changed the commit history (rebase, amend, squash), you'll need to force push. Be careful, this can't be reverted! ``` -git push -f theflyingcorpse fix/persistent-comments-are-not-persistent:fix/persistent-comments-are-not-persistent +git push -f theflyingcorpse bugfix/persistent-comments-are-not-persistent:bugfix/persistent-comments-are-not-persistent ``` From 8b9aed1c7058f2c8bfbda697e890760848e3c340 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 11 Sep 2018 09:30:33 +0200 Subject: [PATCH 0184/1162] Mention 'help wanted' and 'good first issue' in contributing docs --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d2fc5fc2d..3bae78c4a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,6 +23,9 @@ bug reports and features requests or writing code to add enhancements or fix bug Please consider our [roadmap](https://github.com/Icinga/icinga2/milestones) and [open issues](https://github.com/icinga/icinga2/issues) when you start contributing to the project. +Issues labeled with [help wanted](https://github.com/Icinga/icinga2/labels/help%20wanted) or +[good first issue](https://github.com/Icinga/icinga2/labels/good%20first%20issue) will +help you get started more easily. Before starting your work on Icinga 2, you should [fork the project](https://help.github.com/articles/fork-a-repo/) to your GitHub account. This allows you to freely experiment with your changes. From bc4cd50dde5753948c6456ffccaec60d112ecad2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 12 Sep 2018 12:32:00 +0200 Subject: [PATCH 0185/1162] Enhance development docs with GDB backtrace and thread list --- doc/21-development.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/21-development.md b/doc/21-development.md index 94619a412..4565fd94b 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -175,7 +175,20 @@ make sure to attach as much detail as possible. If Icinga 2 is still running, generate a full backtrace from the running process and store it into a new file (e.g. for debugging dead locks): - # gdb -p $(pidof icinga2) -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt.log +Icinga 2 runs with 2 processes, therefore generate two backtrace logs +and add them to the GitHub issue. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done +``` + +### GDB Thread List from Running Process + +Instead of a full backtrace, you sometimes just need a list of running threads. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done +``` ### GDB Backtrace Stepping From 3661705a6e9a3018f4fea449701d0da03e569478 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 12 Sep 2018 14:45:11 +0200 Subject: [PATCH 0186/1162] Add "TLS Network IO" into technical concepts docs refs #6517 --- doc/19-technical-concepts.md | 195 +++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) diff --git a/doc/19-technical-concepts.md b/doc/19-technical-concepts.md index 1932a6097..04e8a9a51 100644 --- a/doc/19-technical-concepts.md +++ b/doc/19-technical-concepts.md @@ -326,3 +326,198 @@ Icinga 2 v2.9+ adds more performance metrics for these values: Icinga 2 provides its own HTTP server which shares the port 5665 with the JSON-RPC cluster protocol. --> + + +## TLS Network IO + +### TLS Connection Handling + +TLS-Handshake timeouts occur if the server is busy with reconnect handling and other tasks which run in isolated threads. Icinga 2 uses threads in many ways, e.g. for timers to wake them up, wait for check results, etc. + +In terms of the cluster communication, the following flow applies. + +#### Master Connects + +* The master initializes the connection in a loop through all known zones it should connect to, extracting the endpoints and their host/port attribute. +* This calls `AddConnection()` whereas a `Tcp::Connect()` is called to create a TCP socket. +* A new thread is spawned for future connection handling, this binds `ApiListener::NewClientHandler()`. +* On top of the TCP socket, a new TLS stream is created. +* The master performs a `TLS->Handshake()` +* Certificates are verified and the endpoint name is compared to the CN. + + +#### Clients Processes Connection + +* The client listens for new incoming connections as 'TCP server' pattern inside `ListenerThreadProc()` with an endless loop. +* Once a new connection is detected, `TCP->Accept()` performs the initial socket establishment. +* A new thread is spawned for future connection handling, this binds `ApiListener::NewClientHandler()`, Role being Server. +* On top of the TCP socket, a new TLS stream is created. +* The client performs a `TLS->Handshake()`. + + +#### Data Transmission between Server and Client Role + +Once the TLS handshake and certificate verification is completed, the role is either `Client` or `Server`. + +* Client: Send "Hello" message. +* Server: `TLS->WaitForData()` waits for incoming messages from the remote client. + +`Client` in this case is the instance which initiated the connection. If the master is doing this, +the Icinga 2 client/agent acts as "server" which accepts incoming connections. + + +### Asynchronous Socket IO + +Everything runs through TLS, we don't use any "raw" connections nor plain message handling. + +The TLS handshake and further read/write operations are not performed in a synchronous fashion +in the new client's thread. Instead, all clients share an asynchronous "event pool". + +The TlsStream constructor registers a new SocketEvent by calling its constructor. It binds the +previously created TCP socket and itself into the created SocketEvent object. + +`SocketEvent::InitializeEngine()` takes care of whether to use **epoll** (Linux) or +**poll** (BSD, Unix, Windows) as preferred socket poll engine. epoll has proven to be +faster on Linux systems. + +The selected engine is stored as `l_SocketIOEngine` and later `Start()` ensures to do the following: + +* Use a fixed number for creating IO threads. +* Create a `dumb_socketpair` which basically is a pipe from `in->out` and multiplexes the TCP socket +into a local Unix socket. This removes the complexity and slowlyness of the kernel dealing with the TCP stack and new events. +* `InitializeThread()` prepares epoll with `epoll_create`, socket descriptors and event mapping for later wakeup. +* Each event FD has its own "worker event thread" which deals with incoming data, called `ThreadProc` as endless loop. + +By default, there are 8 of these worker threads. + +In the `ThreadProc` loop, the following happens: + +* `epoll_wait` gets called and provides an event whether new data is `ready` (via socket IO from the Kernel). +* The event created with `epoll_event` holds the `.fd.data` attribute which references the multiplexed event FD (and therefore tcp socket FD). +* All events in this cycle are stored with their descriptors in a list. +* Once the epoll loop is finished, the collected events are processed and the socketevent descriptor (which is the TlsStream object) calls `OnEvent()`. + +#### On Socket Event State Machine + +`OnEvent` implements the "state machine" depending on the current desired action. By default, this is `TlsActionNone`. + +Once `TlsStream->Handshake()` is called, this initializes the current action to +`TlsActionHandshake` and performs `SSL_do_handshake()`. This function returns > 0 +when successful, anything below needs to be dealt separately. + +If the handshake was successful, the registered condition variable `m_CV` gets signalled +and the thread waiting for the handshake in `TlsStream->Handshake()` wakes up and continues +within the `ApiListener::NewClientHandler()` function. + +Once the handshake is completed, current action is changed to either `TlsActionRead` or `TlsActionWrite`. +This happens in the beginning of the state machine when there is no action selected yet. + +* **Read**: Received events indicate POLLIN (or POLLERR/POLLHUP as error, but normally mean "read"). +* **Write**: The send buffer of the TLS stream is greater 0 bytes, and the received events allow POLLOUT on the event socket. +* Nothing matched: Change the event sockets to POLLIN ("read"), and return, waiting for the next event. + +This also depends on the returned error codes of the SSL interface functions. Whenever `SSL_WANT_READ` occurs, +the event polling needs be changed to use `POLLIN`, vice versa for `SSL_WANT_WRITE` and `POLLOUT`. + +In the scenario where the master actively connects to the clients, the client will wait for data and +change the event sockets to `Read` once there's something coming on the sockets. + +Action | Description +---------------|--------------- +Read | Calls `SSL_read()` with a fixed buffer size of 64 KB. If rc > 0, the receive buffer of the TLS stream is filled and success indicated. This endless loop continues until a) `SSL_pending()` says no more data from remote b) Maximum bytes are read. If `success` is true, the condition variable notifies the thread in `WaitForData` to wake up. +Write | The send buffer of the TLS stream `Peek()`s the first 64KB and calls `SSL_write()` to send them over the socket. The returned value is the number of bytes written, this is adjusted within the send buffer in the `Read()` call (it also optimizes the memory usage). +Handshake | Calls `SSL_do_handshake()` and if successful, the condition variable wakes up the thread waiting for it in `Handshake()`. + +##### TLS Error Handling + +TLS error code | Description +-------------------------|------------------------- +`SSL_WANT_READ` | The next event should read again, change events to `POLLIN`. +`SSL_ERROR_WANT_WRITE` | The next event should write, change events to `POLLOUT`. +`SSL_ERROR_ZERO_RETURN` | Nothing was returned, close the TLS stream and immediately return. +default | Extract the error code and log a fancy error for the user. Close the connection. + +From this [question](https://stackoverflow.com/questions/3952104/how-to-handle-openssl-ssl-error-want-read-want-write-on-non-blocking-sockets): + +``` +With non-blocking sockets, SSL_WANT_READ means "wait for the socket to be readable, then call this function again."; conversely, SSL_WANT_WRITE means "wait for the socket to be writeable, then call this function again.". You can get either SSL_WANT_WRITE or SSL_WANT_READ from both an SSL_read() or SSL_write() call. +``` + + +##### Successful TLS Actions + +* Initialize the next TLS action to `none`. This re-evaluates the conditions upon next event call. +* If the stream still contains data, adjust the socket events. + * If the send buffer contains data, change events to `POLLIN|POLLOUT`. + * Otherwise `POLLIN` to wait for data. +* Process data when the receive buffer has them available and we are actively handling events. +* If the TLS stream is supposed to shutdown, close everything including the TLS connection. + +#### Data Processing + +Once a stream has data available, it calls `SignalDataAvailable()`. This holds a condition +variable which wakes up another thread in a handled which was previously registered, e.g. +for JsonRpcConnection, HttpServerConnection or HttpClientConnection objects. + +All of them read data from the stream and process the messages. At this point the string is available as JSON already and later decoded (e.g. Icinga data structures, as Dictionary). + + + +### General Design Patterns + +Taken from https://www.ibm.com/developerworks/aix/library/au-libev/index.html + +``` +One of the biggest problems facing many server deployments, particularly web server deployments, is the ability to handle a large number of connections. Whether you are building cloud-based services to handle network traffic, distributing your application over IBM Amazon EC instances, or providing a high-performance component for your web site, you need to be able to handle a large number of simultaneous connections. + +A good example is the recent move to more dynamic web applications, especially those using AJAX techniques. If you are deploying a system that allows many thousands of clients to update information directly within a web page, such as a system providing live monitoring of an event or issue, then the speed at which you can effectively serve the information is vital. In a grid or cloud situation, you might have permanent open connections from thousands of clients simultaneously, and you need to be able to serve the requests and responses to each client. + +Before looking at how libevent and libev are able to handle multiple network connections, let's take a brief look at some of the traditional solutions for handling this type of connectivity. + +### Handling multiple clients + +There are a number of different traditional methods that handle multiple connections, but usually they result in an issue handling large quantities of connections, either because they use too much memory, too much CPU, or they reach an operating system limit of some kind. + +The main solutions used are: + +* Round-robin: The early systems use a simple solution of round-robin selection, simply iterating over a list of open network connections and determining whether there is any data to read. This is both slow (especially as the number of connections increases) and inefficient (since other connections may be sending requests and expecting responses while you are servicing the current one). The other connections have to wait while you iterate through each one. If you have 100 connections and only one has data, you still have to work through the other 99 to get to the one that needs servicing. +* poll, epoll, and variations: This uses a modification of the round-robin approach, using a structure to hold an array of each of the connections to be monitored, with a callback mechanism so that when data is identified on a network socket, the handling function is called. The problem with poll is that the size of the structure can be quite large, and modifying the structure as you add new network connections to the list can increase the load and affect performance. +* select: The select() function call uses a static structure, which had previously been hard-coded to a relatively small number (1024 connections), which makes it impractical for very large deployments. +There are other implementations on individual platforms (such as /dev/poll on Solaris, or kqueue on FreeBSD/NetBSD) that may perform better on their chosen OS, but they are not portable and don't necessarily resolve the upper level problems of handling requests. + +All of the above solutions use a simple loop to wait and handle requests, before dispatching the request to a separate function to handle the actual network interaction. The key is that the loop and network sockets need a lot of management code to ensure that you are listening, updating, and controlling the different connections and interfaces. + +An alternative method of handling many different connections is to make use of the multi-threading support in most modern kernels to listen and handle connections, opening a new thread for each connection. This shifts the responsibility back to the operating system directly but implies a relatively large overhead in terms of RAM and CPU, as each thread will need it's own execution space. And if each thread (ergo network connection) is busy, then the context switching to each thread can be significant. Finally, many kernels are not designed to handle such a large number of active threads. +``` + + +### Alternative Implementations and Libraries + +While analysing Icinga 2's socket IO event handling, the libraries and implementations +below have been collected too. [This thread](https://www.reddit.com/r/cpp/comments/5xxv61/a_modern_c_network_library_for_developing_high/) +also sheds more light in modern programming techniques. + +Our main "problem" with Icinga 2 are modern compilers supporting the full C++11 feature set. +Recent analysis have proven that gcc on CentOS 6 or SLES11 are too old to use modern +programming techniques or anything which implemens C++14 at least. + +Given the below projects, we are also not fans of wrapping C interfaces into +C++ code in case you want to look into possible patches. + +One key thing for external code is [license compatibility](http://gplv3.fsf.org/wiki/index.php/Compatible_licenses#GPLv2-compatible_licenses) with GPLv2. +Modified BSD and Boost can be pulled into the `third-party/` directory, best header only and compiled +into the Icinga 2 binary. + +#### C + +* libevent: http://www.wangafu.net/~nickm/libevent-book/TOC.html +* libev: https://www.ibm.com/developerworks/aix/library/au-libev/index.html +* libuv: http://libuv.org + +#### C++ + +* Asio (standalone header only or as Boost library): http://think-async.com (the Boost Software license is compatible with GPLv2) +* Poco project: https://github.com/pocoproject/poco +* cpp-netlib: https://github.com/cpp-netlib/cpp-netlib +* evpp: https://github.com/Qihoo360/evpp + From bfe7d46a685bd9d9d21519eeff85f8c301058e32 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 7 Aug 2018 10:02:13 +0200 Subject: [PATCH 0187/1162] Only send acknowledgement notification if user received a problem notification refs #6047 --- lib/icinga/notification.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index a53c17e12..85ca54da7 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -409,6 +409,15 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe } } + /* on acknowledgement, check if user was notified before */ + if (type == NotificationAcknowledgement) { + if (!notifiedProblemUsers->Contains(userName)) { + Log(LogNotice, "Notification") + << "We did not notify user '" << userName << "' for a problem before. Not sending acknowledgement notification."; + continue; + } + } + Log(LogInformation, "Notification") << "Sending " << (reminder ? "reminder " : "") << "'" << NotificationTypeToStringInternal(type) << "' notification '" << GetName() << "' for user '" << userName << "'"; From 834e37d3e25726d4bc62da1ffc54051f4d9b3bfe Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 4 Sep 2018 13:11:28 +0200 Subject: [PATCH 0188/1162] Still notify on acknowledgement and recovery if user does not get problem notifications at all refs #6047 --- lib/icinga/notification.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 85ca54da7..6da7f428f 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -402,7 +402,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe /* on recovery, check if user was notified before */ if (type == NotificationRecovery) { - if (!notifiedProblemUsers->Contains(userName)) { + if (!notifiedProblemUsers->Contains(userName) && CheckNotificationUserFilters(NotificationProblem, user, false, false)) { Log(LogNotice, "Notification") << "We did not notify user '" << userName << "' for a problem before. Not sending recovery notification."; continue; @@ -411,7 +411,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe /* on acknowledgement, check if user was notified before */ if (type == NotificationAcknowledgement) { - if (!notifiedProblemUsers->Contains(userName)) { + if (!notifiedProblemUsers->Contains(userName) && CheckNotificationUserFilters(NotificationProblem, user, false, false)) { Log(LogNotice, "Notification") << "We did not notify user '" << userName << "' for a problem before. Not sending acknowledgement notification."; continue; From af1f2e0c55eabc14c34b26a5195e7ae13fdf00cc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 12 Sep 2018 17:04:11 +0200 Subject: [PATCH 0189/1162] Only check for Problem types in user filers for Recovery/Acknowledgement notifications refs #6047 --- lib/icinga/notification.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 6da7f428f..9ac006e1e 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -402,18 +402,20 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe /* on recovery, check if user was notified before */ if (type == NotificationRecovery) { - if (!notifiedProblemUsers->Contains(userName) && CheckNotificationUserFilters(NotificationProblem, user, false, false)) { + if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { Log(LogNotice, "Notification") - << "We did not notify user '" << userName << "' for a problem before. Not sending recovery notification."; + << "We did not notify user '" << userName + << "' (Problem types enabled) for a problem before. Not sending recovery notification."; continue; } } /* on acknowledgement, check if user was notified before */ if (type == NotificationAcknowledgement) { - if (!notifiedProblemUsers->Contains(userName) && CheckNotificationUserFilters(NotificationProblem, user, false, false)) { + if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { Log(LogNotice, "Notification") - << "We did not notify user '" << userName << "' for a problem before. Not sending acknowledgement notification."; + << "We did not notify user '" << userName + << "' (Problem types enabled) for a problem before. Not sending acknowledgement notification."; continue; } } From 354e3c9093c154d3e2c704fd51149a3dd0b84c3c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 12 Sep 2018 17:08:32 +0200 Subject: [PATCH 0190/1162] Update notification and upgrading docs for recovery/acknowledgement handling refs #6047 --- doc/03-monitoring-basics.md | 8 ++++++++ doc/16-upgrading-icinga-2.md | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/doc/03-monitoring-basics.md b/doc/03-monitoring-basics.md index 627423e62..a4775c69f 100644 --- a/doc/03-monitoring-basics.md +++ b/doc/03-monitoring-basics.md @@ -1553,6 +1553,14 @@ send notifications to all group members. > Only users who have been notified of a problem before (`Warning`, `Critical`, `Unknown` states for services, `Down` for hosts) will receive `Recovery` notifications. +Icinga 2 v2.10 allows you to configure `Acknowledgement` and/or `Recovery` +without a `Problem` notification. These notifications will be sent without +any problem notifications beforehand, and can be used for e.g. ticket systems. + +``` + types = [ Acknowledgement, Recovery ] +``` + ### Notifications: Users from Host/Service A common pattern is to store the users and user groups diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 9c8d79a23..8bf58bc13 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -62,6 +62,31 @@ are counted as connected endpoints. A similar change is there for the performanc The attribute `child_options` was previously accepting 0,1,2 for specific child downtime settings. This behaviour stays intact, but the new proposed way are specific constants as values (`DowntimeNoChildren`, `DowntimeTriggeredChildren`, `DowntimeNonTriggeredChildren`). +### Notifications: Recovery and Acknowledgement + +When a user should be notified on `Problem` and `Acknowledgement`, v2.10 now checks during +the `Acknowledgement` notification event whether this user has been notified about a problem before. + +``` + types = [ Problem, Acknowledgement, Recovery ] +``` + +If **no** `Problem` notification was sent, and the types filter includes problems for this user, +the `Acknowledgement` notification is **not** sent. + +In contrast to that, the following configuration always sends `Acknowledgement` notifications. + +``` + types = [ Acknowledgement, Recovery ] +``` + +This change also restores the old behaviour for `Recovery` notifications. The above configuration +leaving out the `Problem` type can be used to only receive recovery notifications. If `Problem` +is added to the types again, Icinga 2 checks whether it has notified a user of a problem when +sending the recovery notification. + +More details can be found in [this PR](https://github.com/Icinga/icinga2/pull/6527). + ## Upgrading to v2.9 ### Deprecation and Removal Notes From eda3c3ade304ca1cbdac9ead1152d7939dda149c Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Thu, 6 Sep 2018 15:58:42 +0200 Subject: [PATCH 0191/1162] Improve TLS handshake exception logging refs #6602 --- lib/perfdata/elasticsearchwriter.cpp | 2 +- lib/perfdata/influxdbwriter.cpp | 2 +- lib/remote/apilistener.cpp | 4 ++-- lib/remote/pkiutility.cpp | 5 +++-- lib/remote/pkiutility.hpp | 1 + 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index d9d56b004..c10baf12d 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -434,7 +434,7 @@ void ElasticsearchWriter::SendRequest(const String& body) stream = Connect(); } catch (const std::exception& ex) { Log(LogWarning, "ElasticsearchWriter") - << "Flush failed, cannot connect to Elasticsearch."; + << "Flush failed, cannot connect to Elasticsearch: " << DiagnosticInformation(ex, false); return; } diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 89cf13220..27dd69831 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -425,7 +425,7 @@ void InfluxdbWriter::Flush() stream = Connect(); } catch (const std::exception& ex) { Log(LogWarning, "InfluxDbWriter") - << "Flush failed, cannot connect to InfluxDB."; + << "Flush failed, cannot connect to InfluxDB: " << DiagnosticInformation(ex, false); return; } diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c1546710d..f69407edd 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -454,9 +454,9 @@ void ApiListener::NewClientHandlerInternal(const Socket::Ptr& client, const Stri try { tlsStream->Handshake(); - } catch (const std::exception&) { + } catch (const std::exception& ex) { Log(LogCritical, "ApiListener") - << "Client TLS handshake failed (" << conninfo << ")"; + << "Client TLS handshake failed (" << conninfo << "): " << DiagnosticInformation(ex, false); tlsStream->Close(); return; } diff --git a/lib/remote/pkiutility.cpp b/lib/remote/pkiutility.cpp index 20d9ca6c2..915b3ee2e 100644 --- a/lib/remote/pkiutility.cpp +++ b/lib/remote/pkiutility.cpp @@ -187,8 +187,9 @@ int PkiUtility::RequestCertificate(const String& host, const String& port, const try { stream->Handshake(); - } catch (const std::exception&) { - Log(LogCritical, "cli", "Client TLS handshake failed."); + } catch (const std::exception& ex) { + Log(LogCritical, "cli") + << "Client TLS handshake failed: " << DiagnosticInformation(ex, false); return 1; } diff --git a/lib/remote/pkiutility.hpp b/lib/remote/pkiutility.hpp index 500b7be69..7098df3b1 100644 --- a/lib/remote/pkiutility.hpp +++ b/lib/remote/pkiutility.hpp @@ -21,6 +21,7 @@ #define PKIUTILITY_H #include "remote/i2-remote.hpp" +#include "base/exception.hpp" #include "base/dictionary.hpp" #include "base/string.hpp" #include From 5cb39ea78b4395b3daef4bb65c96bea84c2e6c05 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 27 Jul 2018 16:34:50 +0200 Subject: [PATCH 0192/1162] Improve error logging for match/regex/cidr_match functions and unsupported dictionary usage fixes #6442 refs #6497 --- lib/base/scriptutils.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index f8ab8ce00..3c1a4e5a5 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -108,10 +108,14 @@ bool ScriptUtils::CastBool(const Value& value) bool ScriptUtils::Regex(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("Regular expression and text must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("Regular expression and text must be specified for regex().")); String pattern = args[0]; const Value& argTexts = args[1]; + + if (argTexts.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by regex().")); + MatchType mode; if (args.size() > 2) @@ -159,10 +163,14 @@ bool ScriptUtils::Regex(const std::vector& args) bool ScriptUtils::Match(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("Pattern and text must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("Pattern and text must be specified for match().")); String pattern = args[0]; const Value& argTexts = args[1]; + + if (argTexts.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by match().")); + MatchType mode; if (args.size() > 2) @@ -201,10 +209,14 @@ bool ScriptUtils::Match(const std::vector& args) bool ScriptUtils::CidrMatch(const std::vector& args) { if (args.size() < 2) - BOOST_THROW_EXCEPTION(std::invalid_argument("CIDR and IP address must be specified.")); + BOOST_THROW_EXCEPTION(std::invalid_argument("CIDR and IP address must be specified for cidr_match().")); String pattern = args[0]; const Value& argIps = args[1]; + + if (argIps.IsObjectType()) + BOOST_THROW_EXCEPTION(std::invalid_argument("Dictionaries are not supported by cidr_match().")); + MatchType mode; if (args.size() > 2) From 7713291805e46229ab0039432d94c1a12e7eb6fd Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 24 Aug 2018 11:03:29 +0200 Subject: [PATCH 0193/1162] Add note about workaround for broken custom vars refs #6572 --- doc/16-upgrading-icinga-2.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 870b09d69..af6d6b9ec 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -97,6 +97,22 @@ With the removal of RHEL 5 as supported platform, we can finally use real unique This is reflected in generating names for e.g. API stage names. Previously it was a handcrafted mix of local FQDN, timestamps and random numbers. +### Custom Vars not updating + +A rare issue preventing the custom vars of objects created prior to 2.9.0 being updated when changed may occur. To +remedy this the config checksums of the affected type need to be reset to trigger a full update. The following is an +example of how to do this for Hosts in mysql: + +``` +$ mysql -uroot -picinga icinga +MariaDB [icinga]> UPDATE icinga_hosts SET config_hash = NULL; +MariaDB [icinga]> exit +Bye +$ sudo systemctl restart icinga2 +``` + +Custom vars should now be up to date. + ## Upgrading to v2.8.2 From 454460c9d58bbdeabe44be2268a2a8f102c9de85 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Tue, 4 Sep 2018 13:33:48 +0200 Subject: [PATCH 0194/1162] Update workaround for custom vars This updates #6572 which did not work refs #6590 --- doc/16-upgrading-icinga-2.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index af6d6b9ec..07a6d16e0 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -100,18 +100,20 @@ mix of local FQDN, timestamps and random numbers. ### Custom Vars not updating A rare issue preventing the custom vars of objects created prior to 2.9.0 being updated when changed may occur. To -remedy this the config checksums of the affected type need to be reset to trigger a full update. The following is an -example of how to do this for Hosts in mysql: +remedy this, truncate the customvar tables and restart Icinga 2. The following is an example of how to do this with mysql: ``` $ mysql -uroot -picinga icinga -MariaDB [icinga]> UPDATE icinga_hosts SET config_hash = NULL; +MariaDB [icinga]> truncate icinga_customvariables; +Query OK, 0 rows affected (0.05 sec) +MariaDB [icinga]> truncate icinga_customvariablestatus; +Query OK, 0 rows affected (0.03 sec) MariaDB [icinga]> exit Bye $ sudo systemctl restart icinga2 ``` -Custom vars should now be up to date. +Custom vars should now stay up to date. ## Upgrading to v2.8.2 From 2658c2506f309dcfa5540f0d53a7acb7a8bf418d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 13 Sep 2018 15:13:03 +0200 Subject: [PATCH 0195/1162] Distributed Monitoring Docs: Add versions and upgrade refs #6612 --- doc/06-distributed-monitoring.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 8964fcffd..68ed2efdd 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -183,6 +183,32 @@ While it may sound complicated for client setups, it removes the problem with di and configurations for a master and a client. Both of them work the same way, are configured in the same way (Zone, Endpoint, ApiListener), and you can troubleshoot and debug them in just one go. +## Versions and Upgrade + +It generally is advised to use the newest releases with the same version on all instances. +Prior to upgrading, make sure to plan a maintenance window. + +The Icinga project aims to allow the following compatibility: + +``` +master (2.9) >= satellite (2.8) >= clients (2.7) +``` + +Older client versions may work, but there's no guarantee. Always keep in mind that +older versions are out of support and can contain bugs. + +In terms of an upgrade, ensure that the master is upgraded first, then +involved satellites, and last the Icinga 2 clients. If you are on v2.8 +currently, first upgrade the master instance(s) to 2.9, and then proceed +with the satellites. Things are getting easier with any sort of automation +tool (Puppet, Ansible, etc.). + +Releases and new features may require you to upgrade master/satellite instances at once, +this is highlighted in the [upgrading docs](16-upgrading-icinga-2.md#upgrading-icinga-2) if needed. +One example is the CA proxy and on-demand signing feature +available since v2.8 where all involved instances need this version +to function properly. + ## Master Setup This section explains how to install a central single master node using From 2d845883287608cae41887c4652e9df830aa978f Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 13 Sep 2018 16:19:38 +0200 Subject: [PATCH 0196/1162] Distributed Monitoring Docs: Adopt three level scenario for CA proxy fixes #6593 --- doc/06-distributed-monitoring.md | 256 +++++++++++++++++++++++-------- 1 file changed, 195 insertions(+), 61 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 68ed2efdd..706fd15c8 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -205,7 +205,7 @@ tool (Puppet, Ansible, etc.). Releases and new features may require you to upgrade master/satellite instances at once, this is highlighted in the [upgrading docs](16-upgrading-icinga-2.md#upgrading-icinga-2) if needed. -One example is the CA proxy and on-demand signing feature +One example is the CA Proxy and on-demand signing feature available since v2.8 where all involved instances need this version to function properly. @@ -321,7 +321,8 @@ and sign the request. > **Note** > > Icinga 2 v2.8 adds the possibility to forward signing requests on a satellite -> to the master node. This helps with the setup of [three level clusters](#06-distributed-monitoring.md#distributed-monitoring-scenarios-master-satellite-client) +> to the master node. This is called `CA Proxy` in blog posts and design drafts. +> This functionality helps with the setup of [three level clusters](#06-distributed-monitoring.md#distributed-monitoring-scenarios-master-satellite-client) > and more. Advantages: @@ -1640,14 +1641,16 @@ This scenario combines everything you've learned so far: High-availability maste satellites receiving their configuration from the master zone, and clients checked via command endpoint from the satellite zones. -**Tip**: It can get complicated, so grab a pen and paper and bring your thoughts to life. -Play around with a test setup before using it in a production environment! +> **Tip**: +> +> It can get complicated, so grab a pen and paper and bring your thoughts to life. +> Play around with a test setup before using it in a production environment! Overview: * `icinga2-master1.localdomain` is the configuration master master node. * `icinga2-master2.localdomain` is the secondary master master node without configuration in `zones.d`. -* `icinga2-satellite1.localdomain` and `icinga2-satellite2.localdomain` are satellite nodes in a `master` child zone. +* `icinga2-satellite1.localdomain` and `icinga2-satellite2.localdomain` are satellite nodes in a `master` child zone. They forward CSR signing requests to the master zone. * `icinga2-client1.localdomain` and `icinga2-client2.localdomain` are two child nodes as clients. Setup requirements: @@ -1656,85 +1659,206 @@ Setup requirements: * Set up `icinga2-master2.localdomain`, `icinga2-satellite1.localdomain` and `icinga2-satellite2.localdomain` as [clients](06-distributed-monitoring.md#distributed-monitoring-setup-satellite-client) (we will modify the generated configuration). * Set up `icinga2-client1.localdomain` and `icinga2-client2.localdomain` as [clients](06-distributed-monitoring.md#distributed-monitoring-setup-satellite-client). -When being asked for the master endpoint providing CSR auto-signing capabilities, -please add the master node which holds the CA and has the `ApiListener` feature configured and enabled. -The parent endpoint must still remain the satellite endpoint name. +When being asked for the parent endpoint providing CSR auto-signing capabilities, +please add one of the satellite nodes. **Note**: This requires Icinga 2 v2.8+ +and the `CA Proxy` on all master, satellite and client nodes. Example for `icinga2-client1.localdomain`: - Please specify the master endpoint(s) this node should connect to: +``` +Please specify the parent endpoint(s) (master or satellite) where this node should connect to: +``` -Master is the first satellite `icinga2-satellite1.localdomain`: +Parent endpoint is the first satellite `icinga2-satellite1.localdomain`: - Master Common Name (CN from your master setup): icinga2-satellite1.localdomain - Do you want to establish a connection to the master from this node? [Y/n]: y - Please fill out the master connection information: - Master endpoint host (Your master's IP address or FQDN): 192.168.56.105 - Master endpoint port [5665]: +``` +Master/Satellite Common Name (CN from your master/satellite node): icinga2-satellite1.localdomain +Do you want to establish a connection to the parent node from this node? [Y/n]: y -Add the second satellite `icinga2-satellite2.localdomain` as master: +Please specify the master/satellite connection information: +Master/Satellite endpoint host (IP address or FQDN): 192.168.56.105 +Master/Satellite endpoint port [5665]: 5665 +``` - Add more master endpoints? [y/N]: y - Master Common Name (CN from your master setup): icinga2-satellite2.localdomain - Do you want to establish a connection to the master from this node? [Y/n]: y - Please fill out the master connection information: - Master endpoint host (Your master's IP address or FQDN): 192.168.56.106 - Master endpoint port [5665]: - Add more master endpoints? [y/N]: n +Add the second satellite `icinga2-satellite2.localdomain` as parent: -Specify the master node `icinga2-master2.localdomain` with the CA private key and ticket salt: +``` +Add more master/satellite endpoints? [y/N]: y - Please specify the master connection for CSR auto-signing (defaults to master endpoint host): - Host [192.168.56.106]: icinga2-master1.localdomain - Port [5665]: +Master/Satellite Common Name (CN from your master/satellite node): icinga2-satellite2.localdomain +Do you want to establish a connection to the parent node from this node? [Y/n]: y -In case you cannot connect to the master node from your clients, you'll manually need -to [generate the SSL certificates](06-distributed-monitoring.md#distributed-monitoring-advanced-hints-certificates-manual) -and modify the configuration accordingly. +Please specify the master/satellite connection information: +Master/Satellite endpoint host (IP address or FQDN): 192.168.56.106 +Master/Satellite endpoint port [5665]: 5665 -We'll discuss the details of the required configuration below. +Add more master/satellite endpoints? [y/N]: n +``` + +The specified parent nodes will forward the CSR signing request to the master instances. + +Proceed with adding the optional client ticket for [CSR auto-signing](06-distributed-monitoring.md#distributed-monitoring-setup-csr-auto-signing): + +``` +Please specify the request ticket generated on your Icinga 2 master (optional). + (Hint: # icinga2 pki ticket --cn 'icinga2-client1.localdomain'): +4f75d2ecd253575fe9180938ebff7cbca262f96e +``` + +In case you've chosen to use [On-Demand CSR Signing](06-distributed-monitoring.md#distributed-monitoring-setup-on-demand-csr-signing) +you can leave the ticket question blank. + +Instead, Icinga 2 tells you to approve the request later on the master node. + +``` +No ticket was specified. Please approve the certificate signing request manually +on the master (see 'icinga2 ca list' and 'icinga2 ca sign --help' for details). +``` + +You can optionally specify a different bind host and/or port. + +``` +Please specify the API bind host/port (optional): +Bind Host []: +Bind Port []: +``` + +The next step asks you to accept configuration (required for [config sync mode](06-distributed-monitoring.md#distributed-monitoring-top-down-config-sync)) +and commands (required for [command endpoint mode](06-distributed-monitoring.md#distributed-monitoring-top-down-command-endpoint)). + +``` +Accept config from parent node? [y/N]: y +Accept commands from parent node? [y/N]: y +``` + +Next you can optionally specify the local and parent zone names. This will be reflected +in the generated zone configuration file. + +``` +Local zone name [icinga2-client1.localdomain]: icinga2-client1.localdomain +``` + +Set the parent zone name to `satellite` for this client. + +``` +Parent zone name [master]: satellite +``` + +You can add more global zones in addition to `global-templates` and `director-global` if necessary. +Press `Enter` or choose `n`, if you don't want to add any additional. + +``` +Reconfiguring Icinga... + +Default global zones: global-templates director-global +Do you want to specify additional global zones? [y/N]: N +``` + +Last but not least the wizard asks you whether you want to disable the inclusion of the local configuration +directory in `conf.d`, or not. Defaults to disabled, as clients either are checked via command endpoint, or +they receive configuration synced from the parent zone. + +``` +Do you want to disable the inclusion of the conf.d directory [Y/n]: Y +Disabling the inclusion of the conf.d directory... +``` + + +**We'll discuss the details of the required configuration below. Most of this +configuration can be rendered by the setup wizards.** The zone hierarchy can look like this. We'll define only the directly connected zones here. -You can safely deploy this configuration onto all master and satellite zone -members. You should keep in mind to control the endpoint [connection direction](06-distributed-monitoring.md#distributed-monitoring-advanced-hints-connection-direction) -using the `host` attribute. +The master instances should actively connect to the satellite instances, therefore +the configuration on `icinga2-master1.localdomain` and `icinga2-master2.localdomain` +must include the `host` attribute for the satellite endpoints: - [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.conf +``` +[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.conf - object Endpoint "icinga2-master1.localdomain" { - host = "192.168.56.101" - } +object Endpoint "icinga2-master1.localdomain" { + //that's us +} - object Endpoint "icinga2-master2.localdomain" { - host = "192.168.56.102" - } +object Endpoint "icinga2-master2.localdomain" { + host = "192.168.56.102" +} - object Endpoint "icinga2-satellite1.localdomain" { - host = "192.168.56.105" - } +object Endpoint "icinga2-satellite1.localdomain" { + host = "192.168.56.105" +} - object Endpoint "icinga2-satellite2.localdomain" { - host = "192.168.56.106" - } +object Endpoint "icinga2-satellite2.localdomain" { + host = "192.168.56.106" +} - object Zone "master" { - endpoints = [ "icinga2-master1.localdomain", "icinga2-master2.localdomain" ] - } +object Zone "master" { + endpoints = [ "icinga2-master1.localdomain", "icinga2-master2.localdomain" ] +} - object Zone "satellite" { - endpoints = [ "icinga2-satellite1.localdomain", "icinga2-satellite2.localdomain" ] +object Zone "satellite" { + endpoints = [ "icinga2-satellite1.localdomain", "icinga2-satellite2.localdomain" ] - parent = "master" - } + parent = "master" +} - /* sync global commands */ - object Zone "global-templates" { - global = true - } +/* sync global commands */ +object Zone "global-templates" { + global = true +} -Repeat the configuration step for `icinga2-master2.localdomain`, `icinga2-satellite1.localdomain` -and `icinga2-satellite2.localdomain`. +object Zone "director-global" { + global = true +} + +``` + +In contrast to that, the satellite instances `icinga2-satellite1.localdomain` +and `icinga2-satellite2.localdomain` should not actively connect to the master +instances. + +``` +[root@icinga2-satellite1.localdomain /]# vim /etc/icinga2/zones.conf + +object Endpoint "icinga2-master1.localdomain" { + //this endpoint will connect to us +} + +object Endpoint "icinga2-master2.localdomain" { + //this endpoint will connect to us +} + +object Endpoint "icinga2-satellite1.localdomain" { + //that's us +} + +object Endpoint "icinga2-satellite2.localdomain" { + host = "192.168.56.106" +} + +object Zone "master" { + endpoints = [ "icinga2-master1.localdomain", "icinga2-master2.localdomain" ] +} + +object Zone "satellite" { + endpoints = [ "icinga2-satellite1.localdomain", "icinga2-satellite2.localdomain" ] + + parent = "master" +} + +/* sync global commands */ +object Zone "global-templates" { + global = true +} + +object Zone "director-global" { + global = true +} +``` +Keep in mind to control the endpoint [connection direction](06-distributed-monitoring.md#distributed-monitoring-advanced-hints-connection-direction) +using the `host` attribute, also for other endpoints in the same zone. + +Adopt the configuration for `icinga2-master2.localdomain` and `icinga2-satellite2.localdomain`. Since we want to use [top down command endpoint](06-distributed-monitoring.md#distributed-monitoring-top-down-command-endpoint) checks, we must configure the client endpoint and zone objects. @@ -1807,6 +1931,10 @@ Example for `icinga2-client1.localdomain`: global = true } + object Zone "director-global" { + global = true + } + Example for `icinga2-client2.localdomain`: [root@icinga2-client2.localdomain /]# vim /etc/icinga2/zones.conf @@ -1838,6 +1966,10 @@ Example for `icinga2-client2.localdomain`: global = true } + object Zone "director-global" { + global = true + } + Now it is time to define the two client hosts on the master, sync them to the satellites and apply service checks using the command endpoint execution method to them. Add the two client nodes as host objects to the `satellite` zone. @@ -1900,7 +2032,9 @@ Validate the configuration and restart Icinga 2 on the master node `icinga2-mast Open Icinga Web 2 and check the two newly created client hosts with two new services -- one executed locally (`ping4`) and one using command endpoint (`disk`). -**Tip**: It's a good idea to add [health checks](06-distributed-monitoring.md#distributed-monitoring-health-checks) +> **Tip**: +> +> It's a good idea to add [health checks](06-distributed-monitoring.md#distributed-monitoring-health-checks) to make sure that your cluster notifies you in case of failure. ## Best Practice From acafe2fbe56ee6be2e630f768d79c6aa51d90aa8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 13 Sep 2018 16:33:27 +0200 Subject: [PATCH 0197/1162] Drop older than 2.8 references in distributed monitoring docs With 2.10, 2.8 will be the least supported version, older doc versions can still be found on GH if needed. --- doc/06-distributed-monitoring.md | 122 ++++--------------------------- 1 file changed, 14 insertions(+), 108 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 706fd15c8..bccac1fe9 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -383,10 +383,10 @@ Store that ticket number for the satellite/client setup below. ### On-Demand CSR Signing -Icinga 2 v2.8 adds the possibility to sign certificates from clients without -requiring a client ticket for auto-signing. +The client sends a certificate signing request to specified parent node without any +ticket. The admin on the master is responsible for reviewing and signing the requests +with the private CA key. -Instead, the client sends a certificate signing request to specified parent node. This could either be directly the master, or a satellite which forwards the request to the signing master. @@ -653,11 +653,6 @@ The setup wizard will ensure that the following steps are taken: You can verify that the certificate files are stored in the `/var/lib/icinga2/certs` directory. -> **Note** -> -> The certificate location changed in v2.8 to `/var/lib/icinga2/certs`. Please read the [upgrading chapter](16-upgrading-icinga-2.md#upgrading-to-2-8-certificate-paths) -> for more details. - > **Note** > > If the client is not directly connected to the certificate signing master, @@ -802,11 +797,6 @@ If you did not provide a setup ticket, you need to sign the certificate request The setup wizards tells you to do so. The Icinga 2 service is running at this point already and will automatically receive and update a signed client certificate. -> **Note** -> -> Ticket-less setups require at least Icinga 2 v2.8+ on all involved instances. - - ![Icinga 2 Windows Setup](images/distributed-monitoring/icinga2_windows_setup_wizard_06_finish_no_ticket.png) Icinga 2 is automatically started as a Windows service. @@ -823,20 +813,6 @@ The configuration files can be modified with your favorite editor e.g. Notepad. In order to use the [top down](06-distributed-monitoring.md#distributed-monitoring-top-down) client configuration prepare the following steps. -Add a [global zone](06-distributed-monitoring.md#distributed-monitoring-global-zone-config-sync) -for syncing check commands later. Navigate to `C:\ProgramData\icinga2\etc\icinga2` and open -the `zones.conf` file in your preferred editor. Add the following lines if not existing already: - -``` -object Zone "global-templates" { - global = true -} -``` - -> **Note:** -> -> Packages >= 2.8 provide this configuration by default. - You don't need any local configuration on the client except for CheckCommand definitions which can be synced using the global zone above. Therefore disable the inclusion of the `conf.d` directory @@ -873,12 +849,6 @@ and restart the `icinga2` service. Alternatively, you can use the `net {start,st Now that you've successfully installed a Windows client, please proceed to the [detailed configuration modes](06-distributed-monitoring.md#distributed-monitoring-configuration-modes). -> **Note** -> -> The certificate location changed in v2.8 to `%ProgramData%\var\lib\icinga2\certs`. -> Please read the [upgrading chapter](16-upgrading-icinga-2.md#upgrading-to-2-8-certificate-paths) -> for more details. - ## Configuration Modes There are different ways to ensure that the Icinga 2 cluster nodes execute @@ -976,21 +946,6 @@ The `master` zone is a parent of the `icinga2-client1.localdomain` zone: parent = "master" //establish zone hierarchy } -In addition, add a [global zone](06-distributed-monitoring.md#distributed-monitoring-global-zone-config-sync) -for syncing check commands later: - -``` -[root@icinga2-client1.localdomain /]# vim /etc/icinga2/zones.conf - -object Zone "global-templates" { - global = true -} -``` - -> **Note:** -> -> Packages >= 2.8 provide this configuration by default. - You don't need any local configuration on the client except for CheckCommand definitions which can be synced using the global zone above. Therefore disable the inclusion of the `conf.d` directory @@ -1008,18 +963,6 @@ in `/etc/icinga2/icinga2.conf`. > Packages >= 2.9 provide an option in the setup wizard to disable this. > Defaults to disabled. -Edit the `api` feature on the client `icinga2-client1.localdomain` in -the `/etc/icinga2/features-enabled/api.conf` file and make sure to set -`accept_commands` and `accept_config` to `true`: - - [root@icinga2-client1.localdomain /]# vim /etc/icinga2/features-enabled/api.conf - - object ApiListener "api" { - //... - accept_commands = true - accept_config = true - } - Now it is time to validate the configuration and to restart the Icinga 2 daemon on both nodes. @@ -1260,7 +1203,7 @@ section where you can find detailed information on extending the setup. If you are eager to start fresh instead you might take a look into the -[Icinga Director](https://github.com/icinga/icingaweb2-module-director). +[Icinga Director](https://www.icinga.com/docs/director/latest/). ## Scenarios @@ -2067,22 +2010,22 @@ the global configuration files: [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.conf - object Zone "global-templates" { + object Zone "global-commands" { global = true } -Note: Packages >= 2.8 provide this configuration by default. +The default global zones generated by the setup wizards are called `global-templates` and `director-global`. Similar to the zone configuration sync you'll need to create a new directory in `/etc/icinga2/zones.d`: - [root@icinga2-master1.localdomain /]# mkdir -p /etc/icinga2/zones.d/global-templates + [root@icinga2-master1.localdomain /]# mkdir -p /etc/icinga2/zones.d/global-commands Next, add a new check command, for example: - [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/global-templates/commands.conf + [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/global-commands/web.conf - object CheckCommand "my-cmd" { + object CheckCommand "webinject" { //... } @@ -2092,7 +2035,7 @@ before restarting the parent master/satellite nodes. Then validate the configuration on the master node and restart Icinga 2. **Tip**: You can copy the example configuration files located in `/etc/icinga2/conf.d` -into your global zone. +into the default global zone `global-templates`. Example: @@ -2473,7 +2416,8 @@ with automating setups (setup, certificates, configuration). Icinga 2 v2.8+ adds the possibility that nodes request certificate updates on their own. If their expiration date is soon enough, they automatically renew their already signed certificate by sending a signing request to the -parent node. +parent node. You'll also see a message in the logs if certificate renewal +isn't necessary. ### High-Availability for Icinga 2 Features @@ -2633,22 +2577,6 @@ Configuration on the client `icinga2-client1.localdomain`: log_duration = 0 } -### CSR auto-signing with HA and multiple Level Cluster - -If you are using two masters in a High-Availability setup it can be necessary -to allow both to sign requested certificates. Ensure to safely sync the following -details in private: - -* `TicketSalt` constant in `constants.conf`. -* `var/lib/icinga2/ca` directory. - -This also helps if you are using a [three level cluster](06-distributed-monitoring.md#distributed-monitoring-scenarios-master-satellite-client) -and your client nodes are not able to reach the CSR auto-signing master node(s). -Make sure that the directory permissions for `/var/lib/icinga2/ca` are secure -(not world readable). - -**Do not expose these private keys to anywhere else. This is a matter of security.** - ### Manual Certificate Creation #### Create CA on the Master @@ -2678,11 +2606,6 @@ Sign the CSR with the previously created CA: Repeat the steps for all instances in your setup. -> **Note** -> -> The certificate location changed in v2.8 to `/var/lib/icinga2/certs`. Please read the [upgrading chapter](16-upgrading-icinga-2.md#upgrading-to-2-8-certificate-paths) -> for more details. - #### Copy Certificates Copy the host's certificate files and the public CA certificate to `/var/lib/icinga2/certs`: @@ -2790,11 +2713,6 @@ In case you don't need anything in `conf.d`, use the following command line: #### Node Setup with Satellites/Clients -> **Note** -> -> The certificate location changed in v2.8 to `/var/lib/icinga2/certs`. Please read the [upgrading chapter](16-upgrading-icinga-2.md#upgrading-to-2-8-certificate-paths) -> for more details. - Make sure that the `/var/lib/icinga2/certs` directory exists and is owned by the `icinga` user (or the user Icinga 2 is running as). @@ -2898,16 +2816,6 @@ which holds the CA's key pair. **You can find additional best practices below.** -Add an additional global zone. Please note the `>>` append mode. - - [root@icinga2-client1.localdomain /]# cat <>/etc/icinga2/zones.conf - object Zone "global-templates" { - global = true - } - EOF - -Note: Packages >= 2.8 provide this configuration by default. - If this client node is configured as [remote command endpoint execution](06-distributed-monitoring.md#distributed-monitoring-top-down-command-endpoint) you can safely disable the `checker` feature. The `node setup` CLI command already disabled the `notification` feature. @@ -2918,6 +2826,8 @@ configured client. [root@icinga2-client1.localdomain /]# sed -i 's/include_recursive "conf.d"/\/\/include_recursive "conf.d"/g' /etc/icinga2/icinga2.conf +**Note**: This is the default since v2.9. + **Optional**: Add an ApiUser object configuration for remote troubleshooting. [root@icinga2-client1.localdomain /]# cat </etc/icinga2/conf.d/api-users.conf @@ -2937,7 +2847,6 @@ Finally restart Icinga 2. [root@icinga2-client1.localdomain /]# systemctl restart icinga2 Your automation tool must then configure master node in the meantime. -Add the global zone `global-templates` in case it did not exist. # cat <>/etc/icinga2/zones.conf object Endpoint "icinga2-client1.localdomain" { @@ -2949,9 +2858,6 @@ Add the global zone `global-templates` in case it did not exist. parent = "master" } - object Zone "global-templates" { - global = true - } EOF ## Using Multiple Environments From fd39f7efb1337d57ad1411d527abec75adc7f50e Mon Sep 17 00:00:00 2001 From: Oleg Artenii Date: Fri, 14 Sep 2018 09:24:40 +0300 Subject: [PATCH 0198/1162] cmake: fixed undefined ${CMAKE_INSTALL_LIBDIR} --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8cac0a1f5..9f5ca4c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(utf8::cpp ALIAS utf8cpp) if(WIN32 AND NOT CYGWIN) set(DEF_INSTALL_CMAKE_DIR CMake) else() + include(GNUInstallDirs) # define CMAKE_INSTALL_* set(DEF_INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/utf8cpp) endif() From 29701b4db5e43d1f1f40e78d9515d082f832ca64 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 13 Sep 2018 18:05:31 +0200 Subject: [PATCH 0199/1162] Add ApiListener#tls_handshake_timeout option This allows to specify the previously hardcoded timeout of 10s. refs #6517 --- doc/09-object-types.md | 1 + lib/base/configuration.cpp | 11 +++++++++++ lib/base/configuration.hpp | 4 ++++ lib/base/configuration.ti | 5 +++++ lib/base/tlsstream.cpp | 7 ++++--- lib/remote/apilistener.cpp | 18 ++++++++++++++++++ lib/remote/apilistener.hpp | 4 ++++ lib/remote/apilistener.ti | 6 ++++++ 8 files changed, 53 insertions(+), 3 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index fffad0000..6dda8c91d 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -64,6 +64,7 @@ Configuration Attributes: max\_anonymous\_clients | Number | **Optional.** Limit the number of anonymous client connections (not configured endpoints and signing requests). cipher\_list | String | **Optional.** Cipher list that is allowed. For a list of available ciphers run `openssl ciphers`. Defaults to `ALL:!LOW:!WEAK:!MEDIUM:!EXP:!NULL`. tls\_protocolmin | String | **Optional.** Minimum TLS protocol version. Must be one of `TLSv1`, `TLSv1.1` or `TLSv1.2`. Defaults to `TLSv1`. + tls\_handshake\_timeout | Number | **Optional.** TLS Handshake timeout. Defaults to `10s`. access\_control\_allow\_origin | Array | **Optional.** Specifies an array of origin URLs that may access the API. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Origin) access\_control\_allow\_credentials | Boolean | **Deprecated.** Indicates whether or not the actual request can be made using credentials. Defaults to `true`. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Credentials) access\_control\_allow\_headers | String | **Deprecated.** Used in response to a preflight request to indicate which HTTP headers can be used when making the actual request. Defaults to `Authorization`. [(MDN docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Headers) diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp index 31f691265..10d33645a 100644 --- a/lib/base/configuration.cpp +++ b/lib/base/configuration.cpp @@ -49,6 +49,7 @@ String Configuration::RunAsGroup; String Configuration::RunAsUser; String Configuration::SpoolDir; String Configuration::StatePath; +double Configuration::TlsHandshakeTimeout{10}; String Configuration::VarsPath; String Configuration::ZonesDir; @@ -309,6 +310,16 @@ void Configuration::SetStatePath(const String& val, bool suppress_events, const HandleUserWrite("StatePath", &Configuration::StatePath, val, m_ReadOnly); } +double Configuration::GetTlsHandshakeTimeout() const +{ + return Configuration::TlsHandshakeTimeout; +} + +void Configuration::SetTlsHandshakeTimeout(double val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("TlsHandshakeTimeout", &Configuration::TlsHandshakeTimeout, val, m_ReadOnly); +} + String Configuration::GetVarsPath() const { return Configuration::VarsPath; diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp index 02a516b87..2a57bbbd8 100644 --- a/lib/base/configuration.hpp +++ b/lib/base/configuration.hpp @@ -108,6 +108,9 @@ public: String GetStatePath() const override; void SetStatePath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + double GetTlsHandshakeTimeout() const override; + void SetTlsHandshakeTimeout(double value, bool suppress_events = false, const Value& cookie = Empty) override; + String GetVarsPath() const override; void SetVarsPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; @@ -151,6 +154,7 @@ public: static String RunAsUser; static String SpoolDir; static String StatePath; + static double TlsHandshakeTimeout; static String VarsPath; static String ZonesDir; diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti index abcba7d55..b15d5b21e 100644 --- a/lib/base/configuration.ti +++ b/lib/base/configuration.ti @@ -146,6 +146,11 @@ abstract class Configuration set; }; + [config, no_storage, virtual] double TlsHandshakeTimeout { + get; + set; + }; + [config, no_storage, virtual] String VarsPath { get; set; diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index 33d72d465..afb46b781 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -21,6 +21,8 @@ #include "base/utility.hpp" #include "base/exception.hpp" #include "base/logger.hpp" +#include "base/configuration.hpp" +#include "base/convert.hpp" #include #ifndef _WIN32 @@ -315,14 +317,13 @@ void TlsStream::Handshake() m_CurrentAction = TlsActionHandshake; ChangeEvents(POLLOUT); - boost::system_time const timeout = boost::get_system_time() + boost::posix_time::seconds(TLS_TIMEOUT_SECONDS); + boost::system_time const timeout = boost::get_system_time() + boost::posix_time::milliseconds(long(Configuration::TlsHandshakeTimeout * 1000)); while (!m_HandshakeOK && !m_ErrorOccurred && !m_Eof && timeout > boost::get_system_time()) m_CV.timed_wait(lock, timeout); - // We should _NOT_ (underline, bold, itallic and wordart) throw an exception for a timeout. if (timeout < boost::get_system_time()) - BOOST_THROW_EXCEPTION(std::runtime_error("Timeout during handshake.")); + BOOST_THROW_EXCEPTION(std::runtime_error("Timeout was reached (" + Convert::ToString(Configuration::TlsHandshakeTimeout) + ") during TLS handshake.")); if (m_Eof) BOOST_THROW_EXCEPTION(std::runtime_error("Socket was closed during TLS handshake.")); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c9cbd3867..4605df364 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -89,6 +89,16 @@ String ApiListener::GetDefaultCaPath() return GetCertsDir() + "/ca.crt"; } +double ApiListener::GetTlsHandshakeTimeout() const +{ + return Configuration::TlsHandshakeTimeout; +} + +void ApiListener::SetTlsHandshakeTimeout(double value, bool suppress_events, const Value& cookie) +{ + Configuration::TlsHandshakeTimeout = value; +} + void ApiListener::CopyCertificateFile(const String& oldCertPath, const String& newCertPath) { struct stat st1, st2; @@ -1453,6 +1463,14 @@ void ApiListener::ValidateTlsProtocolmin(const Lazy& lvalue, const Valid } } +void ApiListener::ValidateTlsHandshakeTimeout(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateTlsHandshakeTimeout(lvalue, utils); + + if (lvalue() <= 0) + BOOST_THROW_EXCEPTION(ValidationError(this, { "tls_handshake_timeout" }, "Value must be greater than 0.")); +} + bool ApiListener::IsHACluster() { Zone::Ptr zone = Zone::GetLocalZone(); diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 27d236eaa..7868352d4 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -108,6 +108,9 @@ public: static String GetDefaultKeyPath(); static String GetDefaultCaPath(); + double GetTlsHandshakeTimeout() const override; + void SetTlsHandshakeTimeout(double value, bool suppress_events, const Value& cookie) override; + protected: void OnConfigLoaded() override; void OnAllConfigLoaded() override; @@ -115,6 +118,7 @@ protected: void Stop(bool runtimeDeleted) override; void ValidateTlsProtocolmin(const Lazy& lvalue, const ValidationUtils& utils) override; + void ValidateTlsHandshakeTimeout(const Lazy& lvalue, const ValidationUtils& utils) override; private: std::shared_ptr m_SSLContext; diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index b98dae1cb..7d0b018d5 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -54,6 +54,12 @@ class ApiListener : ConfigObject default {{{ return -1; }}} }; + [config] double tls_handshake_timeout { + get; + set; + default {{{ return Configuration::TlsHandshakeTimeout; }}} + }; + [config] String ticket_salt; [config] Array::Ptr access_control_allow_origin; From b81ac972b9020982b53378704b147fee250fadc3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 14 Sep 2018 14:29:52 +0200 Subject: [PATCH 0200/1162] Silence compiler warning for nice() --- lib/base/process.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/process.cpp b/lib/base/process.cpp index d5d3d69d2..f84bc497c 100644 --- a/lib/base/process.cpp +++ b/lib/base/process.cpp @@ -165,7 +165,7 @@ static Value ProcessSpawnImpl(struct msghdr *msgh, const Dictionary::Ptr& reques #ifdef HAVE_NICE if (adjustPriority) - nice(5); + (void)nice(5); #endif /* HAVE_NICE */ sigset_t mask; From c0c17fc340a45e540e6a81d5815b6ffc52b313bd Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 17 Sep 2018 10:06:30 +0200 Subject: [PATCH 0201/1162] Remove unused timestamp function in DB IDO refs #6584 --- lib/db_ido/dbvalue.cpp | 14 -------------- lib/db_ido/dbvalue.hpp | 3 --- lib/db_ido_mysql/idomysqlconnection.cpp | 2 -- lib/db_ido_pgsql/idopgsqlconnection.cpp | 2 -- 4 files changed, 21 deletions(-) diff --git a/lib/db_ido/dbvalue.cpp b/lib/db_ido/dbvalue.cpp index a626e59fe..9f1f22bc9 100644 --- a/lib/db_ido/dbvalue.cpp +++ b/lib/db_ido/dbvalue.cpp @@ -33,11 +33,6 @@ Value DbValue::FromTimestamp(const Value& ts) return new DbValue(DbValueTimestamp, ts); } -Value DbValue::FromTimestampNow() -{ - return new DbValue(DbValueTimestampNow, Empty); -} - Value DbValue::FromValue(const Value& value) { return value; @@ -57,15 +52,6 @@ bool DbValue::IsTimestamp(const Value& value) return dbv->GetType() == DbValueTimestamp; } -bool DbValue::IsTimestampNow(const Value& value) -{ - if (!value.IsObjectType()) - return false; - - DbValue::Ptr dbv = value; - return dbv->GetType() == DbValueTimestampNow; -} - bool DbValue::IsObjectInsertID(const Value& value) { if (!value.IsObjectType()) diff --git a/lib/db_ido/dbvalue.hpp b/lib/db_ido/dbvalue.hpp index fcb985409..146189ca0 100644 --- a/lib/db_ido/dbvalue.hpp +++ b/lib/db_ido/dbvalue.hpp @@ -30,7 +30,6 @@ namespace icinga enum DbValueType { DbValueTimestamp, - DbValueTimestampNow, DbValueObjectInsertID }; @@ -47,12 +46,10 @@ public: DbValue(DbValueType type, Value value); static Value FromTimestamp(const Value& ts); - static Value FromTimestampNow(); static Value FromValue(const Value& value); static Value FromObjectInsertID(const Value& value); static bool IsTimestamp(const Value& value); - static bool IsTimestampNow(const Value& value); static bool IsObjectInsertID(const Value& value); static Value ExtractValue(const Value& value); diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 051206231..24f6ce66d 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -831,8 +831,6 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va std::ostringstream msgbuf; msgbuf << "FROM_UNIXTIME(" << ts << ")"; *result = Value(msgbuf.str()); - } else if (DbValue::IsTimestampNow(value)) { - *result = "NOW()"; } else if (DbValue::IsObjectInsertID(value)) { auto id = static_cast(rawvalue); diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 9771d4027..d895710e8 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -675,8 +675,6 @@ bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& va std::ostringstream msgbuf; msgbuf << "TO_TIMESTAMP(" << ts << ") AT TIME ZONE 'UTC'"; *result = Value(msgbuf.str()); - } else if (DbValue::IsTimestampNow(value)) { - *result = "NOW()"; } else if (DbValue::IsObjectInsertID(value)) { auto id = static_cast(rawvalue); From 5d36546a994258a66ad9758e4583907def9e3f89 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 17 Sep 2018 09:51:20 +0200 Subject: [PATCH 0202/1162] Ensure to use UTC timestamps for IDO PgSQL cleanup queries refs #6584 --- lib/db_ido_pgsql/idopgsqlconnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 9771d4027..16e0b567d 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -947,7 +947,7 @@ void IdoPgsqlConnection::InternalCleanUpExecuteQuery(const String& table, const Query("DELETE FROM " + GetTablePrefix() + table + " WHERE instance_id = " + Convert::ToString(static_cast(m_InstanceID)) + " AND " + time_column + - " < TO_TIMESTAMP(" + Convert::ToString(static_cast(max_age)) + ")"); + " < TO_TIMESTAMP(" + Convert::ToString(static_cast(max_age)) + ") AT TIME ZONE 'UTC'"); } void IdoPgsqlConnection::FillIDCache(const DbType::Ptr& type) From 2efe719770f036447822007d88df28e308adf272 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 17 Sep 2018 11:19:18 +0200 Subject: [PATCH 0203/1162] Add a note about tls_handshake_timeout to upgrading docs --- doc/16-upgrading-icinga-2.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 8bf58bc13..83b4bd3ec 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -57,6 +57,10 @@ The corresponding REST API results from `/v1/status/ApiListener` in `json_rpc` h from `clients` to `anonymous_clients` to better reflect their purpose. Authenticated clients are counted as connected endpoints. A similar change is there for the performance data metrics. +The TLS handshake timeout defaults to 10 seconds since v2.8.2. This can now be configured +with the configuration attribute `tls_handshake_timeout`. Beware of performance issues +with setting a too high value. + ### API: schedule-downtime Action The attribute `child_options` was previously accepting 0,1,2 for specific child downtime settings. From 7f7e81d905c8d50130f2b653d18c6a6aa62b94d5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 5 Sep 2018 20:42:55 +0200 Subject: [PATCH 0204/1162] Fix crash on API queries with Fedora 28 hardening and GCC 8 The actual fix is to handle nullptr references differently for an empty filter expression. The other changes include oob checks not necesarily involved. fixes #6533 refs #6596 --- lib/remote/filterutility.cpp | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/lib/remote/filterutility.cpp b/lib/remote/filterutility.cpp index f17c5e3d4..7cf175673 100644 --- a/lib/remote/filterutility.cpp +++ b/lib/remote/filterutility.cpp @@ -127,7 +127,7 @@ static void FilteredAddTarget(ScriptFrame& permissionFrame, Expression *permissi ScriptFrame& frame, Expression *ufilter, std::vector& result, const String& variableName, const Object::Ptr& target) { if (FilterUtility::EvaluateFilter(permissionFrame, permissionFilter, target, variableName) && FilterUtility::EvaluateFilter(frame, ufilter, target, variableName)) - result.emplace_back(target); + result.emplace_back(std::move(target)); } void FilterUtility::CheckPermission(const ApiUser::Ptr& user, const String& permission, Expression **permissionFilter) @@ -206,7 +206,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c if (attr == "type") attr = "name"; - if (query->Contains(attr)) { + if (query && query->Contains(attr)) { String name = HttpUtility::GetLastParameter(query, attr); Object::Ptr target = provider->GetTargetByName(type, name); @@ -219,7 +219,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c attr = provider->GetPluralName(type); boost::algorithm::to_lower(attr); - if (query->Contains(attr)) { + if (query && query->Contains(attr)) { Array::Ptr names = query->Get(attr); if (names) { ObjectLock olock(names); @@ -235,7 +235,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c } } - if (query->Contains("filter") || result.empty()) { + if ((query && query->Contains("filter")) || result.empty()) { if (!query->Contains("type")) BOOST_THROW_EXCEPTION(std::invalid_argument("Type must be specified when using a filter.")); @@ -251,26 +251,31 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c frame.Sandboxed = true; Dictionary::Ptr uvars = new Dictionary(); - std::unique_ptr ufilter; - if (query->Contains("filter")) { String filter = HttpUtility::GetLastParameter(query, "filter"); - ufilter = ConfigCompiler::CompileText("", filter); - } + std::unique_ptr ufilter = ConfigCompiler::CompileText("", filter); - Dictionary::Ptr filter_vars = query->Get("filter_vars"); - if (filter_vars) { - ObjectLock olock(filter_vars); - for (const Dictionary::Pair& kv : filter_vars) { - uvars->Set(kv.first, kv.second); + Dictionary::Ptr filter_vars = query->Get("filter_vars"); + if (filter_vars) { + ObjectLock olock(filter_vars); + for (const Dictionary::Pair& kv : filter_vars) { + uvars->Set(kv.first, kv.second); + } } + + frame.Self = uvars; + + provider->FindTargets(type, std::bind(&FilteredAddTarget, + std::ref(permissionFrame), permissionFilter, + std::ref(frame), &*ufilter, std::ref(result), variableName, _1)); + } else { + /* Ensure to pass a nullptr as filter expression. + * GCC 8.1.1 on F28 causes problems, see GH #6533. + */ + provider->FindTargets(type, std::bind(&FilteredAddTarget, + std::ref(permissionFrame), permissionFilter, + std::ref(frame), nullptr, std::ref(result), variableName, _1)); } - - frame.Self = uvars; - - provider->FindTargets(type, std::bind(&FilteredAddTarget, - std::ref(permissionFrame), permissionFilter, - std::ref(frame), &*ufilter, std::ref(result), variableName, _1)); } return result; From 6ebb507af797c583a6b45e361b20ef5a1cc11feb Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 31 Aug 2018 13:11:50 +0200 Subject: [PATCH 0205/1162] Shuffle items before config validation refs #6581 --- lib/config/configitem.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index c790f8794..d93087287 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -38,6 +38,8 @@ #include "base/function.hpp" #include #include +#include +#include using namespace icinga; @@ -428,6 +430,10 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (items.empty()) return true; + // Shuffle all items to evenly distribute them over the threads of the workqueue. This increases perfomance + // noticably in environments with lots of objects and available threads. + std::shuffle(std::begin(items), std::end(items), std::default_random_engine {}); + for (const auto& ip : items) newItems.push_back(ip.first); From bd927f1bd712203f6c4d31670fd58c844036c0d7 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Thu, 9 Aug 2018 11:55:20 +0200 Subject: [PATCH 0206/1162] Ensure that config object types are committed in dependent load order refs #6568 --- lib/config/configitem.cpp | 90 +++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 13 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index d93087287..fd487b1db 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -434,27 +434,22 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue // noticably in environments with lots of objects and available threads. std::shuffle(std::begin(items), std::end(items), std::default_random_engine {}); +#ifdef I2_DEBUG + Log(LogDebug, "configitem") + << "Committing " << items.size() << " new items."; +#endif /* I2_DEBUG */ + for (const auto& ip : items) newItems.push_back(ip.first); - upq.ParallelFor(items, [](const ItemPair& ip) { - ip.first->Commit(ip.second); - }); - - upq.Join(); - - if (upq.HasExceptions()) - return false; - std::set types; + std::set completed_types; for (const Type::Ptr& type : Type::GetAllTypes()) { if (ConfigObject::TypeInstance->IsAssignableFrom(type)) types.insert(type); } - std::set completed_types; - while (types.size() != completed_types.size()) { for (const Type::Ptr& type : types) { if (completed_types.find(type) != completed_types.end()) @@ -474,7 +469,60 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (unresolved_dep) continue; - upq.ParallelFor(items, [&type](const ItemPair& ip) { + int commited_items = 0; + upq.ParallelFor(items, [&type, &commited_items](const ItemPair& ip) { + const ConfigItem::Ptr& item = ip.first; + + if (item->m_Type != type) + return; + + ip.first->Commit(ip.second); + commited_items++; + }); + + upq.Join(); + + completed_types.insert(type); + +#ifdef I2_DEBUG + if (commited_items > 0) + Log(LogDebug, "configitem") + << "Committed " << commited_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + + if (upq.HasExceptions()) + return false; + } + } + +#ifdef I2_DEBUG + Log(LogDebug, "configitem") + << "Committed " << items.size() << " items."; +#endif /* I2_DEBUG */ + + completed_types.clear(); + + while (types.size() != completed_types.size()) { + for (const Type::Ptr& type : types) { + if (completed_types.find(type) != completed_types.end()) + continue; + + bool unresolved_dep = false; + + /* skip this type (for now) if there are unresolved load dependencies */ + for (const String& loadDep : type->GetLoadDependencies()) { + Type::Ptr pLoadDep = Type::GetByName(loadDep); + if (types.find(pLoadDep) != types.end() && completed_types.find(pLoadDep) == completed_types.end()) { + unresolved_dep = true; + break; + } + } + + if (unresolved_dep) + continue; + + int notified_items = 0; + upq.ParallelFor(items, [&type, ¬ified_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (!item->m_Object || item->m_Type != type) @@ -482,6 +530,7 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue try { item->m_Object->OnAllConfigLoaded(); + notified_items++; } catch (const std::exception& ex) { if (!item->m_IgnoreOnError) throw; @@ -502,11 +551,18 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue upq.Join(); +#ifdef I2_DEBUG + if (notified_items > 0) + Log(LogDebug, "configitem") + << "Sent OnAllConfigLoaded to " << notified_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + if (upq.HasExceptions()) return false; + notified_items = 0; for (const String& loadDep : type->GetLoadDependencies()) { - upq.ParallelFor(items, [loadDep, &type](const ItemPair& ip) { + upq.ParallelFor(items, [loadDep, &type, ¬ified_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (!item->m_Object || item->m_Type->GetName() != loadDep) @@ -514,14 +570,22 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue ActivationScope ascope(item->m_ActivationContext); item->m_Object->CreateChildObjects(type); + notified_items++; }); } upq.Join(); +#ifdef I2_DEBUG + if (notified_items > 0) + Log(LogDebug, "configitem") + << "Sent CreateChildObjects to " << notified_items << " items of type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ + if (upq.HasExceptions()) return false; + // Make sure to activate any additionally generated items if (!CommitNewItems(context, upq, newItems)) return false; } From 6f20749fb8ddabfa4ccf8359cc1cedf34bfdfd09 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 22 Aug 2018 15:12:47 +0200 Subject: [PATCH 0207/1162] Update variable names refs #6568 --- lib/config/configitem.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index fd487b1db..b762bb339 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -469,15 +469,15 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue if (unresolved_dep) continue; - int commited_items = 0; - upq.ParallelFor(items, [&type, &commited_items](const ItemPair& ip) { + int committed_items = 0; + upq.ParallelFor(items, [&type, &committed_items](const ItemPair& ip) { const ConfigItem::Ptr& item = ip.first; if (item->m_Type != type) return; ip.first->Commit(ip.second); - commited_items++; + committed_items++; }); upq.Join(); @@ -485,9 +485,9 @@ bool ConfigItem::CommitNewItems(const ActivationContext::Ptr& context, WorkQueue completed_types.insert(type); #ifdef I2_DEBUG - if (commited_items > 0) + if (committed_items > 0) Log(LogDebug, "configitem") - << "Committed " << commited_items << " items of type '" << type->GetName() << "'."; + << "Committed " << committed_items << " items of type '" << type->GetName() << "'."; #endif /* I2_DEBUG */ if (upq.HasExceptions()) From c8dcd1297f6d0be8685c5a3079e40fc44e779add Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 24 Sep 2018 15:50:59 +0200 Subject: [PATCH 0208/1162] Initialize Socket Event Engine on application startup Previously this happened inside the TlsStream constructor during the first connection attempt. --- lib/base/socketevents.cpp | 4 ++-- lib/base/socketevents.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index b967a345f..0e2be5017 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -35,6 +35,8 @@ static SocketEventEngine *l_SocketIOEngine; int SocketEvents::m_NextID = 0; +INITIALIZE_ONCE(&SocketEvents::InitializeEngine); + void SocketEventEngine::Start() { for (int tid = 0; tid < SOCKET_IOTHREADS; tid++) { @@ -114,8 +116,6 @@ void SocketEvents::InitializeEngine() SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject) : m_ID(m_NextID++), m_FD(socket->GetFD()), m_EnginePrivate(nullptr) { - boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeEngine); - Register(lifesupportObject); } diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 360a03477..fce7eef86 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -53,6 +53,8 @@ public: void *GetEnginePrivate() const; void SetEnginePrivate(void *priv); + static void InitializeEngine(); + protected: SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject); @@ -64,8 +66,6 @@ private: static int m_NextID; - static void InitializeEngine(); - void WakeUpThread(bool wait = false); void Register(Object *lifesupportObject); From 60c490b89fadc8f4e8dc0497500348572aee4b18 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Mon, 24 Sep 2018 19:49:14 -0400 Subject: [PATCH 0209/1162] Release v2.3.6 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f5ca4c0d..55073cdaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required (VERSION 3.0.2) -project (utf8cpp VERSION 2.3.5 LANGUAGES CXX) +project (utf8cpp VERSION 2.3.6 LANGUAGES CXX) option(UTF8_TESTS "Enable tests for UTF8-CPP" On) option(UTF8_SAMPLES "Enable building samples for UTF8-CPP" On) From cd819f74f4affcd10f44b000e313215155e15e9d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 24 Sep 2018 17:28:27 +0200 Subject: [PATCH 0210/1162] Increase the cluster reconnect frequency to 10s This is blocked by #6517. refs #6234 --- lib/remote/apilistener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 4605df364..5f9dc55f2 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -249,7 +249,7 @@ void ApiListener::Start(bool runtimeCreated) m_ReconnectTimer = new Timer(); m_ReconnectTimer->OnTimerExpired.connect(std::bind(&ApiListener::ApiReconnectTimerHandler, this)); - m_ReconnectTimer->SetInterval(60); + m_ReconnectTimer->SetInterval(10); m_ReconnectTimer->Start(); m_ReconnectTimer->Reschedule(0); From cbde35ff22479605947688c6af4255fb681d7da1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 24 Sep 2018 16:38:48 +0200 Subject: [PATCH 0211/1162] Use a dynamic thread pool for API connections The full analysis is located in #6517. fixes #6517 --- lib/remote/apilistener.cpp | 31 ++++++++++++++++++++++++++----- lib/remote/apilistener.hpp | 4 ++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 4605df364..ed5c47a95 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -112,6 +112,22 @@ void ApiListener::CopyCertificateFile(const String& oldCertPath, const String& n } } +/** + * Returns the API thread pool. + * + * @returns The API thread pool. + */ +ThreadPool& ApiListener::GetTP() +{ + static ThreadPool tp; + return tp; +} + +void ApiListener::EnqueueAsyncCallback(const std::function& callback, SchedulerPolicy policy) +{ + GetTP().Post(callback, policy); +} + void ApiListener::OnConfigLoaded() { if (m_Instance) @@ -364,8 +380,9 @@ void ApiListener::ListenerThreadProc(const Socket::Ptr& server) for (;;) { try { Socket::Ptr client = server->Accept(); - std::thread thread(std::bind(&ApiListener::NewClientHandler, this, client, String(), RoleServer)); - thread.detach(); + + /* Use dynamic thread pool with additional on demand resources with fast throughput. */ + EnqueueAsyncCallback(std::bind(&ApiListener::NewClientHandler, this, client, String(), RoleServer), LowLatencyScheduler); } catch (const std::exception&) { Log(LogCritical, "ApiListener", "Cannot accept new connection."); } @@ -399,9 +416,10 @@ void ApiListener::AddConnection(const Endpoint::Ptr& endpoint) TcpSocket::Ptr client = new TcpSocket(); try { - endpoint->SetConnecting(true); client->Connect(host, port); + NewClientHandler(client, endpoint->GetName(), RoleClient); + endpoint->SetConnecting(false); } catch (const std::exception& ex) { endpoint->SetConnecting(false); @@ -784,8 +802,11 @@ void ApiListener::ApiReconnectTimerHandler() continue; } - std::thread thread(std::bind(&ApiListener::AddConnection, this, endpoint)); - thread.detach(); + /* Set connecting state to prevent duplicated queue inserts later. */ + endpoint->SetConnecting(true); + + /* Use dynamic thread pool with additional on demand resources with fast throughput. */ + EnqueueAsyncCallback(std::bind(&ApiListener::AddConnection, this, endpoint), LowLatencyScheduler); } } diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 7868352d4..3a24133e7 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -30,6 +30,7 @@ #include "base/workqueue.hpp" #include "base/tcpsocket.hpp" #include "base/tlsstream.hpp" +#include "base/threadpool.hpp" #include namespace icinga @@ -148,6 +149,9 @@ private: void NewClientHandlerInternal(const Socket::Ptr& client, const String& hostname, ConnectionRole role); void ListenerThreadProc(const Socket::Ptr& server); + static ThreadPool& GetTP(); + static void EnqueueAsyncCallback(const std::function& callback, SchedulerPolicy policy = DefaultScheduler); + WorkQueue m_RelayQueue; WorkQueue m_SyncQueue{0, 4}; From d3fcdc1cc2149ba31eccbe906961540ed566116d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 25 Sep 2018 17:29:23 +0200 Subject: [PATCH 0212/1162] Release version 2.9.2 --- AUTHORS | 1 + CHANGELOG.md | 29 +++++++++++++++++++++++++++++ RELEASE.md | 5 +++-- VERSION | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index d906dc728..085d13168 100644 --- a/AUTHORS +++ b/AUTHORS @@ -31,6 +31,7 @@ Christian Jonak Christian Lehmann Christian Loos Christian Schmidt +Christopher Schirner Claudio Bilotta Claudio Kuenzler Conrad Clement diff --git a/CHANGELOG.md b/CHANGELOG.md index 24db33fa9..e84273a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Icinga 2.x CHANGELOG +## 2.9.2 (2018-09-26) + +### Enhancement + +* [#6602](https://github.com/icinga/icinga2/issues/6602) (API, Cluster, PR): Improve TLS handshake exception logging +* [#6568](https://github.com/icinga/icinga2/issues/6568) (Configuration, PR): Ensure that config object types are committed in dependent load order +* [#6497](https://github.com/icinga/icinga2/issues/6497) (Configuration, PR): Improve error logging for match/regex/cidr\_match functions and unsupported dictionary usage + +### Bug + +* [#6596](https://github.com/icinga/icinga2/issues/6596) (Crash, PR): Fix crash on API queries with Fedora 28 hardening and GCC 8 +* [#6581](https://github.com/icinga/icinga2/issues/6581) (Configuration, PR): Shuffle items before config validation +* [#6569](https://github.com/icinga/icinga2/issues/6569) (DB IDO): Custom Vars not updated after upgrade +* [#6533](https://github.com/icinga/icinga2/issues/6533) (Crash): Icinga2 crashes after using some api-commands on Fedora 28 +* [#6505](https://github.com/icinga/icinga2/issues/6505) (Cluster, PR): Fix clusterzonecheck if not connected +* [#6498](https://github.com/icinga/icinga2/issues/6498) (Configuration, PR): Fix regression with MatchAny false conditions on match/regex/cidr\_match +* [#6496](https://github.com/icinga/icinga2/issues/6496) (Configuration): error with match and type matchany + +### Documentation + +* [#6590](https://github.com/icinga/icinga2/issues/6590) (DB IDO, Documentation, PR): Update workaround for custom vars +* [#6572](https://github.com/icinga/icinga2/issues/6572) (Documentation, PR): Add note about workaround for broken custom vars + +### Support + +* [#6540](https://github.com/icinga/icinga2/issues/6540) (Configuration): Evaluate a fixed config compiler commit order +* [#6486](https://github.com/icinga/icinga2/issues/6486) (Configuration): Configuration validation w/ ScheduledDowntimes performance decreased in 2.9 +* [#6442](https://github.com/icinga/icinga2/issues/6442) (Configuration): Error while evaluating "assign where match" expression: std::bad\_cast + ## 2.9.1 (2018-07-24) ### Bug diff --git a/RELEASE.md b/RELEASE.md index d446c7007..23700b237 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.9.0 +VERSION=2.9.2 ``` Add your signing key to your Git configuration file, if not already there. @@ -60,10 +60,11 @@ git log --use-mailmap | grep '^Author:' | cut -f2- -d' ' | sort | uniq > AUTHORS ## Version -Update the version in the version file: +Update the version: ``` sed -i "s/Version: .*/Version: $VERSION/g" VERSION +sed -i "s/VERSION=.*/VERSION=$VERSION/g" RELEASE.md ``` ## Changelog diff --git a/VERSION b/VERSION index be4e22190..217e97675 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.9.1 +Version: 2.9.2 Revision: 1 From 1f960de940a460456e8276e3ac36f83035c9a9a4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 25 Sep 2018 17:29:23 +0200 Subject: [PATCH 0213/1162] Release version 2.9.2 --- AUTHORS | 1 + CHANGELOG.md | 29 +++++++++++++++++++++++++++++ RELEASE.md | 5 +++-- VERSION | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index d906dc728..085d13168 100644 --- a/AUTHORS +++ b/AUTHORS @@ -31,6 +31,7 @@ Christian Jonak Christian Lehmann Christian Loos Christian Schmidt +Christopher Schirner Claudio Bilotta Claudio Kuenzler Conrad Clement diff --git a/CHANGELOG.md b/CHANGELOG.md index 24db33fa9..e84273a13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Icinga 2.x CHANGELOG +## 2.9.2 (2018-09-26) + +### Enhancement + +* [#6602](https://github.com/icinga/icinga2/issues/6602) (API, Cluster, PR): Improve TLS handshake exception logging +* [#6568](https://github.com/icinga/icinga2/issues/6568) (Configuration, PR): Ensure that config object types are committed in dependent load order +* [#6497](https://github.com/icinga/icinga2/issues/6497) (Configuration, PR): Improve error logging for match/regex/cidr\_match functions and unsupported dictionary usage + +### Bug + +* [#6596](https://github.com/icinga/icinga2/issues/6596) (Crash, PR): Fix crash on API queries with Fedora 28 hardening and GCC 8 +* [#6581](https://github.com/icinga/icinga2/issues/6581) (Configuration, PR): Shuffle items before config validation +* [#6569](https://github.com/icinga/icinga2/issues/6569) (DB IDO): Custom Vars not updated after upgrade +* [#6533](https://github.com/icinga/icinga2/issues/6533) (Crash): Icinga2 crashes after using some api-commands on Fedora 28 +* [#6505](https://github.com/icinga/icinga2/issues/6505) (Cluster, PR): Fix clusterzonecheck if not connected +* [#6498](https://github.com/icinga/icinga2/issues/6498) (Configuration, PR): Fix regression with MatchAny false conditions on match/regex/cidr\_match +* [#6496](https://github.com/icinga/icinga2/issues/6496) (Configuration): error with match and type matchany + +### Documentation + +* [#6590](https://github.com/icinga/icinga2/issues/6590) (DB IDO, Documentation, PR): Update workaround for custom vars +* [#6572](https://github.com/icinga/icinga2/issues/6572) (Documentation, PR): Add note about workaround for broken custom vars + +### Support + +* [#6540](https://github.com/icinga/icinga2/issues/6540) (Configuration): Evaluate a fixed config compiler commit order +* [#6486](https://github.com/icinga/icinga2/issues/6486) (Configuration): Configuration validation w/ ScheduledDowntimes performance decreased in 2.9 +* [#6442](https://github.com/icinga/icinga2/issues/6442) (Configuration): Error while evaluating "assign where match" expression: std::bad\_cast + ## 2.9.1 (2018-07-24) ### Bug diff --git a/RELEASE.md b/RELEASE.md index d446c7007..23700b237 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.9.0 +VERSION=2.9.2 ``` Add your signing key to your Git configuration file, if not already there. @@ -60,10 +60,11 @@ git log --use-mailmap | grep '^Author:' | cut -f2- -d' ' | sort | uniq > AUTHORS ## Version -Update the version in the version file: +Update the version: ``` sed -i "s/Version: .*/Version: $VERSION/g" VERSION +sed -i "s/VERSION=.*/VERSION=$VERSION/g" RELEASE.md ``` ## Changelog diff --git a/VERSION b/VERSION index be4e22190..217e97675 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.9.1 +Version: 2.9.2 Revision: 1 From bc1dc9c7a7a9b5fb965e76a02ed9adb482429277 Mon Sep 17 00:00:00 2001 From: Jordi van Scheijen Date: Thu, 22 Jun 2017 12:31:32 +0200 Subject: [PATCH 0214/1162] Fix issue 5022 --- lib/icinga/checkable-check.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 35c406d06..c836f0726 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -260,8 +260,13 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig if (parent.get() == this) continue; - ObjectLock olock(parent); - parent->SetNextCheck(Utility::GetTime()); + if (!parent->GetEnableActiveChecks()) + continue; + + if (parent->GetNextCheck() >= now + parent->GetRetryInterval()) { + ObjectLock olock(parent); + parent->SetNextCheck(now); + } } } From 96c0de9beaf7a21fab6fe0cb2391a7b95ec35e3b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 27 Sep 2018 20:23:00 +0200 Subject: [PATCH 0215/1162] Allow to override MaxConcurrentChecks constant --- lib/base/application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 5fa49a7ba..8388e720c 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -1189,7 +1189,7 @@ int Application::GetDefaultRLimitStack() */ void Application::SetMaxConcurrentChecks(int maxChecks) { - ScriptGlobal::Set("MaxConcurrentChecks", maxChecks); + ScriptGlobal::Set("MaxConcurrentChecks", maxChecks, true); } /** From 816cae98fa6832087d01623acfbeb56942b80493 Mon Sep 17 00:00:00 2001 From: Thomas Forrer Date: Wed, 22 Aug 2018 14:47:57 +0200 Subject: [PATCH 0216/1162] Fix config validation problem (startup.log) during /v1/config/stages API call copy all arguments of parent process in AsyncTryActivateStage --- lib/remote/configpackageutility.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 34620e1db..87c6764ee 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -217,12 +217,17 @@ void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, cons // prepare arguments Array::Ptr args = new Array({ Application::GetExePath(Application::GetArgV()[0]), - "daemon", - "--validate", - "--define", - "ActiveStageOverride=" + packageName + ":" + stageName }); + // copy all arguments of parent process + for (int i=1; i < Application::GetArgC(); i++) { + args->Add(Application::GetArgV()[i]); + } + // add arguments for validation + args->Add("--validate"); + args->Add("--define"); + args->Add("ActiveStageOverride=" + packageName + ":" + stageName); + Process::Ptr process = new Process(Process::PrepareCommand(args)); process->SetTimeout(300); process->Run(std::bind(&TryActivateStageCallback, _1, packageName, stageName, reload)); From 82178e3b33e15106cae469db361a6046ab9520ea Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 27 Sep 2018 20:30:19 +0200 Subject: [PATCH 0217/1162] Don't inherit daemonize parameter from parent process --- lib/remote/configpackageutility.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 87c6764ee..607185491 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -220,9 +220,15 @@ void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, cons }); // copy all arguments of parent process - for (int i=1; i < Application::GetArgC(); i++) { - args->Add(Application::GetArgV()[i]); + for (int i = 1; i < Application::GetArgC(); i++) { + String argV = Application::GetArgV()[i]; + + if (argV == "-d" || argV == "--daemonize") + continue; + + args->Add(argV); } + // add arguments for validation args->Add("--validate"); args->Add("--define"); From 617925374b43debf60d78ff20fcc18c7b7f5aee3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 28 Sep 2018 14:32:57 +0200 Subject: [PATCH 0218/1162] Fix that check_timeout was used for Event/Notification commands too We may add specific timeouts for event/notification commands later, for now the original timeout inside the EventCommand/NotificationCommand is used. fixes #6304 --- lib/icinga/pluginutility.cpp | 8 ++------ lib/icinga/pluginutility.hpp | 2 +- lib/methods/pluginchecktask.cpp | 7 ++++++- lib/methods/plugineventtask.cpp | 4 +++- lib/methods/pluginnotificationtask.cpp | 4 +++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 0dcc70997..8ce301ac8 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -32,7 +32,7 @@ using namespace icinga; void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const MacroProcessor::ResolverList& macroResolvers, - const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, + const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, int timeout, const std::function& callback) { Value raw_command = commandObj->GetCommandLine(); @@ -86,11 +86,7 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab Process::Ptr process = new Process(Process::PrepareCommand(command), envMacros); - if (checkable->GetCheckTimeout().IsEmpty()) - process->SetTimeout(commandObj->GetTimeout()); - else - process->SetTimeout(checkable->GetCheckTimeout()); - + process->SetTimeout(timeout); process->SetAdjustPriority(true); process->Run(std::bind(callback, command, _1)); diff --git a/lib/icinga/pluginutility.hpp b/lib/icinga/pluginutility.hpp index 756ad9d97..1cfd38d87 100644 --- a/lib/icinga/pluginutility.hpp +++ b/lib/icinga/pluginutility.hpp @@ -41,7 +41,7 @@ class PluginUtility public: static void ExecuteCommand(const Command::Ptr& commandObj, const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const MacroProcessor::ResolverList& macroResolvers, - const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, + const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, int timeout, const std::function& callback = std::function()); static ServiceState ExitStatusToState(int exitStatus); diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index 1709583a4..31fcc658a 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -52,8 +52,13 @@ void PluginCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes resolvers.emplace_back("command", commandObj); resolvers.emplace_back("icinga", IcingaApplication::GetInstance()); + int timeout = commandObj->GetTimeout(); + + if (!checkable->GetCheckTimeout().IsEmpty()) + timeout = checkable->GetCheckTimeout(); + PluginUtility::ExecuteCommand(commandObj, checkable, checkable->GetLastCheckResult(), - resolvers, resolvedMacros, useResolvedMacros, + resolvers, resolvedMacros, useResolvedMacros, timeout, std::bind(&PluginCheckTask::ProcessFinishedHandler, checkable, cr, _1, _2)); if (!resolvedMacros || useResolvedMacros) diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index d42db23f3..550d159d1 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -51,8 +51,10 @@ void PluginEventTask::ScriptFunc(const Checkable::Ptr& checkable, resolvers.emplace_back("command", commandObj); resolvers.emplace_back("icinga", IcingaApplication::GetInstance()); + int timeout = commandObj->GetTimeout(); + PluginUtility::ExecuteCommand(commandObj, checkable, checkable->GetLastCheckResult(), - resolvers, resolvedMacros, useResolvedMacros, + resolvers, resolvedMacros, useResolvedMacros, timeout, std::bind(&PluginEventTask::ProcessFinishedHandler, checkable, _1, _2)); } diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index 948f2dbed..6bf75e75d 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -68,8 +68,10 @@ void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification, resolvers.emplace_back("command", commandObj); resolvers.emplace_back("icinga", IcingaApplication::GetInstance()); + int timeout = commandObj->GetTimeout(); + PluginUtility::ExecuteCommand(commandObj, checkable, cr, resolvers, - resolvedMacros, useResolvedMacros, + resolvedMacros, useResolvedMacros, timeout, std::bind(&PluginNotificationTask::ProcessFinishedHandler, checkable, _1, _2)); } From 6d114b16e4a1fb150ff1631e933c764d411cf588 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 1 Oct 2018 16:24:37 +0200 Subject: [PATCH 0219/1162] node setup: always respect --accept-config and --accept-commands --- lib/cli/nodesetupcommand.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index 86581e6ea..e97b9952e 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -121,12 +121,6 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v if (vm.count("trustedcert")) Log(LogWarning, "cli", "Master for Node setup: Ignoring --trustedcert"); - if (vm.count("accept-config")) - Log(LogWarning, "cli", "Master for Node setup: Ignoring --accept-config"); - - if (vm.count("accept-commands")) - Log(LogWarning, "cli", "Master for Node setup: Ignoring --accept-commands"); - String cn = Utility::GetFQDN(); if (vm.count("cn")) @@ -212,6 +206,18 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v fp << " bind_port = " << tokens[1] << "\n"; } + fp << "\n"; + + if (vm.count("accept-config")) + fp << " accept_config = true\n"; + else + fp << " accept_config = false\n"; + + if (vm.count("accept-commands")) + fp << " accept_commands = true\n"; + else + fp << " accept_commands = false\n"; + fp << "\n" << " ticket_salt = TicketSalt\n" << "}\n"; From 002f59e53a0968a49e9528d9c30b9f1ac575e95f Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 4 Oct 2018 11:06:27 +0200 Subject: [PATCH 0220/1162] Fix check_memory thresholds in 'used' mode The thresholds in the used mode now breaks if the value is bigger than the threshold. --- plugins/check_memory.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index e69e02700..2d723b487 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -150,7 +150,11 @@ static int parseArguments(int ac, WCHAR ** av, po::variables_map& vm, printInfoS } } - printInfo.showUsed = vm.count("show-used") > 0; + if (vm.count("show-used")) { + printInfo.showUsed = true; + printInfo.warn.legal = true; + printInfo.crit.legal = true; + } return -1; } From 9390d7e453d67b43df92936aac28080431423ba0 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 4 Oct 2018 10:55:21 +0200 Subject: [PATCH 0221/1162] Add 'used' feature to check_swap This implements the _used_ feature to check_swap to print the used swap instead of the default available swap. --- plugins/check_swap.cpp | 53 ++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 51f8bde22..4c3a1deb0 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -36,6 +36,7 @@ struct printInfoStruct double aSwap; double percentFree; Bunit unit = BunitMB; + bool showUsed; }; struct pageFileInfo @@ -73,6 +74,7 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt ("warning,w", po::wvalue(), "Warning threshold") ("critical,c", po::wvalue(), "Critical threshold") ("unit,u", po::wvalue(), "The unit to use for display (default MB)") + ("show-used,U", "Show used swap instead of the free swap") ; po::wcommand_line_parser parser(ac, av); @@ -167,6 +169,12 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt } } + if (vm.count("show-used")) { + printInfo.showUsed = true; + printInfo.warn.legal = true; + printInfo.crit.legal = true; + } + return -1; } @@ -177,30 +185,35 @@ static int printOutput(printInfoStruct& printInfo) state state = OK; - if (printInfo.warn.rend(printInfo.aSwap, printInfo.tSwap)) + std::wcout << L"SWAP "; + + double currentValue; + + if (!printInfo.showUsed) + currentValue = printInfo.aSwap; + else + currentValue = printInfo.tSwap - printInfo.aSwap; + + if (printInfo.warn.rend(currentValue, printInfo.tSwap)) { state = WARNING; - - if (printInfo.crit.rend(printInfo.aSwap, printInfo.tSwap)) + std::wcout << L"WARNING - "; + } else if (printInfo.crit.rend(currentValue, printInfo.tSwap)) { state = CRITICAL; - - switch (state) { - case OK: - std::wcout << L"SWAP OK - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" - << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) - << L";0;" << printInfo.tSwap << '\n'; - break; - case WARNING: - std::wcout << L"SWAP WARNING - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" - << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) - << L";0;" << printInfo.tSwap << '\n'; - break; - case CRITICAL: - std::wcout << L"SWAP CRITICAL - " << printInfo.percentFree << L"% free | 'swap'=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";" - << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) - << L";0;" << printInfo.tSwap << '\n'; - break; + std::wcout << L"CRITICAL - "; + } else { + state = OK; + std::wcout << L"OK - "; } + if (!printInfo.showUsed) + std::wcout << printInfo.percentFree << L"% free "; + else + std::wcout << 100 - printInfo.percentFree << L"% used "; + + std::wcout << "| 'swap'=" << currentValue << BunitStr(printInfo.unit) << L";" + << printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap) + << L";0;" << printInfo.tSwap << '\n'; + return state; } From 4f3ab9b1c8e06719333e004987d1241d2625cbbb Mon Sep 17 00:00:00 2001 From: teclogi <27726999+teclogi@users.noreply.github.com> Date: Mon, 1 Oct 2018 12:02:30 +0200 Subject: [PATCH 0222/1162] Add 'used' parameter to memory-windows ITL command --- doc/10-icinga-template-library.md | 1 + itl/command-plugins-windows.conf | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index fb36af490..2c2d082e6 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1546,6 +1546,7 @@ Name | Description memory\_win\_warn | **Optional**. The warning threshold. Defaults to "10%". memory\_win\_crit | **Optional**. The critical threshold. Defaults to "5%". memory\_win\_unit | **Optional**. The unit to display the received value in, thresholds are interpreted in this unit. Defaults to "mb" (megabyte), possible values are: b, kb, mb, gb and tb. +memory\_win\_show\_used | **Optional**. Show used memory instead of the free memory. ### network-windows diff --git a/itl/command-plugins-windows.conf b/itl/command-plugins-windows.conf index 1e48dc6b0..c0d2b125a 100644 --- a/itl/command-plugins-windows.conf +++ b/itl/command-plugins-windows.conf @@ -85,6 +85,10 @@ object CheckCommand "memory-windows" { value = "$memory_win_unit$" description = "Use this unit to display memory" } + "-U" = { + set_if = "$memory_win_show_used$" + description = "Show used memory instead of the free memory" + } } //The default From ad1ab4239349deef3f566de71a372aab9e44461f Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Sat, 6 Oct 2018 20:26:15 +0200 Subject: [PATCH 0223/1162] Update ITL for windows check_swap 'used' feature --- doc/10-icinga-template-library.md | 12 ++++++------ itl/command-plugins-windows.conf | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index fb36af490..f6ebe4ac4 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1632,12 +1632,12 @@ The data collection is instant. Custom attributes: -Name | Description -:---------------|:------------ -swap\_win\_warn | **Optional**. The warning threshold. Defaults to "10%". -swap\_win\_crit | **Optional**. The critical threshold. Defaults to "5%". -swap\_win\_unit | **Optional**. The unit to display the received value in, thresholds are interpreted in this unit. Defaults to "mb" (megabyte). - +Name | Description +:--------------- | :------------ +swap\_win\_warn | **Optional**. The warning threshold. Defaults to "10%". +swap\_win\_crit | **Optional**. The critical threshold. Defaults to "5%". +swap\_win\_unit | **Optional**. The unit to display the received value in, thresholds are interpreted in this unit. Defaults to "mb" (megabyte). +swap\_win\_show\_used | **Optional**. Show used swap instead of the free swap. ### update-windows diff --git a/itl/command-plugins-windows.conf b/itl/command-plugins-windows.conf index 1e48dc6b0..3ba7c98f7 100644 --- a/itl/command-plugins-windows.conf +++ b/itl/command-plugins-windows.conf @@ -258,6 +258,10 @@ object CheckCommand "swap-windows" { value = "$swap_win_unit$" description = "Unit to display swap in" } + "-U" = { + set_if = "$swap_win_show_used$" + description = "Show used swap instead of the free swap" + } } // Default From 57081176deab0fc592ce0bb5573c5b7162e1e647 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 12:22:19 +0200 Subject: [PATCH 0224/1162] Improve logging for disconnected HTTP clients Previously this was inside the debug log, with the new socket printers we can enhance checking for proper connects and disconnects. refs #6514 --- lib/remote/httpserverconnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 497ce7b83..f4bb14439 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -83,7 +83,8 @@ void HttpServerConnection::Disconnect() return; } - Log(LogDebug, "HttpServerConnection", "Http client disconnected"); + Log(LogInformation, "HttpServerConnection") + << "HTTP client disconnected (from " << m_Stream->GetSocket()->GetPeerAddress() << ")"; ApiListener::Ptr listener = ApiListener::GetInstance(); listener->RemoveHttpClient(this); From 73263b77027c813c71332338cc04d2f16e93e35d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 12:55:53 +0200 Subject: [PATCH 0225/1162] Enable the HTTP request body debug log entry for release builds fixes #4282 --- lib/remote/httputility.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 2788a03b2..1647c46aa 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -35,10 +35,9 @@ Dictionary::Ptr HttpUtility::FetchRequestParameters(HttpRequest& request) body += String(buffer, buffer + count); if (!body.IsEmpty()) { -#ifdef I2_DEBUG Log(LogDebug, "HttpUtility") << "Request body: '" << body << "'"; -#endif /* I2_DEBUG */ + result = JsonDecode(body); } From 13239c3172b625f615b663cd809530b1441149dc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 13:23:23 +0200 Subject: [PATCH 0226/1162] Ensure that HTTP/1.0 or Connection: close headers are properly disconnecting the client Test results: https://github.com/Icinga/icinga2/issues/6514#issuecomment-428155731 fixes #6514 --- lib/remote/httpresponse.cpp | 3 --- lib/remote/httpserverconnection.cpp | 7 +++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index 45ac25c81..cfe99d608 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -111,9 +111,6 @@ void HttpResponse::Finish() } m_State = HttpResponseEnd; - - if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") - m_Stream->Shutdown(); } bool HttpResponse::Parse(StreamReadContext& src, bool may_wait) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 497ce7b83..aa960c25b 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -357,6 +357,13 @@ void HttpServerConnection::DataAvailableHandler() } m_RequestQueue.Enqueue(std::bind(&Stream::SetCorked, m_Stream, false)); + + /* Request finished, decide whether to explicitly close the connection. */ + if (m_CurrentRequest.ProtocolVersion == HttpVersion10 || + m_CurrentRequest.Headers->Get("connection") == "close") { + m_Stream->Shutdown(); + close = true; + } } else close = true; From 5c32a5a7dcd220598d36b2b47e745d14c23edb93 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 15:40:16 +0200 Subject: [PATCH 0227/1162] Cache the peer address in the HTTP server Later socket calls are expensive and might lead into a race condition on close when logging it. refs #6655 --- lib/remote/httpserverconnection.cpp | 17 +++++++++++++---- lib/remote/httpserverconnection.hpp | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index f4bb14439..9d8f192c4 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -47,6 +47,17 @@ HttpServerConnection::HttpServerConnection(const String& identity, bool authenti if (authenticated) m_ApiUser = ApiUser::GetByClientCN(identity); + + /* Cache the peer address. */ + m_PeerAddress = ""; + + if (stream) { + Socket::Ptr socket = m_Stream->GetSocket(); + + if (socket) { + m_PeerAddress = socket->GetPeerAddress(); + } + } } void HttpServerConnection::StaticInitialize() @@ -84,7 +95,7 @@ void HttpServerConnection::Disconnect() } Log(LogInformation, "HttpServerConnection") - << "HTTP client disconnected (from " << m_Stream->GetSocket()->GetPeerAddress() << ")"; + << "HTTP client disconnected (from " << m_PeerAddress << ")"; ApiListener::Ptr listener = ApiListener::GetInstance(); listener->RemoveHttpClient(this); @@ -201,11 +212,9 @@ bool HttpServerConnection::ManageHeaders(HttpResponse& response) String requestUrl = m_CurrentRequest.RequestUrl->Format(); - Socket::Ptr socket = m_Stream->GetSocket(); - Log(LogInformation, "HttpServerConnection") << "Request: " << m_CurrentRequest.RequestMethod << " " << requestUrl - << " (from " << (socket ? socket->GetPeerAddress() : "") + << " (from " << m_PeerAddress << ")" << ", user: " << (m_AuthenticatedUser ? m_AuthenticatedUser->GetName() : "") << ")"; ApiListener::Ptr listener = ApiListener::GetInstance(); diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index 6d1c3bd46..7712ad66d 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -59,6 +59,7 @@ private: boost::recursive_mutex m_DataHandlerMutex; WorkQueue m_RequestQueue; int m_PendingRequests; + String m_PeerAddress; StreamReadContext m_Context; From 83a428c1ba51ce8348ff73b53e6707707df844e2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 16:01:43 +0200 Subject: [PATCH 0228/1162] Keep the HTTP server connection open until the stream is EOF fixes #4968 --- lib/remote/httpserverconnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 337673a69..913814b79 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -383,7 +383,7 @@ void HttpServerConnection::DataAvailableHandler() void HttpServerConnection::CheckLiveness() { - if (m_Seen < Utility::GetTime() - 10 && m_PendingRequests == 0) { + if (m_Seen < Utility::GetTime() - 10 && m_PendingRequests == 0 && m_Stream->IsEof()) { Log(LogInformation, "HttpServerConnection") << "No messages for Http connection have been received in the last 10 seconds."; Disconnect(); From 85e161ea1edf76d0abd9d6703e43c33b864666be Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 16:41:17 +0200 Subject: [PATCH 0229/1162] Silence config compiler logging for runtime created objects This is especially problematic with many single creation requests, e.g. many downtimes created via Icinga Web 2 & the REST API. In addition to the config compiler messages, apply rule matches are also in there which are removed by this patch. --- lib/config/applyrule.cpp | 4 ++-- lib/config/applyrule.hpp | 2 +- lib/config/configitem.cpp | 2 +- lib/remote/configobjectutility.cpp | 7 ++++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/config/applyrule.cpp b/lib/config/applyrule.cpp index c8f012e23..7bbb8d7e0 100644 --- a/lib/config/applyrule.cpp +++ b/lib/config/applyrule.cpp @@ -158,11 +158,11 @@ std::vector& ApplyRule::GetRules(const String& type) return it->second; } -void ApplyRule::CheckMatches() +void ApplyRule::CheckMatches(bool silent) { for (const RuleMap::value_type& kv : m_Rules) { for (const ApplyRule& rule : kv.second) { - if (!rule.HasMatches()) + if (!rule.HasMatches() && !silent) Log(LogWarning, "ApplyRule") << "Apply rule '" << rule.GetName() << "' (" << rule.GetDebugInfo() << ") for type '" << kv.first << "' does not match anywhere!"; } diff --git a/lib/config/applyrule.hpp b/lib/config/applyrule.hpp index 91623df75..b57d6c565 100644 --- a/lib/config/applyrule.hpp +++ b/lib/config/applyrule.hpp @@ -62,7 +62,7 @@ public: static bool IsValidTargetType(const String& sourceType, const String& targetType); static std::vector GetTargetTypes(const String& sourceType); - static void CheckMatches(); + static void CheckMatches(bool silent); private: String m_TargetType; diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index f435c9481..503491b52 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -618,7 +618,7 @@ bool ConfigItem::CommitItems(const ActivationContext::Ptr& context, WorkQueue& u return false; } - ApplyRule::CheckMatches(); + ApplyRule::CheckMatches(silent); if (!silent) { /* log stats for external parsers */ diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index fff206328..7feb9e84f 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -143,7 +143,8 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full std::vector newItems; - if (!ConfigItem::CommitItems(ascope.GetContext(), upq, newItems) || !ConfigItem::ActivateItems(upq, newItems, true)) { + /* Disable logging for object creation, but do so ourselves later on. */ + if (!ConfigItem::CommitItems(ascope.GetContext(), upq, newItems, true) || !ConfigItem::ActivateItems(upq, newItems, true, true)) { if (errors) { if (unlink(path.CStr()) < 0 && errno != ENOENT) { BOOST_THROW_EXCEPTION(posix_error() @@ -164,6 +165,10 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full } ApiListener::UpdateObjectAuthority(); + + Log(LogInformation, "ConfigObjectUtility") + << "Created and activated object '" << fullName << "' of type '" << type->GetName() << "'."; + } catch (const std::exception& ex) { if (unlink(path.CStr()) < 0 && errno != ENOENT) { BOOST_THROW_EXCEPTION(posix_error() From 4be9f418a9ae6626921dbd213a7d54953cf3aef6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 9 Oct 2018 19:38:29 +0200 Subject: [PATCH 0230/1162] Revert "Initialize Socket Event Engine on application startup" This reverts commit c8dcd1297f6d0be8685c5a3079e40fc44e779add. We cannot do this during application startup, since Daemonize() kills the threads again. refs #6514 refs #6630 --- lib/base/socketevents.cpp | 4 ++-- lib/base/socketevents.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 0e2be5017..b967a345f 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -35,8 +35,6 @@ static SocketEventEngine *l_SocketIOEngine; int SocketEvents::m_NextID = 0; -INITIALIZE_ONCE(&SocketEvents::InitializeEngine); - void SocketEventEngine::Start() { for (int tid = 0; tid < SOCKET_IOTHREADS; tid++) { @@ -116,6 +114,8 @@ void SocketEvents::InitializeEngine() SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject) : m_ID(m_NextID++), m_FD(socket->GetFD()), m_EnginePrivate(nullptr) { + boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeEngine); + Register(lifesupportObject); } diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index fce7eef86..360a03477 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -53,8 +53,6 @@ public: void *GetEnginePrivate() const; void SetEnginePrivate(void *priv); - static void InitializeEngine(); - protected: SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject); @@ -66,6 +64,8 @@ private: static int m_NextID; + static void InitializeEngine(); + void WakeUpThread(bool wait = false); void Register(Object *lifesupportObject); From 73a7230f1babed9184d7b5d0bff16d7caefec4bd Mon Sep 17 00:00:00 2001 From: Stefan Bethke Date: Wed, 10 Oct 2018 00:52:59 +0200 Subject: [PATCH 0231/1162] Make the two modes of check_http more obvious. See https://github.com/monitoring-plugins/monitoring-plugins/issues/1553 --- doc/10-icinga-template-library.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 231a112dc..aa38ee46f 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -600,6 +600,8 @@ tests the HTTP service on the specified host. It can test normal (http) and secu (https) servers, follow redirects, search for strings and regular expressions, check connection times, and report on certificate expiration times. +The plugin can either test the HTTP response of a server, or if `http_certificate` is set to a non-empty value, the TLS certificate age for a HTTPS host. + Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): Name | Description @@ -2596,7 +2598,7 @@ Custom attributes passed as [command parameters](03-monitoring-basics.md#command Name | Description --------------------------------|----------------------------------------------------------------------- lsi_controller_number | **Optional.** Controller number to monitor. -storcli_path | **Optional.** Path to the `storcli` binary, e.g. "/usr/sbin/storcli". +storcli_path | **Optional.** Path to the `storcli` binary, e.g. "/usr/sbin/storcli". lsi_enclosure_id | **Optional.** Enclosure numbers to be checked, comma-separated. lsi_ld_id | **Optional.** Logical devices to be checked, comma-separated. lsi_pd_id | **Optional.** Physical devices to be checked, comma-separated. From 355b21a04ca57d57cf1dc8623cee15e862ab5afa Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 10 Oct 2018 15:20:56 +0200 Subject: [PATCH 0232/1162] Enhance vim syntax highlighting for 2.10 - object types (and 'host' inside apply) are now green again - special underlined macro highlighting - add missing object types, attributes and constants - add new constants and namespaces/references for 2.10 - Large refactoring into sub matches I don't use nano, so we need a nano hero to incorporate these changes here into their syntax highlighting file :) refs #5683 --- tools/syntax/vim/syntax/icinga2.vim | 256 +++++++++++++++++++++------- 1 file changed, 192 insertions(+), 64 deletions(-) diff --git a/tools/syntax/vim/syntax/icinga2.vim b/tools/syntax/vim/syntax/icinga2.vim index d4953a2dd..33d178671 100644 --- a/tools/syntax/vim/syntax/icinga2.vim +++ b/tools/syntax/vim/syntax/icinga2.vim @@ -1,8 +1,8 @@ " Vim syntax file " Filename: icinga2.vim " Language: Icinga2 object configuration file -" Author: Carlos Cesario -" Version: 0.0.2 +" Author: Carlos Cesario , Michael Friedrich +" Version: 1.0.0 " Based: javascript.vim / nagios.vim " For version 5.x: Clear all syntax items @@ -16,10 +16,12 @@ if !exists("main_syntax") let main_syntax = 'icinga2' endif - " case off syntax case ignore +" ######################################## +" ### General settings + " comments syn keyword icinga2CommentTodo TODO FIXME XXX TBD contained syn match icinga2LineComment "\/\/.*" contains=icinga2CommentTodo @@ -32,9 +34,10 @@ syn region icinga2Comment start="/\*" end="\*/" contains=icinga2CommentTodo " - single quotes ' " - brackets <> -syn region StringD start=+"+ end=+"\|$+ -syn region StringS start=+'+ end=+'\|$+ -syn match angleBrackets "<\w\+>" +syn match angleBrackets "<.*>" +syn region macro start=+\$+ end=+\$+ oneline +syn region StringD start=+"+ end=+"\|$+ contains=macro +syn region StringS start=+'+ end=+'\|$+ contains=macro " Braces and Parens definition @@ -42,59 +45,84 @@ syn match angleBrackets "<\w\+>" syn match Braces "[{}\[\]]" syn match Parens "[()]" +syn match Lambda "{{}}" -" objects types -syn match icinga2ObjDef "object[ \t]\+\(hostgroup\|host\|servicegroup\|service\|usergroup\|user\)" -syn match icinga2ObjDef "object[ \t]\+\(checkcommand\|notificationcommand\|eventcommand\|notification\)" -syn match icinga2Objdef "object[ \t]\+\(timeperiod\|scheduleddowntime\|dependency\|perfdatawriter\)" -syn match icinga2ObjDef "object[ \t]\+\(graphitewriter\|idomysqlconnection\|idomysqlconnection\)" -syn match icinga2ObjDef "object[ \t]\+\(livestatuslistener\|statusdatawriter\|externalcommandlistener\)" -syn match icinga2ObjDef "object[ \t]\+\(compatlogger\|checkresultreader\|checkcomponent\|notificationcomponent\)" -syn match icinga2ObjDef "object[ \t]\+\(filelogger\|sysloglogger\|icingaapplication\|apilistener\|apiuser\|endpoint\|zone\)" +" ######################################## +" ### Match objects, attributes and keywords +" Object types +syn keyword icinga2ObjType ApiListener ApiUser CheckCommand CheckerComponent +syn keyword icinga2ObjType Comment Dependency Downtime ElasticsearchWriter +syn keyword icinga2ObjType Endpoint EventCommand ExternalCommandListener +syn keyword icinga2ObjType FileLogger GelfWriter GraphiteWriter Host HostGroup +syn keyword icinga2ObjType IcingaApplication IdoMysqlConnection IdoPgsqlConnection +syn keyword icinga2ObjType InfluxdbWriter LivestatusListener Notification NotificationCommand +syn keyword icinga2ObjType NotificationComponent OpenTsdbWriter PerfdataWriter +syn keyword icinga2ObjType ScheduledDowntime Service ServiceGroup SyslogLogger +syn keyword icinga2ObjType TimePeriod User UserGroup Zone -" apply def +" Object/Template marker (simplified) +syn match icinga2ObjDef "\(object\|template\)[ \t]\+.*" + +" Apply rules syn match icinga2ApplyDef "apply[ \t]\+\(Service\|Dependency\|Notification\|ScheduledDowntime\)" -" objects attributes -syn keyword icinga2ObjAttr contained accept_commands accept_config action_url address address6 arguments author bind_host +" Objects attributes +" +" find . -type f -name '*.ti' -exec sh -c 'grep config {}' \; +" Don't add 'host', etc. from apply rules here, they should match icinga2ObjType instead. +syn keyword icinga2ObjAttr contained accept_commands accept_config access_control_allow_origin action_url address address6 arguments author bind_host syn keyword icinga2ObjAttr contained bind_port ca_path categories cert_path check_command check_interval -syn keyword icinga2ObjAttr contained check_period child_host_name child_service_name cleanup client_cn command command_endpoint command_path -syn keyword icinga2ObjAttr contained comment compat_log_path crl_path database disable_checks disable_notifications +syn keyword icinga2ObjAttr contained check_period check_timeout child_host_name child_options child_service_name cipher_list +syn keyword icinga2ObjAttr contained cleanup client_cn command command_endpoint command_path +syn keyword icinga2ObjAttr contained comment compat_log_path concurrent_checks crl_path database disable_checks disable_notifications syn keyword icinga2ObjAttr contained display_name duration email enable_active_checks enable_event_handlers enable_event_handler syn keyword icinga2ObjAttr contained enable_flapping enable_ha enable_host_checks enable_notifications enable_passive_checks enable_perfdata -syn keyword icinga2ObjAttr contained enable_service_checks endpoints env event_command failover_timeout fixed flapping_threshold groups host -syn keyword icinga2ObjAttr contained host_format_template host_name host_name_template host_perfdata_path host_temp_path icon_image -syn keyword icinga2ObjAttr contained icon_image_alt instance_description instance_name interval key_path log_dir -syn keyword icinga2ObjAttr contained log_duration max_check_attempts methods name notes notes_url objects_path +syn keyword icinga2ObjAttr contained enable_send_metadata enable_send_perfdata enable_send_thresholds enable_tls enable_service_checks +syn keyword icinga2ObjAttr contained endpoints env event_command excludes failover_timeout fixed flapping_threshold_low flapping_threshold_high +syn keyword icinga2ObjAttr contained flush_interval flush_threshold global groups +syn keyword icinga2ObjAttr contained host_format_template host_name host_name_template host_perfdata_path host_temp_path host_template icon_image +syn keyword icinga2ObjAttr contained icon_image_alt ignore_soft_states includes index instance_description instance_name interval key_path log_dir +syn keyword icinga2ObjAttr contained log_duration max_anonymous_clients max_check_attempts methods name notes notes_url objects_path syn keyword icinga2ObjAttr contained pager parent parent_host_name parent_service_name password path period permissions -syn keyword icinga2ObjAttr contained port ranges retry_interval rotation_interval rotation_method -syn keyword icinga2ObjAttr contained service_format_template service_name service_name_template service_perfdata_path service_temp_path -syn keyword icinga2ObjAttr contained severity socket_path socket_type spool_dir states status_path table_prefix -syn keyword icinga2ObjAttr contained timeout times types update_interval user user_groups users volatile zone +syn keyword icinga2ObjAttr contained port prefer_includes ranges retry_interval rotation_interval rotation_method +syn keyword icinga2ObjAttr contained service_format_template service_name service_name_template service_perfdata_path service_temp_path service_template +syn keyword icinga2ObjAttr contained severity socket_path socket_type source spool_dir +syn keyword icinga2ObjAttr contained ssl_ca ssl_capath ssl_ca_cert ssl_cert ssl_cipher ssl_enable ssl_mode ssl_key +syn keyword icinga2ObjAttr contained states status_path table_prefix ticket_salt +syn keyword icinga2ObjAttr contained timeout times tls_handshake_timeout tls_protocolmin +syn keyword icinga2ObjAttr contained types update_interval user user_groups username users volatile zone syn match icinga2ObjAttr contained "\(vars.\w\+\)" - -" keywords -syn keyword icinga2Keyword template const import include include_recursive var function return to use locals globals this +" keywords: https://www.icinga.com/docs/icinga2/latest/doc/17-language-reference/#reserved-keywords +syn keyword icinga2Keyword object template include include_recursive include_zones library +syn keyword icinga2Keyword const var this globals locals use default ignore_on_error +syn keyword icinga2Keyword current_filename current_line apply to where import assign +syn keyword icinga2Keyword ignore function return in " Assign conditions syn match icinga2AssignCond contained "\(assign[ \t]\+\where\|ignore[ \t]\+\where\)" +" Documentation reference: https://www.icinga.com/docs/icinga2/latest/doc/18-library-reference/ + " Global functions -syn keyword icinga2GFunction contained regex match cidr_match len union intersection keys string +syn keyword icinga2GFunction contained regex match cidr_match range len union intersection keys string syn keyword icinga2GFunction contained number bool random log typeof get_time parse_performance_data dirname -syn keyword icinga2GFunction contained basename escape_shell_arg escape_shell_cmd escape_create_process_arg exit +syn keyword icinga2GFunction contained basename path_exists glob glob_recursive +syn keyword icinga2GFunction contained escape_shell_arg escape_shell_cmd escape_create_process_arg sleep exit +syn keyword icinga2GFunction contained macro " Accessor Functions -syn keyword icinga2AFunction contained get_host get_service get_user get_check_command get_event_command get_notification_command -syn keyword icinga2AFunction contained get_host_group get_service_group get_user_group get_time_period - +syn keyword icinga2AFunction contained get_check_command get_event_command get_notification_command +syn keyword icinga2AFunction contained get_host get_service get_services get_user +syn keyword icinga2AFunction contained get_host_group get_service_group get_user_group +syn keyword icinga2AFunction contained get_timeperiod +syn keyword icinga2AFunction contained get_object get_objects " Math functions syn match icinga2MathFunction contained "\(Math.E\|Math.LN2\|Math.LN10\|Math.LOG2E\|Math.PI\|Math.SQRT1_2\|Math.SQRT2\)" @@ -103,7 +131,13 @@ syn match icinga2MathFunction contained "\(Math.exp\|Math.floor\|Math.isinf\|M syn match icinga2MathFunction contained "\(Math.pow\|Math.random\|Math.round\|Math.sign\|Math.sin\|Math.sqrt\|Math.tan\)" " Json functions -syn match icinga2JsonFunction contained "\(Json.encode\|Json.decode\)" +syn match icinga2JsonFunction contained "\(Json.encode\|Json.decode\)" + +" Number functions +syn match icinga2NumberFunction contained "\(\.to_string\)" + +" Boolean functions +syn match icinga2BoolFunction contained "\(\.to_string\)" " String functions syn match icinga2StrFunction contained "\(\.find\)" @@ -116,13 +150,25 @@ syn match icinga2StrFunction contained "\(\.split\)" syn match icinga2StrFunction contained "\(\.substr\)" syn match icinga2StrFunction contained "\(\.to_string\)" syn match icinga2StrFunction contained "\(\.reverse\)" +syn match icinga2StrFunction contained "\(\.trim\)" -" Array and Dict Functions -syn match icinga2ArrFunction contained "\(\.clone\)" +" Object functions +syn match icinga2ObjectFunction contained "\(\.clone\)" +syn match icinga2ObjectFunction contained "\(\.to_string\)" +syn match icinga2ObjectFunction contained "\(\.type\)" + +" Type functions +syn match icinga2TypeFunction contained "\(\.base\)" +" needs an exception for 'vars' +syn match icinga2TypeFunction contained "\(^[vars]\.name\)" +syn match icinga2TypeFunction contained "\(\.prototype\)" + +" Array functions syn match icinga2ArrFunction contained "\(\.add(\)" syn match icinga2ArrFunction contained "\(\.clear\)" syn match icinga2ArrFunction contained "\(\.shallow_clone\)" syn match icinga2ArrFunction contained "\(\.contains\)" +syn match icinga2ArrFunction contained "\(\.freeze\)" syn match icinga2ArrFunction contained "\(\.len\)" syn match icinga2ArrFunction contained "\(\.remove\)" syn match icinga2ArrFunction contained "\(\.set\)" @@ -130,10 +176,31 @@ syn match icinga2ArrFunction contained "\(\.get\)" syn match icinga2ArrFunction contained "\(\.sort\)" syn match icinga2ArrFunction contained "\(\.join\)" syn match icinga2ArrFunction contained "\(\.reverse\)" -syn match icinga2ArrFunction contained "\(\.keys\)" -syn match icinga2ArrFunction contained "\(\.call\)" -syn match icinga2ArrFunction contained "\(\.callv\)" +syn match icinga2ArrFunction contained "\(\.map\)" +syn match icinga2ArrFunction contained "\(\.reduce\)" +syn match icinga2ArrFunction contained "\(\.filter\)" +syn match icinga2ArrFunction contained "\(\.any\)" +syn match icinga2ArrFunction contained "\(\.all\)" +" Dictionary functions +syn match icinga2DictFunction contained "\(\.shallow_clone\)" +syn match icinga2DictFunction contained "\(\.contains\)" +syn match icinga2DictFunction contained "\(\.freeze\)" +syn match icinga2DictFunction contained "\(\.len\)" +syn match icinga2DictFunction contained "\(\.remove\)" +syn match icinga2DictFunction contained "\(\.set\)" +syn match icinga2DictFunction contained "\(\.get\)" +syn match icinga2DictFunction contained "\(\.keys\)" +syn match icinga2DictFunction contained "\(\.values\)" + +" Function functions +syn match icinga2FuncFunction contained "\(\.call\)" +syn match icinga2FuncFunction contained "\(\.callv\)" + +" DateTime functions +syn match icinga2DTFunction contained "\(DateTime\)" +syn match icinga2DTFunction contained "\(\.format\)" +syn match icinga2DTFunction contained "\(\.to_string\)" " Conditional statements syn keyword icinga2Cond if else @@ -141,6 +208,17 @@ syn keyword icinga2Cond if else " Loops syn keyword icinga2Loop while for break continue +" Exceptions +syn keyword icinga2Exception throw try except + +" Debugger +syn keyword icinga2Debugger debugger + +" References +syn keyword icinga2Reference & * +" Namespace +syn keyword icinga2Namespace namespace using + " Operators syn match icinga2Operators "[ \t]\+\(\.\)\+" syn match icinga2Operators "[ \t]\+\(!\)\+" @@ -174,59 +252,109 @@ syn match icinga2Operators "[ \t]\+\(-=\)\+" syn match icinga2Operators "[ \t]\+\(*=\)\+" syn match icinga2Operators "[ \t]\+\(/=\)\+" -" global constats -syn keyword icinga2Gconst PrefixDir SysconfDir ZonesDir LocalStateDir RunDir PkgDataDir StatePath ObjectsPath -syn keyword icinga2Gconst PidPath NodeName ApplicationType UseVfork RunAsUser RunAsGroup PluginDir -" global types -syn keyword icinga2Gconst Number String Boolean Array Dictionary Value Object ConfigObject Command CheckResult -syn keyword icinga2Gconst Checkable CustomVarObject DbConnection Type PerfdataValue Comment Downtime Logger Application -" values type +" ######################################## +" ### Global settings + +" Global constants +" https://www.icinga.com/docs/icinga2/snapshot/doc/17-language-reference/#icinga-2-specific-constants + +" Path specific constants +syn keyword icinga2PathConstant CacheDir ConfigDir DataDir IncludeConfDir InitRunDir LocalStateDir LogDir ModAttrPath +syn keyword icinga2PathConstant ObjectsPath PidPath PkgDataDir PrefixDir ProgramData RunDir SpoolDir StatePath SysconfDir +syn keyword icinga2PathConstant VarsPath ZonesDir + +" Global constants +syn keyword icinga2GlobalConstant Vars NodeName Environment RunAsUser RunAsGroup MaxConcurrentChecks ApiBindHost ApiBindPort EventEngine AttachDebugger + +" Application runtime constants +syn keyword icinga2GlobalConstant PlatformName PlatformVersion PlatformKernel PlatformKernelVersion BuildCompilerName BuildCompilerVersion BuildHostName +syn keyword icinga2GlobalConstant ApplicationVersion + +" User proposed constants +syn keyword icinga2UserConstant PluginDir ContribPluginContribDir ManubulonPluginDir TicketSalt NodeName ZoneName + +" Global types +syn keyword icinga2GlobalType Number String Boolean Array Dictionary Value Object ConfigObject Command CheckResult +syn keyword icinga2GlobalType Checkable CustomVarObject DbConnection Type PerfdataValue Comment Downtime Logger Application + +" Built-in Namespaces +syn match icinga2Namespace contained "\(Icinga\.\|Internal\.\|System\.Configuration\.\|System\.\)" + +" Additional constants from Namespaces +syn keyword icinga2GlobalConstant LogCritical LogDebug LogInformation LogNotice LogWarning MatchAll MatchAny +" icinga2 console; keys(Icinga).join(" ") +syn keyword icinga2GlobalConstant Acknowledgement Critical Custom DbCatAcknowledgement DbCatCheck DbCatComment DbCatConfig DbCatDowntime DbCatEventHandler DbCatEverything DbCatExternalCommand DbCatFlapping DbCatLog DbCatNotification DbCatProgramStatus DbCatRetention DbCatState DbCatStateHistory Down DowntimeEnd DowntimeNoChildren DowntimeNonTriggeredChildren DowntimeRemoved DowntimeStart DowntimeTriggeredChildren FlappingEnd FlappingStart HostDown HostUp OK Problem Recovery ServiceCritical ServiceOK ServiceUnknown ServiceWarning Unknown Up Warning + +" Value types +"syn match valueNumber "[0-9]*" syn keyword valueBoolean contained true false -syn keyword valueNull contained null +syn keyword valueNull contained null +" ######################################## +" ### Where to apply -syn region nagiosDefBody start='{' end='}' - \ contains=icinga2Comment, icinga2LineComment, StringD, Braces, Parens, icinga2ObjDef, - \ icinga2ApplyDef, icinga2ObjAttr, icinga2Keyword, icinga2Keyword, icinga2AssignCond, - \ icinga2Cond, icinga2Loop, icinga2Operators, icinga2GFunction, icinga2AFunction, - \ icinga2MathFunction, icinga2Gconst, icinga2JsonFunction, icinga2StrFunction, - \ icinga2ArrFunction, valueBoolean, valueNull +syn region icingaDefBody start='{' end='}' + \ contains=icinga2Comment, icinga2LineComment, StringS, StringD, macro, Braces, Parens, Lambda, icinga2ObjType, icinga2ObjDef, + \ icinga2ApplyDef, icinga2ObjAttr, icinga2Keyword, icinga2AssignCond, + \ icinga2Cond, icinga2Loop, icinga2Exception, icinga2Debugger, icinga2Operators, icinga2GFunction, icinga2AFunction, + \ icinga2MathFunction, icinga2GlobalConstant, icinga2PathConstant, icinga2UserConstant, icinga2Gconst, icinga2Namespace, + \ icinga2JsonFunction, icinga2NumberFunction, icinga2BoolFunction, + \ icinga2StrFunction, icinga2ObjectFunction, icinga2TypeFunction, icinga2ArrFunction, icinga2DictFunction, + \ icinga2DTFunction, valueNumber, valueBoolean, valueNull -" Highlighting +" ######################################## +" ### Highlighting hi link icinga2Comment Comment hi link icinga2LineComment Comment hi link icinga2CommentTodo Todo -hi link Braces Function -hi link Parens Function +hi link Braces Function +hi link Parens Function +hi link Lambda Function -hi link StringS String -hi link StringD String +hi link macro Underlined +hi link StringS String +hi link StringD String hi link angleBrackets String +hi link icinga2ObjType Type hi link icinga2ObjDef Statement + hi link icinga2ApplyDef Statement hi link icinga2ObjAttr Define hi link icinga2Keyword Keyword hi link icinga2AssignCond Conditional -hi link icinga2Cond Statement -hi link icinga2Loop Statement +hi link icinga2Cond Conditional +hi link icinga2Loop Repeat +hi link icinga2Exception Conditional +hi link icinga2Debugger Debug + hi link icinga2Operators Operator hi link icinga2AFunction Function hi link icinga2MathFunction Function hi link icinga2GFunction Function hi link icinga2JsonFunction Function +hi link icinga2NumberFunction Function +hi link icinga2BoolFunction Function hi link icinga2StrFunction Function +hi link icinga2ObjectFunction Function +hi link icinga2TypeFunction Function hi link icinga2ArrFunction Function +hi link icinga2DictFunction Function +hi link icinga2DTFunction Function - +hi link icinga2GlobalConstant Statement +hi link icinga2PathConstant Statement +hi link icinga2UserConstant Statement hi link icinga2Gconst Statement +hi link icinga2Namespace Statement +hi link valueNumber Number hi link valueBoolean Boolean -hi link valueNull Special +hi link valueNull Special From 43a571e013ec70c453a8f6a1cad0d1b9cc283fbc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 11 Oct 2018 12:42:56 +0200 Subject: [PATCH 0233/1162] Don't throw an error when namespace indexers don't find a valid key Examples: ``` globals["abc"] globals.def ``` The patch for the Icinga Director unfortunately only solves the master, and as discussed with @lippserd we need to ensure that satellites and clients with 2.10 can be restarted without any errors from deployed configuration. refs #6509 refs icinga/icingaweb2-module-director#1654 --- lib/base/namespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/namespace.cpp b/lib/base/namespace.cpp index d106a0ee3..909a76511 100644 --- a/lib/base/namespace.cpp +++ b/lib/base/namespace.cpp @@ -108,7 +108,7 @@ Value Namespace::GetFieldByName(const String& field, bool, const DebugInfo& debu if (nsVal) return nsVal->Get(debugInfo); else - return GetPrototypeField(const_cast(this), field, true, debugInfo); + return GetPrototypeField(const_cast(this), field, false, debugInfo); /* Ignore indexer not found errors similar to the Dictionary class. */ } void Namespace::SetFieldByName(const String& field, const Value& value, bool overrideFrozen, const DebugInfo& debugInfo) From b44750f620ef1afbc3e3ba0989a733a9c8af9d48 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 11 Oct 2018 12:59:24 +0200 Subject: [PATCH 0234/1162] Add technical concepts for the config compiler and daemon CLI command refs #6589 --- doc/19-technical-concepts.md | 162 +++++++++++++++++++++++++++++++++-- 1 file changed, 156 insertions(+), 6 deletions(-) diff --git a/doc/19-technical-concepts.md b/doc/19-technical-concepts.md index 04e8a9a51..278b2231f 100644 --- a/doc/19-technical-concepts.md +++ b/doc/19-technical-concepts.md @@ -1,19 +1,169 @@ # Technical Concepts -This chapter provides insights into specific Icinga 2 -components, libraries, features and any other technical concept -and design. +This chapter provides technical concepts and design insights +into specific Icinga 2 components such as: + +* [Application](19-technical-concepts.md#technical-concepts-application) +* [Configuration](19-technical-concepts.md#technical-concepts-configuration) +* [Features](19-technical-concepts.md#technical-concepts-features) +* [Cluster](19-technical-concepts.md#technical-concepts-cluster) +* [TLS Network IO](19-technical-concepts.md#technical-concepts-tls-network-io) - + +The config compiler initializes the scanner inside the [lexer](19-technical-concepts.md#technical-concepts-configuration-lexer) +stage. + +The configuration files are parsed into memory from inside the [daemon CLI command](19-technical-concepts.md#technical-concepts-application-cli-commands-daemon) +which invokes the config validation in `ValidateConfigFiles()`. This compiles the +files into an AST expression which is executed. + +At this stage, the expressions generate so-called "config items" which +are a pre-stage of the later compiled object. + +`ConfigItem::CommitItems` takes care of committing the items, and doing a +rollback on failure. It also checks against matching apply rules from the previous run +and generates statistics about the objects which can be seen by the config validation. + +`ConfigItem::CommitNewItems` collects the registered types and items, +and checks for a specific required order, e.g. a service object needs +a host object first. + +The following stages happen then: + +- **Commit**: A workqueue then commits the items in a parallel fashion for this specific type. The object gets its name, and the AST expression is executed. It is then registered into the item into `m_Object` as reference. +- **OnAllConfigLoaded**: Special signal for each object to pre-load required object attributes, resolve group membership, initialize functions and timers. +- **CreateChildObjects**: Run apply rules for this specific type. +- **CommitNewItems**: Apply rules may generate new config items, this is to ensure that they again run through the stages. + +Note that the items are now committed and the configuration is validated and loaded +into memory. The final config objects are not yet activated though. + +This only happens after the validation, when the application is about to be run +with `ConfigItem::ActivateItems`. + +Each item has an object created in `m_Object` which is checked in a loop. +Again, the dependency order of activated objects is important here, e.g. logger features come first, then +config objects and last the checker, api, etc. features. This is done by sorting the objects +based on their type specific activation priority. + +The following signals are triggered in the stages: + +- **PreActivate**: Setting the `active` flag for the config object. +- **Activate**: Calls `Start()` on the object, sets the local HA authority and notifies subscribers that this object is now activated (e.g. for config updates in the DB backend). + + ## Features From b86c918d4d7bb5415375babc595b279a7452732d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 11 Oct 2018 14:01:05 +0200 Subject: [PATCH 0235/1162] Release version 2.10.0 --- AUTHORS | 14 ++++++ CHANGELOG.md | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++ RELEASE.md | 3 +- VERSION | 2 +- 4 files changed, 150 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 085d13168..e8861501b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,5 +1,6 @@ Adam Bolte Adam James +Alan Jenkins Alexander A. Klimov Alexander Fuhr Alexander Schomburg @@ -77,12 +78,15 @@ Jan Wagner Jason Young Jean Flach Jean-Louis Dupond +Jens Link Jens Schanz +Jeon Sang Wan Jeremy Armstrong Jesse Morgan Jo Goossens Johannes Meyer Jonas Meurer +Jordi van Scheijen Joseph L. Casale Julian Brost Jérôme Drouet @@ -122,6 +126,7 @@ Michael Insel Michael Kraus Michael Newton Michal Moravec +Michal Petko Mikesch-mp Mirco Bauer Mirko Nardin @@ -136,6 +141,7 @@ Patrick Huy Paul Richards Pawel Szafer Per von Zweigbergk +Peter Eckel Peter Eckel Petr Ruzicka Phil Hutchinson @@ -143,6 +149,7 @@ Philipp Dallig Ralph Breier Reto Zeder Ricardo Bartels +Robert Lindgren Robin O'Brien Roland Hopferwieser Roman Gerhardt @@ -151,10 +158,12 @@ Rune Darrud Sam Kottler Sebastian Brückner Sebastian Chrostek +Sebastian Eikenberg Sebastian Marsching Simon Murray Simon Ruderich Siyalrach Anton Thomas +Stefan Bethke Stefan Triep Stefar77 Stephan Platz @@ -164,6 +173,7 @@ Strajan Sebastian Ioan Strix <660956+MrStrix@users.noreply.github.com> Sven Nierlein T. Mulyana +Thomas Forrer Thomas Gelf Thomas Niedermeier Thomas Widhalm @@ -185,8 +195,11 @@ Zachary McGibbon Zoltan Nagy akrus bascarsija +chrostek cstegm ctrlaltca +dh.harald +dominik-r-s <43005480+dominik-r-s@users.noreply.github.com> fbachmann gitmopp jre3brg @@ -197,4 +210,5 @@ noobahoi <20069422+noobahoi@users.noreply.github.com> pv2b ryanohnemus sah +teclogi <27726999+teclogi@users.noreply.github.com> Élie Bouttier diff --git a/CHANGELOG.md b/CHANGELOG.md index e84273a13..bc9877dcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,139 @@ # Icinga 2.x CHANGELOG +## 2.10.0 (2018-10-11) + +### Notes + +* Support for namespaces, details in [this blogpost](https://icinga.com/2018/09/17/icinga-2-dsl-feature-namespaces-coming-in-v2-10/) +* Only send acknowledgement notification to users notified about a problem before, thanks for sponsoring to the [Max-Planck-Institut for Marine Mikrobiologie](https://www.mpi-bremen.de) +* More child options for scheduled downtimes +* Performance improvements and fixes for the TLS connections inside cluster/REST API +* Better logging for HTTP requests and less verbose object creation (e.g. downtimes via Icinga Web 2 & REST API) +* New configuration path constants, e.g. ConfigDir +* Fixed problem with dependencies rescheduling parent checks too fast +* Fixed problem with logging in systemd and syslog +* Improved vim syntax highlighting +* [Technical concepts docs](https://icinga.com/docs/icinga2/latest/doc/19-technical-concepts/) update with config compiler and TLS network IO + +### Enhancement + +* [#6663](https://github.com/icinga/icinga2/issues/6663) (API, Log, PR): Silence config compiler logging for runtime created objects +* [#6657](https://github.com/icinga/icinga2/issues/6657) (API, Log, PR): Enable the HTTP request body debug log entry for release builds +* [#6655](https://github.com/icinga/icinga2/issues/6655) (API, Log, PR): Improve logging for disconnected HTTP clients +* [#6651](https://github.com/icinga/icinga2/issues/6651) (Plugins, PR): Add 'used' feature to check\_swap +* [#6633](https://github.com/icinga/icinga2/issues/6633) (API, Cluster, PR): Use a dynamic thread pool for API connections +* [#6632](https://github.com/icinga/icinga2/issues/6632) (Cluster, PR): Increase the cluster reconnect frequency to 10s +* [#6616](https://github.com/icinga/icinga2/issues/6616) (API, Cluster, PR): Add ApiListener\#tls\_handshake\_timeout option +* [#6611](https://github.com/icinga/icinga2/issues/6611) (Notifications): Allow types = \[ Recovery \] to always send recovery notifications +* [#6595](https://github.com/icinga/icinga2/issues/6595) (API, Cluster, PR): Allow to configure anonymous clients limit inside the ApiListener object +* [#6532](https://github.com/icinga/icinga2/issues/6532) (Configuration, PR): Add child\_options to ScheduledDowntime +* [#6531](https://github.com/icinga/icinga2/issues/6531) (API, PR): Expose Zone\#all\_parents via API +* [#6527](https://github.com/icinga/icinga2/issues/6527) (Notifications, PR): Acknowledgment notifications should only be send if problem notification has been send +* [#6521](https://github.com/icinga/icinga2/issues/6521) (Configuration, PR): Implement references +* [#6512](https://github.com/icinga/icinga2/issues/6512) (Cluster, PR): Refactor environment for API connections +* [#6511](https://github.com/icinga/icinga2/issues/6511) (Cluster, PR): ApiListener: Add support for dynamic port handling +* [#6509](https://github.com/icinga/icinga2/issues/6509) (Configuration, PR): Implement support for namespaces +* [#6508](https://github.com/icinga/icinga2/issues/6508) (Configuration, PR): Implement the Dictionary\#clear script function +* [#6506](https://github.com/icinga/icinga2/issues/6506) (PR): Improve path handling in cmake and daemon +* [#6460](https://github.com/icinga/icinga2/issues/6460) (Log, help wanted): Feature suggestion: Do not log warnings when env elements are undefined in CheckCommand objects +* [#6455](https://github.com/icinga/icinga2/issues/6455) (Log, PR): Log something when the Filelogger has been started +* [#6379](https://github.com/icinga/icinga2/issues/6379) (Configuration, PR): Throw config error when using global zones as parent +* [#6356](https://github.com/icinga/icinga2/issues/6356) (Log, PR): Fix logging under systemd +* [#6339](https://github.com/icinga/icinga2/issues/6339) (Log, help wanted): On systemd, icinga2 floods the system log, and this cannot simply be opted out of +* [#6110](https://github.com/icinga/icinga2/issues/6110) (Configuration, PR): Implement support for optionally specifying the 'var' keyword in 'for' loops +* [#6047](https://github.com/icinga/icinga2/issues/6047) (Notifications): Acknowledgment notifications should only be sent if the user already received a problem notification +* [#4282](https://github.com/icinga/icinga2/issues/4282) (API, Log): Icinga should log HTTP bodies for API requests + +### Bug + +* [#6658](https://github.com/icinga/icinga2/issues/6658) (API, PR): Ensure that HTTP/1.0 or 'Connection: close' headers are properly disconnecting the client +* [#6652](https://github.com/icinga/icinga2/issues/6652) (Plugins, PR): Fix check\_memory thresholds in 'used' mode +* [#6647](https://github.com/icinga/icinga2/issues/6647) (CLI, PR): node setup: always respect --accept-config and --accept-commands +* [#6643](https://github.com/icinga/icinga2/issues/6643) (Check Execution, Notifications, PR): Fix that check\_timeout was used for Event/Notification commands too +* [#6639](https://github.com/icinga/icinga2/issues/6639) (Windows, PR): Ensure to \_unlink before renaming replay log on Windows +* [#6622](https://github.com/icinga/icinga2/issues/6622) (DB IDO, PR): Ensure to use UTC timestamps for IDO PgSQL cleanup queries +* [#6603](https://github.com/icinga/icinga2/issues/6603) (Check Execution, Cluster): CheckCommand 'icinga' seems to ignore retry interval via command\_endpoint +* [#6575](https://github.com/icinga/icinga2/issues/6575): LTO builds fail on Linux +* [#6566](https://github.com/icinga/icinga2/issues/6566) (Cluster): Master disconnects during signing process +* [#6546](https://github.com/icinga/icinga2/issues/6546) (API, CLI, PR): Overridden path constants not passed to config validation in /v1/config/stages API call +* [#6530](https://github.com/icinga/icinga2/issues/6530) (DB IDO, PR): IDO/MySQL: avoid empty queries +* [#6519](https://github.com/icinga/icinga2/issues/6519) (CLI, PR): Reset terminal on erroneous console exit +* [#6517](https://github.com/icinga/icinga2/issues/6517) (Cluster): Not all Endpoints can't reconnect due to "Client TLS handshake failed" error after "reload or restart" +* [#6514](https://github.com/icinga/icinga2/issues/6514) (API): API using "Connection: close" header results in infinite threads +* [#6507](https://github.com/icinga/icinga2/issues/6507) (Cluster): Variable name conflict in constants.conf / Problem with TLS verification, CN and Environment variable +* [#6503](https://github.com/icinga/icinga2/issues/6503) (Log, PR): Reduce the log level for missing env macros to debug +* [#6485](https://github.com/icinga/icinga2/issues/6485) (Log): Icinga logs discarding messages still as warning and not as notice +* [#6475](https://github.com/icinga/icinga2/issues/6475) (Compat, PR): lib-\>compat-\>statusdatawriter: fix notifications\_enabled +* [#6430](https://github.com/icinga/icinga2/issues/6430) (Log, PR): Fix negative 'empty in' value in WorkQueue log message +* [#6427](https://github.com/icinga/icinga2/issues/6427) (Configuration, Crash, PR): Improve error message for serializing objects with recursive references +* [#6409](https://github.com/icinga/icinga2/issues/6409) (Configuration, Crash): Assigning vars.x = vars causes Icinga 2 segfaults +* [#6408](https://github.com/icinga/icinga2/issues/6408) (PR): ObjectLock\#Unlock\(\): don't reset m\_Object-\>m\_LockOwner too early +* [#6386](https://github.com/icinga/icinga2/issues/6386) (Configuration, PR): Fix that TimePeriod segments are not cleared on restart +* [#6382](https://github.com/icinga/icinga2/issues/6382) (CLI, help wanted): icinga2 console breaks the terminal on errors +* [#6313](https://github.com/icinga/icinga2/issues/6313) (Plugins, Windows, PR): Fix wrong calculation of check\_swap windows plugin +* [#6304](https://github.com/icinga/icinga2/issues/6304) (Configuration, Notifications): Timeout defined in NotificationCommand is ignored and uses check\_timeout +* [#5815](https://github.com/icinga/icinga2/issues/5815) (Plugins, Windows): swap-windows check delivers wrong result +* [#5375](https://github.com/icinga/icinga2/issues/5375) (Check Execution, PR): Parents who are non-active should not be rescheduled +* [#5052](https://github.com/icinga/icinga2/issues/5052) (Cluster, Windows): Replay log not working with Windows client +* [#5022](https://github.com/icinga/icinga2/issues/5022) (Check Execution): Dependencies may reschedule passive checks, triggering freshness checks + +### ITL + +* [#6646](https://github.com/icinga/icinga2/issues/6646) (ITL, PR): Update ITL and Docs for memory-windows - show used +* [#6640](https://github.com/icinga/icinga2/issues/6640) (ITL): Update ITL and Docs for memory-windows - show used +* [#6563](https://github.com/icinga/icinga2/issues/6563) (ITL, PR): \[Feature\] Cloudera service health CheckCommand +* [#6561](https://github.com/icinga/icinga2/issues/6561) (ITL, PR): \[Feature\] Ceph health CheckCommand +* [#6504](https://github.com/icinga/icinga2/issues/6504) (ITL, PR): squashfs ignored +* [#6491](https://github.com/icinga/icinga2/issues/6491) (ITL, PR): Feature/itl vmware health +* [#6481](https://github.com/icinga/icinga2/issues/6481) (ITL): command-plugins.conf check\_disk exclude squashfs + +### Documentation + +* [#6670](https://github.com/icinga/icinga2/issues/6670) (Documentation, PR): Add technical concepts for the config compiler and daemon CLI command +* [#6665](https://github.com/icinga/icinga2/issues/6665) (Documentation, PR): Make the two modes of check\_http more obvious. +* [#6615](https://github.com/icinga/icinga2/issues/6615) (Documentation, PR): Update distributed monitoring docs for 2.10 +* [#6610](https://github.com/icinga/icinga2/issues/6610) (Documentation, PR): Add "TLS Network IO" into technical concepts docs +* [#6607](https://github.com/icinga/icinga2/issues/6607) (Documentation, PR): Enhance development docs with GDB backtrace and thread list +* [#6606](https://github.com/icinga/icinga2/issues/6606) (Documentation, PR): Enhance contributing docs +* [#6598](https://github.com/icinga/icinga2/issues/6598) (Documentation, PR): doc/09-object-types: states filter ignored for Acknowledgements +* [#6597](https://github.com/icinga/icinga2/issues/6597) (Documentation, PR): Add Fedora to development docs for debuginfo packages +* [#6593](https://github.com/icinga/icinga2/issues/6593) (Documentation, help wanted): Include CA Proxy in 3rd scenario in Distributed Monitoring docs +* [#6573](https://github.com/icinga/icinga2/issues/6573) (Documentation, PR): Fix operator precedence table +* [#6528](https://github.com/icinga/icinga2/issues/6528) (Documentation, PR): Document default of User\#enable\_notifications +* [#6502](https://github.com/icinga/icinga2/issues/6502) (Documentation, PR): Update 17-language-reference.md +* [#6501](https://github.com/icinga/icinga2/issues/6501) (Documentation, PR): Update 03-monitoring-basics.md +* [#6488](https://github.com/icinga/icinga2/issues/6488) (Documentation, ITL, PR): Fix typo with the CheckCommand cert + +### Support + +* [#6669](https://github.com/icinga/icinga2/issues/6669) (PR): Don't throw an error when namespace indexers don't find a valid key +* [#6668](https://github.com/icinga/icinga2/issues/6668) (Installation, PR): Enhance vim syntax highlighting for 2.10 +* [#6661](https://github.com/icinga/icinga2/issues/6661) (API, Log, code-quality, PR): Cache the peer address in the HTTP server +* [#6642](https://github.com/icinga/icinga2/issues/6642) (PR): Allow to override MaxConcurrentChecks constant +* [#6621](https://github.com/icinga/icinga2/issues/6621) (code-quality, PR): Remove unused timestamp function in DB IDO +* [#6618](https://github.com/icinga/icinga2/issues/6618) (PR): Silence compiler warning for nice\(\) +* [#6591](https://github.com/icinga/icinga2/issues/6591) (PR): Fix static initializer priority for namespaces in LTO builds +* [#6588](https://github.com/icinga/icinga2/issues/6588) (PR): Fix using full path in prepare-dirs/safe-reload scripts +* [#6586](https://github.com/icinga/icinga2/issues/6586) (PR): Fix non-unity builds on CentOS 7 with std::shared\_ptr +* [#6583](https://github.com/icinga/icinga2/issues/6583) (Documentation, Installation, PR): Update PostgreSQL library path variable in INSTALL.md +* [#6574](https://github.com/icinga/icinga2/issues/6574) (PR): Move new downtime constants into the Icinga namespace +* [#6570](https://github.com/icinga/icinga2/issues/6570) (Cluster, PR): Increase limit for simultaneously connected anonymous TLS clients +* [#6567](https://github.com/icinga/icinga2/issues/6567) (PR): ApiListener: Dump the state file port detail as number +* [#6556](https://github.com/icinga/icinga2/issues/6556) (Installation, Windows, PR): windows: Allow suppression of extra actions in the MSI package +* [#6544](https://github.com/icinga/icinga2/issues/6544) (code-quality, PR): Remove \#include for deprecated header file +* [#6539](https://github.com/icinga/icinga2/issues/6539) (PR): Build fix for CentOS 7 and non-unity builds +* [#6526](https://github.com/icinga/icinga2/issues/6526) (code-quality, PR): icinga::PackObject\(\): shorten conversion to string +* [#6510](https://github.com/icinga/icinga2/issues/6510) (Tests, Windows, PR): Update windows build scripts +* [#6494](https://github.com/icinga/icinga2/issues/6494) (Tests, PR): Test PackObject +* [#6489](https://github.com/icinga/icinga2/issues/6489) (code-quality, PR): Implement object packer for consistent hashing +* [#6484](https://github.com/icinga/icinga2/issues/6484) (Packages): Packages from https://packages.icinga.com are not Systemd Type=notify enabled? +* [#6469](https://github.com/icinga/icinga2/issues/6469) (Installation, Windows, PR): Fix Windows Agent resize behavior +* [#6458](https://github.com/icinga/icinga2/issues/6458) (code-quality, PR): Fix debug build log entry for ConfigItem activation priority +* [#6456](https://github.com/icinga/icinga2/issues/6456) (code-quality, PR): Keep notes for immediately log flushing +* [#6440](https://github.com/icinga/icinga2/issues/6440) (code-quality, PR): Fix typo +* [#6410](https://github.com/icinga/icinga2/issues/6410) (code-quality, PR): Remove unused code +* [#4959](https://github.com/icinga/icinga2/issues/4959) (Installation, Windows): Windows Agent Wizard Window resizes with screen, hiding buttons + ## 2.9.2 (2018-09-26) ### Enhancement diff --git a/RELEASE.md b/RELEASE.md index 23700b237..75f6e1f30 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.9.2 +VERSION=2.10.0 ``` Add your signing key to your Git configuration file, if not already there. @@ -64,7 +64,6 @@ Update the version: ``` sed -i "s/Version: .*/Version: $VERSION/g" VERSION -sed -i "s/VERSION=.*/VERSION=$VERSION/g" RELEASE.md ``` ## Changelog diff --git a/VERSION b/VERSION index 217e97675..44fbe0238 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.9.2 +Version: 2.10.0 Revision: 1 From e8ecc770d08cc6070a2dd8a14c2514eb2ae1ca7d Mon Sep 17 00:00:00 2001 From: Jean-Louis Dupond Date: Fri, 12 Oct 2018 10:05:20 +0200 Subject: [PATCH 0236/1162] Extend upgrade docs --- doc/09-object-types.md | 2 +- doc/16-upgrading-icinga-2.md | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 6dda8c91d..e60204749 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -1760,7 +1760,7 @@ Configuration Attributes: Name | Type | Description --------------------------|-----------------------|---------------------------------- endpoints | Array of object names | **Optional.** Array of endpoint names located in this zone. - parent | Object name | **Optional.** The name of the parent zone. + parent | Object name | **Optional.** The name of the parent zone. (Do not specify a global zone) global | Boolean | **Optional.** Whether configuration files for this zone should be [synced](06-distributed-monitoring.md#distributed-monitoring-global-zone-config-sync) to all endpoints. Defaults to `false`. Zone objects cannot currently be created with the API. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 83b4bd3ec..bc15462bb 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -91,6 +91,21 @@ sending the recovery notification. More details can be found in [this PR](https://github.com/Icinga/icinga2/pull/6527). +### Stricter configuration validation + +Some config errors are now fatal. While it never worked before, icinga2 refuses to start now! + +For example the following started to give a fatal error in 2.10: + +``` + object Zone "XXX" { + endpoints = [ "master-server" ] + parent = "global-templates" + } +``` + +```critical/config: Error: Zone 'XXX' can not have a global zone as parent.``` + ## Upgrading to v2.9 ### Deprecation and Removal Notes From 069ef4b825d205933ae1cca26aa25b28494ac626 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 12 Oct 2018 10:08:28 +0200 Subject: [PATCH 0237/1162] Update RELEASE docs - GH Milestone prior to changelog script run - Branching for package repos - Infos for updating the online docs with Puppet - Example for Debian Stretch package tests with Docker - Drop Google+ URL --- RELEASE.md | 105 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 18 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 75f6e1f30..7dc17d8a3 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -70,6 +70,8 @@ sed -i "s/Version: .*/Version: $VERSION/g" VERSION Update the [CHANGELOG.md](CHANGELOG.md) file. +### Requirements + Export these environment variables: ``` @@ -78,6 +80,10 @@ export ICINGA_GITHUB_AUTH_TOKEN='token' export ICINGA_GITHUB_PROJECT='icinga/icinga2' ``` +### Generation + +**Close the version on [GitHub](https://github.com/Icinga/icinga2/milestones).** + Run the script which updates the [CHANGELOG.md](CHANGELOG.md) file. ``` @@ -112,18 +118,20 @@ git push --tags ``` git checkout master -git checkout -b support/2.9 -git push -u origin support/2.9 +git push + +git checkout -b support/2.11 +git push -u origin support/2.11 ``` **For minor releases:** Push the support branch, cherry-pick the release commit into master and merge the support branch: ``` -git push -u origin support/2.8 +git push -u origin support/2.10 git checkout master -git cherry-pick support/2.8 -git merge --strategy=ours support/2.8 +git cherry-pick support/2.10 +git merge --strategy=ours support/2.10 git push origin master ``` @@ -169,10 +177,16 @@ git push ``` **Note for major releases**: Update release branch to latest. -`git checkout release && git pull && git merge master && git push` + +``` +git checkout release && git pull && git merge master && git push +``` **Note for minor releases**: Cherry-pick the release commit into master. -`git checkout master && git pull && git cherry-pick release && git push` + +``` +git checkout master && git pull && git cherry-pick release && git push +``` ### DEB Packages @@ -213,25 +227,29 @@ git commit -av -m "Release 2.9.0-1" ``` **Note for major releases**: Update release branch to latest. -`git checkout release && git pull && git merge master && git push` + +``` +git checkout release && git pull && git merge master && git push +``` **Note for minor releases**: Cherry-pick the release commit into master. -`git checkout master && git pull && git cherry-pick release && git push` +``` +git checkout master && git pull && git cherry-pick release && git push +``` #### DEB with dch on macOS ``` docker run -v `pwd`:/mnt/packaging -ti ubuntu:xenial bash -apt-get update -apt-get install git ubuntu-dev-tools vim +apt-get update && apt-get install git ubuntu-dev-tools vim -y cd /mnt/packaging git config --global user.name "Michael Friedrich" git config --global user.email "michael.friedrich@icinga.com" -./dch 2.9.0-1 "Update to 2.9.0" +./dch 2.10.0-1 "Update to 2.10.0" ``` @@ -240,7 +258,8 @@ git config --global user.email "michael.friedrich@icinga.com" * Verify package build changes for this version. * Test the snapshot packages for all distributions beforehand. * Build the newly created Git tag for Debian/RHEL/SuSE. -* Build the newly created Git tag for Windows. + * Wait until all jobs have passed and then publish them one by one with `allow_release` +* Build the newly created Git tag for Windows: `refs/tags/v2.10.0` as source and `v2.10.0` as package name. ## Release Tests @@ -249,7 +268,7 @@ git config --global user.email "michael.friedrich@icinga.com" * Test the [setup wizard](https://packages.icinga.com/windows/) inside a Windows VM. * Start a new docker container and install/run icinga2. -Example for CentOS7: +### CentOS ``` docker run -ti centos:latest bash @@ -259,6 +278,24 @@ yum -y install icinga2 icinga2 daemon -C ``` +### Debian + +``` +docker run -ti debian:stretch bash + +apt-get update && apt-get install -y wget curl gnupg apt-transport-https + +DIST=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release); \ + echo "deb http://packages.icinga.com/debian icinga-${DIST} main" > \ + /etc/apt/sources.list.d/${DIST}-icinga.list + echo "deb-src http://packages.icinga.com/debian icinga-${DIST} main" >> \ + /etc/apt/sources.list.d/${DIST}-icinga.list + +curl https://packages.icinga.com/icinga.key | apt-key add - +apt-get -y install icinga2 +icinga2 daemon +``` + ## GitHub Release Create a new release for the newly created Git tag: https://github.com/Icinga/icinga2/releases @@ -286,15 +323,47 @@ Upload the package to [chocolatey](https://chocolatey.org/packages/upload). ### Online Documentation -Ask @bobapple to update the documentation at docs.icinga.com. +Navigate to `puppet-customer/icinga.git` and do the following steps: + +#### Testing + +``` +git checkout testing && git pull +vim files/var/www/docs/config/icinga2-latest.yml + +git commit -av -m "icinga-web1: Update docs for Icinga 2" + +git push +``` + +SSH into icinga-web1 and do a manual Puppet dry run with the testing environment. + +``` +puppet agent -t --environment testing --noop +``` + +Once succeeded, continue with production deployment. + +#### Production + +``` +git checkout master && git pull +git merge testing +git push +``` + +SSH into icinga-web1 and do a manual Puppet run from the production environment (default). + +``` +puppet agent -t +``` ### Announcement -* Create a new blog post on www.icinga.com/blog -* Social media: [Twitter](https://twitter.com/icinga), [Facebook](https://www.facebook.com/icinga), [G+](https://plus.google.com/+icinga), [Xing](https://www.xing.com/communities/groups/icinga-da4b-1060043), [LinkedIn](https://www.linkedin.com/groups/Icinga-1921830/about) +* Create a new blog post on icinga.com/blog +* Social media: [Twitter](https://twitter.com/icinga), [Facebook](https://www.facebook.com/icinga), [Xing](https://www.xing.com/communities/groups/icinga-da4b-1060043), [LinkedIn](https://www.linkedin.com/groups/Icinga-1921830/about) * Update IRC channel topic ### Project Management * Add new minor version on [GitHub](https://github.com/Icinga/icinga2/milestones). -* Close the released version on [GitHub](https://github.com/Icinga/icinga2/milestones). From bec6cc4621dd98c5c8775489304115ed4c76a8d2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 12 Oct 2018 10:49:03 +0200 Subject: [PATCH 0238/1162] Add a note to the docs on >2 endpoints in a zone This is missing, I cannot remember how it went away. Questions are coming frequently recently. --- doc/06-distributed-monitoring.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index bccac1fe9..8bd68d9ff 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -109,6 +109,12 @@ information, e.g. if the master should actively try to connect to a client. The zone membership is defined inside the `Zone` object definition using the `endpoints` attribute with an array of `Endpoint` names. +> **Note** +> +> There is a known [problem](https://github.com/Icinga/icinga2/issues/3533) +> with >2 endpoints in a zone and a message routing loop. +> The config validation will log a warning to let you know about this too. + If you want to check the availability (e.g. ping checks) of the node you still need a [Host](09-object-types.md#objecttype-host) object. From 0a238813416e0ac8ea998b8814f00611a00f0735 Mon Sep 17 00:00:00 2001 From: Nemanja Trifunovic Date: Sat, 13 Oct 2018 20:48:56 -0400 Subject: [PATCH 0239/1162] Create .gitignore Ignore: - .vscode - build --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..488d51dd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# VS Code: +.vscode/ +# Often used by CMake +build/ \ No newline at end of file From f0aaecb90cddb339aa267fc8fe87bb3886c38ff0 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Mon, 15 Oct 2018 08:56:18 +0200 Subject: [PATCH 0240/1162] Fix spelling errors. compatiblity -> compatibility --- icinga-app/icinga.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index a2bf8001c..1eb246fea 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -146,7 +146,7 @@ static void HandleLegacyDefines() Value runDir = Configuration::RunDir; if (!runDir.IsEmpty()) { Log(LogWarning, "icinga-app") - << "Please do not set the deprecated 'RunDir' constant, use the 'InitRunDir' constant instead! For compatiblity reasons, their value is set based on the 'RunDir' constant."; + << "Please do not set the deprecated 'RunDir' constant, use the 'InitRunDir' constant instead! For compatibility reasons, their value is set based on the 'RunDir' constant."; #ifdef _WIN32 Configuration::InitRunDir = runDir + "\\icinga2"; From 1c7fddb780d5ddb7d816b14e0a0fedbdd306fec2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 12 Oct 2018 16:18:55 +0200 Subject: [PATCH 0241/1162] Initialize Configuration::InitRunDir for Windows and writing the PID file Even if this some Unix specific stuff, we rely on writing this file in our generic application code. Therefore its path needs to be specified. This got broken with 9fbc406 which renamed RunDir to InitRunDir, but didn't re-add it to the Windows #ifdefs. fixes #6677 --- icinga-app/icinga.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index a2bf8001c..040e35e95 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -200,7 +200,6 @@ static int Main() String dataPrefix = Utility::GetIcingaDataPath(); if (!binaryPrefix.IsEmpty() && !dataPrefix.IsEmpty()) { - Configuration::PrefixDir = binaryPrefix; Configuration::ProgramData = dataPrefix; Configuration::ConfigDir = dataPrefix + "\\etc\\icinga2"; @@ -210,9 +209,13 @@ static int Main() Configuration::CacheDir = dataPrefix + "\\var\\cache\\icinga2"; Configuration::SpoolDir = dataPrefix + "\\var\\spool\\icinga2"; + Configuration::PrefixDir = binaryPrefix; + /* Internal constants. */ Configuration::PkgDataDir = binaryPrefix + "\\share\\icinga2"; Configuration::IncludeConfDir = binaryPrefix + "\\share\\icinga2\\include"; + + Configuration::InitRunDir = dataPrefix + "\\var\\run\\icinga2"; } else { Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths."); From 34de8104b8b66b9033766c7a7da7e2930292b2e8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 15 Oct 2018 11:44:28 +0200 Subject: [PATCH 0242/1162] Fix regression with API permission filters and namespaces in v2.10 fixes #6682 --- lib/remote/filterutility.cpp | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/remote/filterutility.cpp b/lib/remote/filterutility.cpp index 7cf175673..df3ca54da 100644 --- a/lib/remote/filterutility.cpp +++ b/lib/remote/filterutility.cpp @@ -21,6 +21,7 @@ #include "remote/httputility.hpp" #include "config/configcompiler.hpp" #include "config/expression.hpp" +#include "base/namespace.hpp" #include "base/json.hpp" #include "base/configtype.hpp" #include "base/logger.hpp" @@ -95,16 +96,20 @@ bool FilterUtility::EvaluateFilter(ScriptFrame& frame, Expression *filter, else varName = variableName; - Dictionary::Ptr vars; + Namespace::Ptr frameNS; if (frame.Self.IsEmpty()) { - vars = new Dictionary(); - frame.Self = vars; - } else - vars = frame.Self; + frameNS = new Namespace(); + frame.Self = frameNS; + } else { + /* Enforce a namespace object for 'frame.self'. */ + ASSERT(frame.Self.IsObjectType()); - vars->Set("obj", target); - vars->Set(varName, target); + frameNS = frame.Self; + } + + frameNS->Set("obj", target); + frameNS->Set(varName, target); for (int fid = 0; fid < type->GetFieldCount(); fid++) { Field field = type->GetFieldInfo(fid); @@ -115,9 +120,9 @@ bool FilterUtility::EvaluateFilter(ScriptFrame& frame, Expression *filter, Object::Ptr joinedObj = target->NavigateField(fid); if (field.NavigationName) - vars->Set(field.NavigationName, joinedObj); + frameNS->Set(field.NavigationName, joinedObj); else - vars->Set(field.Name, joinedObj); + frameNS->Set(field.Name, joinedObj); } return Convert::ToBool(filter->Evaluate(frame)); @@ -126,8 +131,11 @@ bool FilterUtility::EvaluateFilter(ScriptFrame& frame, Expression *filter, static void FilteredAddTarget(ScriptFrame& permissionFrame, Expression *permissionFilter, ScriptFrame& frame, Expression *ufilter, std::vector& result, const String& variableName, const Object::Ptr& target) { - if (FilterUtility::EvaluateFilter(permissionFrame, permissionFilter, target, variableName) && FilterUtility::EvaluateFilter(frame, ufilter, target, variableName)) - result.emplace_back(std::move(target)); + if (FilterUtility::EvaluateFilter(permissionFrame, permissionFilter, target, variableName)) { + if (FilterUtility::EvaluateFilter(frame, ufilter, target, variableName)) { + result.emplace_back(std::move(target)); + } + } } void FilterUtility::CheckPermission(const ApiUser::Ptr& user, const String& permission, Expression **permissionFilter) @@ -249,7 +257,7 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c ScriptFrame frame(true); frame.Sandboxed = true; - Dictionary::Ptr uvars = new Dictionary(); + Namespace::Ptr frameNS = new Namespace(); if (query->Contains("filter")) { String filter = HttpUtility::GetLastParameter(query, "filter"); @@ -259,11 +267,11 @@ std::vector FilterUtility::GetFilterTargets(const QueryDescription& qd, c if (filter_vars) { ObjectLock olock(filter_vars); for (const Dictionary::Pair& kv : filter_vars) { - uvars->Set(kv.first, kv.second); + frameNS->Set(kv.first, kv.second); } } - frame.Self = uvars; + frame.Self = frameNS; provider->FindTargets(type, std::bind(&FilteredAddTarget, std::ref(permissionFrame), permissionFilter, From dc1f77c9d1454acf56a03b4083e9f3baee9987c5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 15 Oct 2018 16:27:25 +0200 Subject: [PATCH 0243/1162] Update release docs for Chocolatey refs #6683 --- RELEASE.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 7dc17d8a3..871861043 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -305,19 +305,21 @@ Create a new release for the newly created Git tag: https://github.com/Icinga/ic Navigate to the git repository on your Windows box which already has chocolatey installed. Pull/checkout the release. -Create the nupkg package: +Create the nupkg package (or use the one generated on https://packages.icinga.com/windows): ``` cpack ``` -Install the created icinga2 package locally: +Fetch the API key from https://chocolatey.org/account and use the `choco push` +command line. ``` -choco install icinga2 -version 2.9.0 -fdv "%cd%" -source "'%cd%;https://chocolatey.org/api/v2/'" +choco apikey --key xxx --source https://push.chocolatey.org/ + +choco push Icinga2-v2.10.0.nupkg --source https://push.chocolatey.org/ ``` -Upload the package to [chocolatey](https://chocolatey.org/packages/upload). ## Post Release From 99a4ee0ad95a0bfd31ac0cfe30a8bc52576701b2 Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 16 Oct 2018 11:40:00 +0200 Subject: [PATCH 0244/1162] Extend 09-object-types.md with argument array Add a small snippet demonstrating how to define an argument array instead of a simple string. --- doc/09-object-types.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index e60204749..bd6572c15 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -230,6 +230,12 @@ Argument order: ..., -3, -2, -1, , 1, 2, 3, ... ``` +Define argument array: + +``` +value = "[ 'one', 'two', 'three' ]" +``` + Argument array with `repeat_key = true`: ``` From af6c8a1f50aa06c07d58e2cb00cf93f010405f6b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 16 Oct 2018 11:54:14 +0200 Subject: [PATCH 0245/1162] Add missing shutdown/program state dumps for SIGUSR2 reload handler Credits to @west0rmann finding the issue and providing the initial fix. fixes #6689 fixes #6592 --- lib/base/application.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 8388e720c..1d6e1b4b1 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -751,6 +751,13 @@ void Application::SigUsr2Handler(int) instance->ClosePidFile(false); + /* Ensure to dump the program state on reload. */ + ConfigObject::StopObjects(); + instance->OnShutdown(); + + Log(LogInformation, "Application") + << "Reload done, parent process shutting down. Child process with PID '" << m_ReloadProcess << "' is taking over."; + Exit(0); } From 7abfe13a00760382363c49b3c04597822cd38a6b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 17 Oct 2018 12:45:13 +0200 Subject: [PATCH 0246/1162] Remove default environment, regression from e678fa1aa5 refs #6512 fixes #6694 --- icinga-app/icinga.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 8110c40e8..9ad8a9a42 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -301,8 +301,6 @@ static int Main() ScriptGlobal::Set("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks()); - ScriptGlobal::Set("Environment", "production"); - ScriptGlobal::Set("System.PlatformKernel", Utility::GetPlatformKernel(), true); ScriptGlobal::Set("System.PlatformKernelVersion", Utility::GetPlatformKernelVersion(), true); ScriptGlobal::Set("System.PlatformName", Utility::GetPlatformName(), true); From dab53448bc7a0f321deab761dccfb2671ed080fb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:27:04 +0200 Subject: [PATCH 0247/1162] icinga.com: Update *.{h,c}pp --- icinga-app/icinga.cpp | 2 +- icinga-installer/icinga-installer.cpp | 2 +- lib/base/application-environment.cpp | 2 +- lib/base/application-version.cpp | 2 +- lib/base/application.cpp | 2 +- lib/base/application.hpp | 2 +- lib/base/array-script.cpp | 2 +- lib/base/array.cpp | 2 +- lib/base/array.hpp | 2 +- lib/base/base64.cpp | 2 +- lib/base/base64.hpp | 2 +- lib/base/boolean-script.cpp | 2 +- lib/base/boolean.cpp | 2 +- lib/base/boolean.hpp | 2 +- lib/base/configobject-script.cpp | 2 +- lib/base/configobject.cpp | 2 +- lib/base/configobject.hpp | 2 +- lib/base/configtype.cpp | 2 +- lib/base/configtype.hpp | 2 +- lib/base/configuration.cpp | 2 +- lib/base/configuration.hpp | 2 +- lib/base/configwriter.cpp | 2 +- lib/base/configwriter.hpp | 2 +- lib/base/console.cpp | 2 +- lib/base/console.hpp | 2 +- lib/base/context.cpp | 2 +- lib/base/context.hpp | 2 +- lib/base/convert.cpp | 2 +- lib/base/convert.hpp | 2 +- lib/base/datetime-script.cpp | 2 +- lib/base/datetime.cpp | 2 +- lib/base/datetime.hpp | 2 +- lib/base/debug.hpp | 2 +- lib/base/debuginfo.cpp | 2 +- lib/base/debuginfo.hpp | 2 +- lib/base/dependencygraph.cpp | 2 +- lib/base/dependencygraph.hpp | 2 +- lib/base/dictionary-script.cpp | 2 +- lib/base/dictionary.cpp | 2 +- lib/base/dictionary.hpp | 2 +- lib/base/exception.cpp | 2 +- lib/base/exception.hpp | 2 +- lib/base/fifo.cpp | 2 +- lib/base/fifo.hpp | 2 +- lib/base/filelogger.cpp | 2 +- lib/base/filelogger.hpp | 2 +- lib/base/function-script.cpp | 2 +- lib/base/function.cpp | 2 +- lib/base/function.hpp | 2 +- lib/base/functionwrapper.hpp | 2 +- lib/base/i2-base.hpp | 2 +- lib/base/initialize.cpp | 2 +- lib/base/initialize.hpp | 2 +- lib/base/json-script.cpp | 2 +- lib/base/json.cpp | 2 +- lib/base/json.hpp | 2 +- lib/base/library.cpp | 2 +- lib/base/library.hpp | 2 +- lib/base/loader.cpp | 2 +- lib/base/loader.hpp | 2 +- lib/base/logger.cpp | 2 +- lib/base/logger.hpp | 2 +- lib/base/math-script.cpp | 2 +- lib/base/namespace-script.cpp | 2 +- lib/base/namespace.cpp | 2 +- lib/base/namespace.hpp | 2 +- lib/base/netstring.cpp | 2 +- lib/base/netstring.hpp | 2 +- lib/base/networkstream.cpp | 2 +- lib/base/networkstream.hpp | 2 +- lib/base/number-script.cpp | 2 +- lib/base/number.cpp | 2 +- lib/base/number.hpp | 2 +- lib/base/object-packer.cpp | 2 +- lib/base/object-packer.hpp | 2 +- lib/base/object-script.cpp | 2 +- lib/base/object.cpp | 2 +- lib/base/object.hpp | 2 +- lib/base/objectlock.cpp | 2 +- lib/base/objectlock.hpp | 2 +- lib/base/objecttype.cpp | 2 +- lib/base/objecttype.hpp | 2 +- lib/base/perfdatavalue.cpp | 2 +- lib/base/perfdatavalue.hpp | 2 +- lib/base/primitivetype.cpp | 2 +- lib/base/primitivetype.hpp | 2 +- lib/base/process.cpp | 2 +- lib/base/process.hpp | 2 +- lib/base/reference-script.cpp | 2 +- lib/base/reference.cpp | 2 +- lib/base/reference.hpp | 2 +- lib/base/registry.hpp | 2 +- lib/base/ringbuffer.cpp | 2 +- lib/base/ringbuffer.hpp | 2 +- lib/base/scriptframe.cpp | 2 +- lib/base/scriptframe.hpp | 2 +- lib/base/scriptglobal.cpp | 2 +- lib/base/scriptglobal.hpp | 2 +- lib/base/scriptutils.cpp | 2 +- lib/base/scriptutils.hpp | 2 +- lib/base/serializer.cpp | 2 +- lib/base/serializer.hpp | 2 +- lib/base/singleton.hpp | 2 +- lib/base/socket.cpp | 2 +- lib/base/socket.hpp | 2 +- lib/base/socketevents-epoll.cpp | 2 +- lib/base/socketevents-poll.cpp | 2 +- lib/base/socketevents.cpp | 2 +- lib/base/socketevents.hpp | 2 +- lib/base/stacktrace.cpp | 2 +- lib/base/stacktrace.hpp | 2 +- lib/base/statsfunction.hpp | 2 +- lib/base/stdiostream.cpp | 2 +- lib/base/stdiostream.hpp | 2 +- lib/base/stream.cpp | 2 +- lib/base/stream.hpp | 2 +- lib/base/streamlogger.cpp | 2 +- lib/base/streamlogger.hpp | 2 +- lib/base/string-script.cpp | 2 +- lib/base/string.cpp | 2 +- lib/base/string.hpp | 2 +- lib/base/sysloglogger.cpp | 2 +- lib/base/sysloglogger.hpp | 2 +- lib/base/tcpsocket.cpp | 2 +- lib/base/tcpsocket.hpp | 2 +- lib/base/threadpool.cpp | 2 +- lib/base/threadpool.hpp | 2 +- lib/base/timer.cpp | 2 +- lib/base/timer.hpp | 2 +- lib/base/tlsstream.cpp | 2 +- lib/base/tlsstream.hpp | 2 +- lib/base/tlsutility.cpp | 2 +- lib/base/tlsutility.hpp | 2 +- lib/base/type.cpp | 2 +- lib/base/type.hpp | 2 +- lib/base/typetype-script.cpp | 2 +- lib/base/unix.hpp | 2 +- lib/base/unixsocket.cpp | 2 +- lib/base/unixsocket.hpp | 2 +- lib/base/utility.cpp | 2 +- lib/base/utility.hpp | 2 +- lib/base/value-operators.cpp | 2 +- lib/base/value.cpp | 2 +- lib/base/value.hpp | 2 +- lib/base/win32.hpp | 2 +- lib/base/workqueue.cpp | 2 +- lib/base/workqueue.hpp | 2 +- lib/checker/checkercomponent.cpp | 2 +- lib/checker/checkercomponent.hpp | 2 +- lib/cli/apisetupcommand.cpp | 2 +- lib/cli/apisetupcommand.hpp | 2 +- lib/cli/apisetuputility.cpp | 2 +- lib/cli/apisetuputility.hpp | 2 +- lib/cli/calistcommand.cpp | 2 +- lib/cli/calistcommand.hpp | 2 +- lib/cli/casigncommand.cpp | 2 +- lib/cli/casigncommand.hpp | 2 +- lib/cli/clicommand.cpp | 2 +- lib/cli/clicommand.hpp | 2 +- lib/cli/consolecommand.cpp | 2 +- lib/cli/consolecommand.hpp | 2 +- lib/cli/daemoncommand.cpp | 2 +- lib/cli/daemoncommand.hpp | 2 +- lib/cli/daemonutility.cpp | 2 +- lib/cli/daemonutility.hpp | 2 +- lib/cli/editline.hpp | 2 +- lib/cli/featuredisablecommand.cpp | 2 +- lib/cli/featuredisablecommand.hpp | 2 +- lib/cli/featureenablecommand.cpp | 2 +- lib/cli/featureenablecommand.hpp | 2 +- lib/cli/featurelistcommand.cpp | 2 +- lib/cli/featurelistcommand.hpp | 2 +- lib/cli/featureutility.cpp | 2 +- lib/cli/featureutility.hpp | 2 +- lib/cli/i2-cli.hpp | 2 +- lib/cli/internalsignalcommand.cpp | 2 +- lib/cli/internalsignalcommand.hpp | 2 +- lib/cli/nodesetupcommand.cpp | 2 +- lib/cli/nodesetupcommand.hpp | 2 +- lib/cli/nodeutility.cpp | 2 +- lib/cli/nodeutility.hpp | 2 +- lib/cli/nodewizardcommand.cpp | 2 +- lib/cli/nodewizardcommand.hpp | 2 +- lib/cli/objectlistcommand.cpp | 2 +- lib/cli/objectlistcommand.hpp | 2 +- lib/cli/objectlistutility.cpp | 2 +- lib/cli/objectlistutility.hpp | 2 +- lib/cli/pkinewcacommand.cpp | 2 +- lib/cli/pkinewcacommand.hpp | 2 +- lib/cli/pkinewcertcommand.cpp | 2 +- lib/cli/pkinewcertcommand.hpp | 2 +- lib/cli/pkirequestcommand.cpp | 2 +- lib/cli/pkirequestcommand.hpp | 2 +- lib/cli/pkisavecertcommand.cpp | 2 +- lib/cli/pkisavecertcommand.hpp | 2 +- lib/cli/pkisigncsrcommand.cpp | 2 +- lib/cli/pkisigncsrcommand.hpp | 2 +- lib/cli/pkiticketcommand.cpp | 2 +- lib/cli/pkiticketcommand.hpp | 2 +- lib/cli/troubleshootcommand.cpp | 2 +- lib/cli/troubleshootcommand.hpp | 2 +- lib/cli/variablegetcommand.cpp | 2 +- lib/cli/variablegetcommand.hpp | 2 +- lib/cli/variablelistcommand.cpp | 2 +- lib/cli/variablelistcommand.hpp | 2 +- lib/cli/variableutility.cpp | 2 +- lib/cli/variableutility.hpp | 2 +- lib/compat/checkresultreader.cpp | 2 +- lib/compat/checkresultreader.hpp | 2 +- lib/compat/compatlogger.cpp | 2 +- lib/compat/compatlogger.hpp | 2 +- lib/compat/externalcommandlistener.cpp | 2 +- lib/compat/externalcommandlistener.hpp | 2 +- lib/compat/statusdatawriter.cpp | 2 +- lib/compat/statusdatawriter.hpp | 2 +- lib/config/activationcontext.cpp | 2 +- lib/config/activationcontext.hpp | 2 +- lib/config/applyrule.cpp | 2 +- lib/config/applyrule.hpp | 2 +- lib/config/configcompiler.cpp | 2 +- lib/config/configcompiler.hpp | 2 +- lib/config/configcompilercontext.cpp | 2 +- lib/config/configcompilercontext.hpp | 2 +- lib/config/configfragment.hpp | 2 +- lib/config/configitem.cpp | 2 +- lib/config/configitem.hpp | 2 +- lib/config/configitembuilder.cpp | 2 +- lib/config/configitembuilder.hpp | 2 +- lib/config/expression.cpp | 2 +- lib/config/expression.hpp | 2 +- lib/config/i2-config.hpp | 2 +- lib/config/objectrule.cpp | 2 +- lib/config/objectrule.hpp | 2 +- lib/config/vmops.hpp | 2 +- lib/db_ido/commanddbobject.cpp | 2 +- lib/db_ido/commanddbobject.hpp | 2 +- lib/db_ido/dbconnection.cpp | 2 +- lib/db_ido/dbconnection.hpp | 2 +- lib/db_ido/dbevents.cpp | 2 +- lib/db_ido/dbevents.hpp | 2 +- lib/db_ido/dbobject.cpp | 2 +- lib/db_ido/dbobject.hpp | 2 +- lib/db_ido/dbquery.cpp | 2 +- lib/db_ido/dbquery.hpp | 2 +- lib/db_ido/dbreference.cpp | 2 +- lib/db_ido/dbreference.hpp | 2 +- lib/db_ido/dbtype.cpp | 2 +- lib/db_ido/dbtype.hpp | 2 +- lib/db_ido/dbvalue.cpp | 2 +- lib/db_ido/dbvalue.hpp | 2 +- lib/db_ido/endpointdbobject.cpp | 2 +- lib/db_ido/endpointdbobject.hpp | 2 +- lib/db_ido/hostdbobject.cpp | 2 +- lib/db_ido/hostdbobject.hpp | 2 +- lib/db_ido/hostgroupdbobject.cpp | 2 +- lib/db_ido/hostgroupdbobject.hpp | 2 +- lib/db_ido/i2-db_ido.hpp | 2 +- lib/db_ido/idochecktask.cpp | 2 +- lib/db_ido/idochecktask.hpp | 2 +- lib/db_ido/servicedbobject.cpp | 2 +- lib/db_ido/servicedbobject.hpp | 2 +- lib/db_ido/servicegroupdbobject.cpp | 2 +- lib/db_ido/servicegroupdbobject.hpp | 2 +- lib/db_ido/timeperioddbobject.cpp | 2 +- lib/db_ido/timeperioddbobject.hpp | 2 +- lib/db_ido/userdbobject.cpp | 2 +- lib/db_ido/userdbobject.hpp | 2 +- lib/db_ido/usergroupdbobject.cpp | 2 +- lib/db_ido/usergroupdbobject.hpp | 2 +- lib/db_ido/zonedbobject.cpp | 2 +- lib/db_ido/zonedbobject.hpp | 2 +- lib/db_ido_mysql/idomysqlconnection.cpp | 2 +- lib/db_ido_mysql/idomysqlconnection.hpp | 2 +- lib/db_ido_pgsql/idopgsqlconnection.cpp | 2 +- lib/db_ido_pgsql/idopgsqlconnection.hpp | 2 +- lib/icinga/apiactions.cpp | 2 +- lib/icinga/apiactions.hpp | 2 +- lib/icinga/apievents.cpp | 2 +- lib/icinga/apievents.hpp | 2 +- lib/icinga/checkable-check.cpp | 2 +- lib/icinga/checkable-comment.cpp | 2 +- lib/icinga/checkable-dependency.cpp | 2 +- lib/icinga/checkable-downtime.cpp | 2 +- lib/icinga/checkable-event.cpp | 2 +- lib/icinga/checkable-flapping.cpp | 2 +- lib/icinga/checkable-notification.cpp | 2 +- lib/icinga/checkable-script.cpp | 2 +- lib/icinga/checkable.cpp | 2 +- lib/icinga/checkable.hpp | 2 +- lib/icinga/checkcommand.cpp | 2 +- lib/icinga/checkcommand.hpp | 2 +- lib/icinga/checkresult.cpp | 2 +- lib/icinga/checkresult.hpp | 2 +- lib/icinga/cib.cpp | 2 +- lib/icinga/cib.hpp | 2 +- lib/icinga/clusterevents-check.cpp | 2 +- lib/icinga/clusterevents.cpp | 2 +- lib/icinga/clusterevents.hpp | 2 +- lib/icinga/command.cpp | 2 +- lib/icinga/command.hpp | 2 +- lib/icinga/comment.cpp | 2 +- lib/icinga/comment.hpp | 2 +- lib/icinga/compatutility.cpp | 2 +- lib/icinga/compatutility.hpp | 2 +- lib/icinga/customvarobject.cpp | 2 +- lib/icinga/customvarobject.hpp | 2 +- lib/icinga/dependency-apply.cpp | 2 +- lib/icinga/dependency.cpp | 2 +- lib/icinga/dependency.hpp | 2 +- lib/icinga/downtime.cpp | 2 +- lib/icinga/downtime.hpp | 2 +- lib/icinga/eventcommand.cpp | 2 +- lib/icinga/eventcommand.hpp | 2 +- lib/icinga/externalcommandprocessor.cpp | 2 +- lib/icinga/externalcommandprocessor.hpp | 2 +- lib/icinga/host.cpp | 2 +- lib/icinga/host.hpp | 2 +- lib/icinga/hostgroup.cpp | 2 +- lib/icinga/hostgroup.hpp | 2 +- lib/icinga/i2-icinga.hpp | 2 +- lib/icinga/icingaapplication.cpp | 2 +- lib/icinga/icingaapplication.hpp | 2 +- lib/icinga/legacytimeperiod.cpp | 2 +- lib/icinga/legacytimeperiod.hpp | 2 +- lib/icinga/macroprocessor.cpp | 2 +- lib/icinga/macroprocessor.hpp | 2 +- lib/icinga/macroresolver.hpp | 2 +- lib/icinga/notification-apply.cpp | 2 +- lib/icinga/notification.cpp | 2 +- lib/icinga/notification.hpp | 2 +- lib/icinga/notificationcommand.cpp | 2 +- lib/icinga/notificationcommand.hpp | 2 +- lib/icinga/objectutils.cpp | 2 +- lib/icinga/objectutils.hpp | 2 +- lib/icinga/pluginutility.cpp | 2 +- lib/icinga/pluginutility.hpp | 2 +- lib/icinga/scheduleddowntime-apply.cpp | 2 +- lib/icinga/scheduleddowntime.cpp | 2 +- lib/icinga/scheduleddowntime.hpp | 2 +- lib/icinga/service-apply.cpp | 2 +- lib/icinga/service.cpp | 2 +- lib/icinga/service.hpp | 2 +- lib/icinga/servicegroup.cpp | 2 +- lib/icinga/servicegroup.hpp | 2 +- lib/icinga/timeperiod.cpp | 2 +- lib/icinga/timeperiod.hpp | 2 +- lib/icinga/user.cpp | 2 +- lib/icinga/user.hpp | 2 +- lib/icinga/usergroup.cpp | 2 +- lib/icinga/usergroup.hpp | 2 +- lib/livestatus/aggregator.cpp | 2 +- lib/livestatus/aggregator.hpp | 2 +- lib/livestatus/andfilter.cpp | 2 +- lib/livestatus/andfilter.hpp | 2 +- lib/livestatus/attributefilter.cpp | 2 +- lib/livestatus/attributefilter.hpp | 2 +- lib/livestatus/avgaggregator.cpp | 2 +- lib/livestatus/avgaggregator.hpp | 2 +- lib/livestatus/column.cpp | 2 +- lib/livestatus/column.hpp | 2 +- lib/livestatus/combinerfilter.cpp | 2 +- lib/livestatus/combinerfilter.hpp | 2 +- lib/livestatus/commandstable.cpp | 2 +- lib/livestatus/commandstable.hpp | 2 +- lib/livestatus/commentstable.cpp | 2 +- lib/livestatus/commentstable.hpp | 2 +- lib/livestatus/contactgroupstable.cpp | 2 +- lib/livestatus/contactgroupstable.hpp | 2 +- lib/livestatus/contactstable.cpp | 2 +- lib/livestatus/contactstable.hpp | 2 +- lib/livestatus/countaggregator.cpp | 2 +- lib/livestatus/countaggregator.hpp | 2 +- lib/livestatus/downtimestable.cpp | 2 +- lib/livestatus/downtimestable.hpp | 2 +- lib/livestatus/endpointstable.cpp | 2 +- lib/livestatus/endpointstable.hpp | 2 +- lib/livestatus/filter.hpp | 2 +- lib/livestatus/historytable.hpp | 2 +- lib/livestatus/hostgroupstable.cpp | 2 +- lib/livestatus/hostgroupstable.hpp | 2 +- lib/livestatus/hoststable.cpp | 2 +- lib/livestatus/hoststable.hpp | 2 +- lib/livestatus/i2-livestatus.hpp | 2 +- lib/livestatus/invavgaggregator.cpp | 2 +- lib/livestatus/invavgaggregator.hpp | 2 +- lib/livestatus/invsumaggregator.cpp | 2 +- lib/livestatus/invsumaggregator.hpp | 2 +- lib/livestatus/livestatuslistener.cpp | 2 +- lib/livestatus/livestatuslistener.hpp | 2 +- lib/livestatus/livestatuslogutility.cpp | 2 +- lib/livestatus/livestatuslogutility.hpp | 2 +- lib/livestatus/livestatusquery.cpp | 2 +- lib/livestatus/livestatusquery.hpp | 2 +- lib/livestatus/logtable.cpp | 2 +- lib/livestatus/logtable.hpp | 2 +- lib/livestatus/maxaggregator.cpp | 2 +- lib/livestatus/maxaggregator.hpp | 2 +- lib/livestatus/minaggregator.cpp | 2 +- lib/livestatus/minaggregator.hpp | 2 +- lib/livestatus/negatefilter.cpp | 2 +- lib/livestatus/negatefilter.hpp | 2 +- lib/livestatus/orfilter.cpp | 2 +- lib/livestatus/orfilter.hpp | 2 +- lib/livestatus/servicegroupstable.cpp | 2 +- lib/livestatus/servicegroupstable.hpp | 2 +- lib/livestatus/servicestable.cpp | 2 +- lib/livestatus/servicestable.hpp | 2 +- lib/livestatus/statehisttable.cpp | 2 +- lib/livestatus/statehisttable.hpp | 2 +- lib/livestatus/statustable.cpp | 2 +- lib/livestatus/statustable.hpp | 2 +- lib/livestatus/stdaggregator.cpp | 2 +- lib/livestatus/stdaggregator.hpp | 2 +- lib/livestatus/sumaggregator.cpp | 2 +- lib/livestatus/sumaggregator.hpp | 2 +- lib/livestatus/table.cpp | 2 +- lib/livestatus/table.hpp | 2 +- lib/livestatus/timeperiodstable.cpp | 2 +- lib/livestatus/timeperiodstable.hpp | 2 +- lib/livestatus/zonestable.cpp | 2 +- lib/livestatus/zonestable.hpp | 2 +- lib/methods/clusterchecktask.cpp | 2 +- lib/methods/clusterchecktask.hpp | 2 +- lib/methods/clusterzonechecktask.cpp | 2 +- lib/methods/clusterzonechecktask.hpp | 2 +- lib/methods/dummychecktask.cpp | 2 +- lib/methods/dummychecktask.hpp | 2 +- lib/methods/exceptionchecktask.cpp | 2 +- lib/methods/exceptionchecktask.hpp | 2 +- lib/methods/i2-methods.hpp | 2 +- lib/methods/icingachecktask.cpp | 2 +- lib/methods/icingachecktask.hpp | 2 +- lib/methods/nullchecktask.cpp | 2 +- lib/methods/nullchecktask.hpp | 2 +- lib/methods/nulleventtask.cpp | 2 +- lib/methods/nulleventtask.hpp | 2 +- lib/methods/pluginchecktask.cpp | 2 +- lib/methods/pluginchecktask.hpp | 2 +- lib/methods/plugineventtask.cpp | 2 +- lib/methods/plugineventtask.hpp | 2 +- lib/methods/pluginnotificationtask.cpp | 2 +- lib/methods/pluginnotificationtask.hpp | 2 +- lib/methods/randomchecktask.cpp | 2 +- lib/methods/randomchecktask.hpp | 2 +- lib/methods/timeperiodtask.cpp | 2 +- lib/methods/timeperiodtask.hpp | 2 +- lib/mysql_shim/mysqlinterface.cpp | 2 +- lib/mysql_shim/mysqlinterface.hpp | 2 +- lib/notification/notificationcomponent.cpp | 2 +- lib/notification/notificationcomponent.hpp | 2 +- lib/perfdata/elasticsearchwriter.cpp | 11 ++++++++++- lib/perfdata/elasticsearchwriter.hpp | 2 +- lib/perfdata/elasticsearchwriter.ti | 4 ++++ lib/perfdata/gelfwriter.cpp | 2 +- lib/perfdata/gelfwriter.hpp | 2 +- lib/perfdata/graphitewriter.cpp | 2 +- lib/perfdata/graphitewriter.hpp | 2 +- lib/perfdata/influxdbwriter.cpp | 2 +- lib/perfdata/influxdbwriter.hpp | 2 +- lib/perfdata/opentsdbwriter.cpp | 2 +- lib/perfdata/opentsdbwriter.hpp | 2 +- lib/perfdata/perfdatawriter.cpp | 2 +- lib/perfdata/perfdatawriter.hpp | 2 +- lib/pgsql_shim/pgsqlinterface.cpp | 2 +- lib/pgsql_shim/pgsqlinterface.hpp | 2 +- lib/remote/actionshandler.cpp | 2 +- lib/remote/actionshandler.hpp | 2 +- lib/remote/apiaction.cpp | 2 +- lib/remote/apiaction.hpp | 2 +- lib/remote/apiclient.cpp | 2 +- lib/remote/apiclient.hpp | 2 +- lib/remote/apifunction.cpp | 2 +- lib/remote/apifunction.hpp | 2 +- lib/remote/apilistener-configsync.cpp | 2 +- lib/remote/apilistener-filesync.cpp | 2 +- lib/remote/apilistener.cpp | 2 +- lib/remote/apilistener.hpp | 2 +- lib/remote/apiuser.cpp | 2 +- lib/remote/apiuser.hpp | 2 +- lib/remote/authority.cpp | 2 +- lib/remote/configfileshandler.cpp | 2 +- lib/remote/configfileshandler.hpp | 2 +- lib/remote/configobjectutility.cpp | 2 +- lib/remote/configobjectutility.hpp | 2 +- lib/remote/configpackageshandler.cpp | 2 +- lib/remote/configpackageshandler.hpp | 2 +- lib/remote/configpackageutility.cpp | 2 +- lib/remote/configpackageutility.hpp | 2 +- lib/remote/configstageshandler.cpp | 2 +- lib/remote/configstageshandler.hpp | 2 +- lib/remote/consolehandler.cpp | 2 +- lib/remote/consolehandler.hpp | 2 +- lib/remote/createobjecthandler.cpp | 2 +- lib/remote/createobjecthandler.hpp | 2 +- lib/remote/deleteobjecthandler.cpp | 2 +- lib/remote/deleteobjecthandler.hpp | 2 +- lib/remote/endpoint.cpp | 2 +- lib/remote/endpoint.hpp | 2 +- lib/remote/eventqueue.cpp | 2 +- lib/remote/eventqueue.hpp | 2 +- lib/remote/eventshandler.cpp | 2 +- lib/remote/eventshandler.hpp | 2 +- lib/remote/filterutility.cpp | 2 +- lib/remote/filterutility.hpp | 2 +- lib/remote/httpchunkedencoding.cpp | 2 +- lib/remote/httpchunkedencoding.hpp | 2 +- lib/remote/httpclientconnection.cpp | 2 +- lib/remote/httpclientconnection.hpp | 2 +- lib/remote/httphandler.cpp | 2 +- lib/remote/httphandler.hpp | 2 +- lib/remote/httprequest.cpp | 2 +- lib/remote/httprequest.hpp | 2 +- lib/remote/httpresponse.cpp | 2 +- lib/remote/httpresponse.hpp | 2 +- lib/remote/httpserverconnection.cpp | 2 +- lib/remote/httpserverconnection.hpp | 2 +- lib/remote/httputility.cpp | 2 +- lib/remote/httputility.hpp | 2 +- lib/remote/i2-remote.hpp | 2 +- lib/remote/infohandler.cpp | 2 +- lib/remote/infohandler.hpp | 2 +- lib/remote/jsonrpc.cpp | 2 +- lib/remote/jsonrpc.hpp | 2 +- lib/remote/jsonrpcconnection-heartbeat.cpp | 2 +- lib/remote/jsonrpcconnection-pki.cpp | 2 +- lib/remote/jsonrpcconnection.cpp | 2 +- lib/remote/jsonrpcconnection.hpp | 2 +- lib/remote/messageorigin.cpp | 2 +- lib/remote/messageorigin.hpp | 2 +- lib/remote/modifyobjecthandler.cpp | 2 +- lib/remote/modifyobjecthandler.hpp | 2 +- lib/remote/objectqueryhandler.cpp | 2 +- lib/remote/objectqueryhandler.hpp | 2 +- lib/remote/pkiutility.cpp | 2 +- lib/remote/pkiutility.hpp | 2 +- lib/remote/statushandler.cpp | 2 +- lib/remote/statushandler.hpp | 2 +- lib/remote/templatequeryhandler.cpp | 2 +- lib/remote/templatequeryhandler.hpp | 2 +- lib/remote/typequeryhandler.cpp | 2 +- lib/remote/typequeryhandler.hpp | 2 +- lib/remote/url-characters.hpp | 2 +- lib/remote/url.cpp | 2 +- lib/remote/url.hpp | 2 +- lib/remote/variablequeryhandler.cpp | 2 +- lib/remote/variablequeryhandler.hpp | 2 +- lib/remote/zone.cpp | 2 +- lib/remote/zone.hpp | 2 +- plugins/check_disk.cpp | 2 +- plugins/check_load.cpp | 2 +- plugins/check_memory.cpp | 2 +- plugins/check_network.cpp | 2 +- plugins/check_nscp_api.cpp | 2 +- plugins/check_perfmon.cpp | 2 +- plugins/check_ping.cpp | 2 +- plugins/check_procs.cpp | 2 +- plugins/check_service.cpp | 2 +- plugins/check_swap.cpp | 2 +- plugins/check_update.cpp | 2 +- plugins/check_uptime.cpp | 2 +- plugins/check_users.cpp | 2 +- plugins/thresholds.cpp | 2 +- plugins/thresholds.hpp | 2 +- test/base-array.cpp | 2 +- test/base-base64.cpp | 2 +- test/base-convert.cpp | 2 +- test/base-dictionary.cpp | 2 +- test/base-fifo.cpp | 2 +- test/base-json.cpp | 2 +- test/base-match.cpp | 2 +- test/base-netstring.cpp | 2 +- test/base-object-packer.cpp | 2 +- test/base-object.cpp | 2 +- test/base-serialize.cpp | 2 +- test/base-shellescape.cpp | 2 +- test/base-stacktrace.cpp | 2 +- test/base-stream.cpp | 2 +- test/base-string.cpp | 2 +- test/base-timer.cpp | 2 +- test/base-type.cpp | 2 +- test/base-value.cpp | 2 +- test/config-ops.cpp | 2 +- test/icinga-checkresult.cpp | 2 +- test/icinga-macros.cpp | 2 +- test/icinga-notification.cpp | 2 +- test/icinga-perfdata.cpp | 2 +- test/icingaapplication-fixture.cpp | 2 +- test/icingaapplication-fixture.hpp | 2 +- test/livestatus-fixture.cpp | 2 +- test/livestatus.cpp | 2 +- test/remote-url.cpp | 2 +- test/test-runner.cpp | 2 +- tools/mkclass/classcompiler.cpp | 2 +- tools/mkclass/classcompiler.hpp | 2 +- tools/mkclass/mkclass.cpp | 2 +- 595 files changed, 607 insertions(+), 594 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 9ad8a9a42..9dbdb3ad8 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index e88ec2344..81e88f803 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/application-environment.cpp b/lib/base/application-environment.cpp index a70ea886f..358935f7b 100644 --- a/lib/base/application-environment.cpp +++ b/lib/base/application-environment.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/application-version.cpp b/lib/base/application-version.cpp index 0bb642519..2d454caa4 100644 --- a/lib/base/application-version.cpp +++ b/lib/base/application-version.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 1d6e1b4b1..2ccf275b6 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/application.hpp b/lib/base/application.hpp index 72a76b6ea..d88e65a7a 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/array-script.cpp b/lib/base/array-script.cpp index c12585b1f..adc475c3e 100644 --- a/lib/base/array-script.cpp +++ b/lib/base/array-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/array.cpp b/lib/base/array.cpp index 011f3cc8f..7baf331fd 100644 --- a/lib/base/array.cpp +++ b/lib/base/array.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/array.hpp b/lib/base/array.hpp index d6f7fcdfc..6dfbbe2d4 100644 --- a/lib/base/array.hpp +++ b/lib/base/array.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/base64.cpp b/lib/base/base64.cpp index 368dca878..61c9295b1 100644 --- a/lib/base/base64.cpp +++ b/lib/base/base64.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/base64.hpp b/lib/base/base64.hpp index 1cea938ca..cbfbf86b3 100644 --- a/lib/base/base64.hpp +++ b/lib/base/base64.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/boolean-script.cpp b/lib/base/boolean-script.cpp index 1116cc250..aab8ff0e5 100644 --- a/lib/base/boolean-script.cpp +++ b/lib/base/boolean-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/boolean.cpp b/lib/base/boolean.cpp index 72305e1de..23839f722 100644 --- a/lib/base/boolean.cpp +++ b/lib/base/boolean.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/boolean.hpp b/lib/base/boolean.hpp index 3175e9beb..ed6232ed1 100644 --- a/lib/base/boolean.hpp +++ b/lib/base/boolean.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configobject-script.cpp b/lib/base/configobject-script.cpp index 9f615eca7..3d60699c3 100644 --- a/lib/base/configobject-script.cpp +++ b/lib/base/configobject-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index b95a57818..9d44db60a 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configobject.hpp b/lib/base/configobject.hpp index 9afadac90..886c56105 100644 --- a/lib/base/configobject.hpp +++ b/lib/base/configobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configtype.cpp b/lib/base/configtype.cpp index 0c3aa68ed..f265bd71f 100644 --- a/lib/base/configtype.cpp +++ b/lib/base/configtype.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configtype.hpp b/lib/base/configtype.hpp index 739bb0111..07e590a21 100644 --- a/lib/base/configtype.hpp +++ b/lib/base/configtype.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp index 10d33645a..0103028de 100644 --- a/lib/base/configuration.cpp +++ b/lib/base/configuration.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp index 2a57bbbd8..96ab2726f 100644 --- a/lib/base/configuration.hpp +++ b/lib/base/configuration.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configwriter.cpp b/lib/base/configwriter.cpp index a085be915..cb2592dd3 100644 --- a/lib/base/configwriter.cpp +++ b/lib/base/configwriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configwriter.hpp b/lib/base/configwriter.hpp index 1e3fc7759..f221e7ba7 100644 --- a/lib/base/configwriter.hpp +++ b/lib/base/configwriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/console.cpp b/lib/base/console.cpp index d1b1b7d86..fff57d5ba 100644 --- a/lib/base/console.cpp +++ b/lib/base/console.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/console.hpp b/lib/base/console.hpp index 63bcfe417..0980c167a 100644 --- a/lib/base/console.hpp +++ b/lib/base/console.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/context.cpp b/lib/base/context.cpp index a654d9909..3cec8a1fe 100644 --- a/lib/base/context.cpp +++ b/lib/base/context.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/context.hpp b/lib/base/context.hpp index 5b53515b8..204ee029a 100644 --- a/lib/base/context.hpp +++ b/lib/base/context.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/convert.cpp b/lib/base/convert.cpp index 054ff591d..deb445cd6 100644 --- a/lib/base/convert.cpp +++ b/lib/base/convert.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/convert.hpp b/lib/base/convert.hpp index 84c66da5b..8b9000d05 100644 --- a/lib/base/convert.hpp +++ b/lib/base/convert.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/datetime-script.cpp b/lib/base/datetime-script.cpp index c26177af1..8ac29fc85 100644 --- a/lib/base/datetime-script.cpp +++ b/lib/base/datetime-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/datetime.cpp b/lib/base/datetime.cpp index 808312269..863b9a9eb 100644 --- a/lib/base/datetime.cpp +++ b/lib/base/datetime.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/datetime.hpp b/lib/base/datetime.hpp index 54821b3a7..b82edfd88 100644 --- a/lib/base/datetime.hpp +++ b/lib/base/datetime.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/debug.hpp b/lib/base/debug.hpp index d8ac052c8..e5d306ccb 100644 --- a/lib/base/debug.hpp +++ b/lib/base/debug.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/debuginfo.cpp b/lib/base/debuginfo.cpp index 3071e20c9..28414f7ac 100644 --- a/lib/base/debuginfo.cpp +++ b/lib/base/debuginfo.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/debuginfo.hpp b/lib/base/debuginfo.hpp index 836069e47..6947f43f0 100644 --- a/lib/base/debuginfo.hpp +++ b/lib/base/debuginfo.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/dependencygraph.cpp b/lib/base/dependencygraph.cpp index 8fccef5f3..796b5d55e 100644 --- a/lib/base/dependencygraph.cpp +++ b/lib/base/dependencygraph.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/dependencygraph.hpp b/lib/base/dependencygraph.hpp index 39f50a6ae..1ccacef5c 100644 --- a/lib/base/dependencygraph.hpp +++ b/lib/base/dependencygraph.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp index 7d805a59b..905a7a3e3 100644 --- a/lib/base/dictionary-script.cpp +++ b/lib/base/dictionary-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/dictionary.cpp b/lib/base/dictionary.cpp index 99fd5591f..d917e9f96 100644 --- a/lib/base/dictionary.cpp +++ b/lib/base/dictionary.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/dictionary.hpp b/lib/base/dictionary.hpp index 9523528a6..c6534e9b6 100644 --- a/lib/base/dictionary.hpp +++ b/lib/base/dictionary.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/exception.cpp b/lib/base/exception.cpp index b74a0a6c1..c36ac787e 100644 --- a/lib/base/exception.cpp +++ b/lib/base/exception.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/exception.hpp b/lib/base/exception.hpp index 9e06f3666..a3f78f458 100644 --- a/lib/base/exception.hpp +++ b/lib/base/exception.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/fifo.cpp b/lib/base/fifo.cpp index e0d295791..d9453f066 100644 --- a/lib/base/fifo.cpp +++ b/lib/base/fifo.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/fifo.hpp b/lib/base/fifo.hpp index 6b85a2842..3f01c8eba 100644 --- a/lib/base/fifo.hpp +++ b/lib/base/fifo.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/filelogger.cpp b/lib/base/filelogger.cpp index 28d1eac8d..6c9c832ed 100644 --- a/lib/base/filelogger.cpp +++ b/lib/base/filelogger.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/filelogger.hpp b/lib/base/filelogger.hpp index 8c9a8eee9..e0f4cdb09 100644 --- a/lib/base/filelogger.hpp +++ b/lib/base/filelogger.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/function-script.cpp b/lib/base/function-script.cpp index 8a96b26f2..19dbd399d 100644 --- a/lib/base/function-script.cpp +++ b/lib/base/function-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/function.cpp b/lib/base/function.cpp index 6fec96208..27b10e6ce 100644 --- a/lib/base/function.cpp +++ b/lib/base/function.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/function.hpp b/lib/base/function.hpp index 3eb7ce98d..1d6306c47 100644 --- a/lib/base/function.hpp +++ b/lib/base/function.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/functionwrapper.hpp b/lib/base/functionwrapper.hpp index da32bb7ed..f076b4993 100644 --- a/lib/base/functionwrapper.hpp +++ b/lib/base/functionwrapper.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/i2-base.hpp b/lib/base/i2-base.hpp index 95446b2cf..add2e46a2 100644 --- a/lib/base/i2-base.hpp +++ b/lib/base/i2-base.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/initialize.cpp b/lib/base/initialize.cpp index feffb4816..a2102f172 100644 --- a/lib/base/initialize.cpp +++ b/lib/base/initialize.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/initialize.hpp b/lib/base/initialize.hpp index 942aa5b0f..ac6ce3cf4 100644 --- a/lib/base/initialize.hpp +++ b/lib/base/initialize.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/json-script.cpp b/lib/base/json-script.cpp index d99c71bde..d5140e2fc 100644 --- a/lib/base/json-script.cpp +++ b/lib/base/json-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/json.cpp b/lib/base/json.cpp index 27119f434..237fac23a 100644 --- a/lib/base/json.cpp +++ b/lib/base/json.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/json.hpp b/lib/base/json.hpp index 368a25cbd..8791b6009 100644 --- a/lib/base/json.hpp +++ b/lib/base/json.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/library.cpp b/lib/base/library.cpp index d1a4c5f06..2fa3a31ce 100644 --- a/lib/base/library.cpp +++ b/lib/base/library.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/library.hpp b/lib/base/library.hpp index 3832ab41d..d7ba69ee1 100644 --- a/lib/base/library.hpp +++ b/lib/base/library.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/loader.cpp b/lib/base/loader.cpp index a44beae76..dd54c8937 100644 --- a/lib/base/loader.cpp +++ b/lib/base/loader.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/loader.hpp b/lib/base/loader.hpp index d54cada10..63d42b738 100644 --- a/lib/base/loader.hpp +++ b/lib/base/loader.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index 8af34d6ca..adb288376 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/logger.hpp b/lib/base/logger.hpp index 31ed6c821..599cca416 100644 --- a/lib/base/logger.hpp +++ b/lib/base/logger.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/math-script.cpp b/lib/base/math-script.cpp index 288cbca12..9a0b4b13a 100644 --- a/lib/base/math-script.cpp +++ b/lib/base/math-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/namespace-script.cpp b/lib/base/namespace-script.cpp index 9f5471d60..08dfa3618 100644 --- a/lib/base/namespace-script.cpp +++ b/lib/base/namespace-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/namespace.cpp b/lib/base/namespace.cpp index 909a76511..8ca785318 100644 --- a/lib/base/namespace.cpp +++ b/lib/base/namespace.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/namespace.hpp b/lib/base/namespace.hpp index eb4928620..5a7158aa1 100644 --- a/lib/base/namespace.hpp +++ b/lib/base/namespace.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/netstring.cpp b/lib/base/netstring.cpp index 7d11d8928..5bc026167 100644 --- a/lib/base/netstring.cpp +++ b/lib/base/netstring.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/netstring.hpp b/lib/base/netstring.hpp index 1daaa979a..51836ec9f 100644 --- a/lib/base/netstring.hpp +++ b/lib/base/netstring.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/networkstream.cpp b/lib/base/networkstream.cpp index 4752b3fbf..19f661b33 100644 --- a/lib/base/networkstream.cpp +++ b/lib/base/networkstream.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/networkstream.hpp b/lib/base/networkstream.hpp index edbd32f1c..cbaf1ca54 100644 --- a/lib/base/networkstream.hpp +++ b/lib/base/networkstream.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/number-script.cpp b/lib/base/number-script.cpp index 8ec9ae554..8946676cc 100644 --- a/lib/base/number-script.cpp +++ b/lib/base/number-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/number.cpp b/lib/base/number.cpp index 8a2a7ff6e..8aedda9db 100644 --- a/lib/base/number.cpp +++ b/lib/base/number.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/number.hpp b/lib/base/number.hpp index 239ec299a..0d6cbf05a 100644 --- a/lib/base/number.hpp +++ b/lib/base/number.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/object-packer.cpp b/lib/base/object-packer.cpp index 3f0a571d8..03e61b971 100644 --- a/lib/base/object-packer.cpp +++ b/lib/base/object-packer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/object-packer.hpp b/lib/base/object-packer.hpp index 420a43979..cfa2aec90 100644 --- a/lib/base/object-packer.hpp +++ b/lib/base/object-packer.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/object-script.cpp b/lib/base/object-script.cpp index 6db6374e8..4f93b0946 100644 --- a/lib/base/object-script.cpp +++ b/lib/base/object-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/object.cpp b/lib/base/object.cpp index e3ec8f7aa..6aa52afb8 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/object.hpp b/lib/base/object.hpp index 9d64d4af3..9b155bbe8 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/objectlock.cpp b/lib/base/objectlock.cpp index c3d3f0522..8eed66bf3 100644 --- a/lib/base/objectlock.cpp +++ b/lib/base/objectlock.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/objectlock.hpp b/lib/base/objectlock.hpp index 1c2f993e8..9dfdd6735 100644 --- a/lib/base/objectlock.hpp +++ b/lib/base/objectlock.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/objecttype.cpp b/lib/base/objecttype.cpp index eff6696c9..4fb6f9d7c 100644 --- a/lib/base/objecttype.cpp +++ b/lib/base/objecttype.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/objecttype.hpp b/lib/base/objecttype.hpp index 4fb0e5c3d..ad2a31d5a 100644 --- a/lib/base/objecttype.hpp +++ b/lib/base/objecttype.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/perfdatavalue.cpp b/lib/base/perfdatavalue.cpp index 0795c7644..b977011de 100644 --- a/lib/base/perfdatavalue.cpp +++ b/lib/base/perfdatavalue.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/perfdatavalue.hpp b/lib/base/perfdatavalue.hpp index a72d267be..49ff57936 100644 --- a/lib/base/perfdatavalue.hpp +++ b/lib/base/perfdatavalue.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/primitivetype.cpp b/lib/base/primitivetype.cpp index 9f1a6a3e8..4ade53f48 100644 --- a/lib/base/primitivetype.cpp +++ b/lib/base/primitivetype.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/primitivetype.hpp b/lib/base/primitivetype.hpp index 61cedb6cb..c752c1de4 100644 --- a/lib/base/primitivetype.hpp +++ b/lib/base/primitivetype.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/process.cpp b/lib/base/process.cpp index f84bc497c..71454b5ac 100644 --- a/lib/base/process.cpp +++ b/lib/base/process.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/process.hpp b/lib/base/process.hpp index 259f19e33..ad72aea4c 100644 --- a/lib/base/process.hpp +++ b/lib/base/process.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/reference-script.cpp b/lib/base/reference-script.cpp index 7254333aa..9d70877e4 100644 --- a/lib/base/reference-script.cpp +++ b/lib/base/reference-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/reference.cpp b/lib/base/reference.cpp index 855b60115..877b40137 100644 --- a/lib/base/reference.cpp +++ b/lib/base/reference.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/reference.hpp b/lib/base/reference.hpp index 347a81db6..6d6472281 100644 --- a/lib/base/reference.hpp +++ b/lib/base/reference.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/registry.hpp b/lib/base/registry.hpp index 9f13866d6..ead44e457 100644 --- a/lib/base/registry.hpp +++ b/lib/base/registry.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/ringbuffer.cpp b/lib/base/ringbuffer.cpp index 9e3b1c840..9fb62413c 100644 --- a/lib/base/ringbuffer.cpp +++ b/lib/base/ringbuffer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/ringbuffer.hpp b/lib/base/ringbuffer.hpp index 44a96f868..07f55112f 100644 --- a/lib/base/ringbuffer.hpp +++ b/lib/base/ringbuffer.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index 36f75284e..ebb6399b3 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptframe.hpp b/lib/base/scriptframe.hpp index 56ff4f922..1fd1f2344 100644 --- a/lib/base/scriptframe.hpp +++ b/lib/base/scriptframe.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptglobal.cpp b/lib/base/scriptglobal.cpp index 69ccac06e..6796d5223 100644 --- a/lib/base/scriptglobal.cpp +++ b/lib/base/scriptglobal.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptglobal.hpp b/lib/base/scriptglobal.hpp index 562152bb4..abb500e5e 100644 --- a/lib/base/scriptglobal.hpp +++ b/lib/base/scriptglobal.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index 4aa0b3bcd..6d1c5a063 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/scriptutils.hpp b/lib/base/scriptutils.hpp index fcb80f6e4..92449188f 100644 --- a/lib/base/scriptutils.hpp +++ b/lib/base/scriptutils.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/serializer.cpp b/lib/base/serializer.cpp index 82e55983b..cb4088ed7 100644 --- a/lib/base/serializer.cpp +++ b/lib/base/serializer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/serializer.hpp b/lib/base/serializer.hpp index 85e7d454d..a475e15cf 100644 --- a/lib/base/serializer.hpp +++ b/lib/base/serializer.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/singleton.hpp b/lib/base/singleton.hpp index 535c3faee..05f15d6d0 100644 --- a/lib/base/singleton.hpp +++ b/lib/base/singleton.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socket.cpp b/lib/base/socket.cpp index 17d35778b..6406d2122 100644 --- a/lib/base/socket.cpp +++ b/lib/base/socket.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socket.hpp b/lib/base/socket.hpp index 7de915bbe..5b0be13ca 100644 --- a/lib/base/socket.hpp +++ b/lib/base/socket.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socketevents-epoll.cpp b/lib/base/socketevents-epoll.cpp index 7b810a6d6..ba2e7e25b 100644 --- a/lib/base/socketevents-epoll.cpp +++ b/lib/base/socketevents-epoll.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socketevents-poll.cpp b/lib/base/socketevents-poll.cpp index 19748434e..e46dd2c45 100644 --- a/lib/base/socketevents-poll.cpp +++ b/lib/base/socketevents-poll.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index b967a345f..1400396a4 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 360a03477..486ec4df1 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stacktrace.cpp b/lib/base/stacktrace.cpp index 9fb6c519e..e81ecb5fa 100644 --- a/lib/base/stacktrace.cpp +++ b/lib/base/stacktrace.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stacktrace.hpp b/lib/base/stacktrace.hpp index 1a197de2b..69c1f3104 100644 --- a/lib/base/stacktrace.hpp +++ b/lib/base/stacktrace.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/statsfunction.hpp b/lib/base/statsfunction.hpp index aba496e75..991e6d5fc 100644 --- a/lib/base/statsfunction.hpp +++ b/lib/base/statsfunction.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stdiostream.cpp b/lib/base/stdiostream.cpp index 773ee35c3..84bd8b5ad 100644 --- a/lib/base/stdiostream.cpp +++ b/lib/base/stdiostream.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stdiostream.hpp b/lib/base/stdiostream.hpp index e72cf4c43..c89ef9812 100644 --- a/lib/base/stdiostream.hpp +++ b/lib/base/stdiostream.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index 0b847060f..8e1258d75 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/stream.hpp b/lib/base/stream.hpp index bb4129138..0a7bf5fd0 100644 --- a/lib/base/stream.hpp +++ b/lib/base/stream.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/streamlogger.cpp b/lib/base/streamlogger.cpp index fa93d740b..314b54409 100644 --- a/lib/base/streamlogger.cpp +++ b/lib/base/streamlogger.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/streamlogger.hpp b/lib/base/streamlogger.hpp index ae08361c5..d1400bfe8 100644 --- a/lib/base/streamlogger.hpp +++ b/lib/base/streamlogger.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/string-script.cpp b/lib/base/string-script.cpp index 2edb6dd01..ea6e944b6 100644 --- a/lib/base/string-script.cpp +++ b/lib/base/string-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/string.cpp b/lib/base/string.cpp index 5970f6ebf..de8e79167 100644 --- a/lib/base/string.cpp +++ b/lib/base/string.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/string.hpp b/lib/base/string.hpp index 70b6f9e37..bc4e33ee4 100644 --- a/lib/base/string.hpp +++ b/lib/base/string.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/sysloglogger.cpp b/lib/base/sysloglogger.cpp index 673a27930..8bee06315 100644 --- a/lib/base/sysloglogger.cpp +++ b/lib/base/sysloglogger.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/sysloglogger.hpp b/lib/base/sysloglogger.hpp index 8718a21d0..9c1b63edd 100644 --- a/lib/base/sysloglogger.hpp +++ b/lib/base/sysloglogger.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 0af189f8b..7ac935bf8 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp index 1b99128ae..c65eb3c18 100644 --- a/lib/base/tcpsocket.hpp +++ b/lib/base/tcpsocket.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index 996931d00..1dad249bc 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/threadpool.hpp b/lib/base/threadpool.hpp index 06277c70c..f2083cd38 100644 --- a/lib/base/threadpool.hpp +++ b/lib/base/threadpool.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index d5e748cfa..2bcff3a4b 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 7a0c1f981..96b775322 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index afb46b781..c68c72977 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index ad5b92d0f..e58d5995d 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index 66abf2b86..306d2941f 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/tlsutility.hpp b/lib/base/tlsutility.hpp index 38df7e587..b9af961d3 100644 --- a/lib/base/tlsutility.hpp +++ b/lib/base/tlsutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/type.cpp b/lib/base/type.cpp index a010d55a0..3fa505d8c 100644 --- a/lib/base/type.cpp +++ b/lib/base/type.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/type.hpp b/lib/base/type.hpp index a8fb7dc89..d01b605da 100644 --- a/lib/base/type.hpp +++ b/lib/base/type.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/typetype-script.cpp b/lib/base/typetype-script.cpp index 88ebe3c92..f20b46a3c 100644 --- a/lib/base/typetype-script.cpp +++ b/lib/base/typetype-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/unix.hpp b/lib/base/unix.hpp index 5312f51fa..7083d0f02 100644 --- a/lib/base/unix.hpp +++ b/lib/base/unix.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/unixsocket.cpp b/lib/base/unixsocket.cpp index c5aacbc54..9813298ef 100644 --- a/lib/base/unixsocket.cpp +++ b/lib/base/unixsocket.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/unixsocket.hpp b/lib/base/unixsocket.hpp index ab5546b50..b3b718ada 100644 --- a/lib/base/unixsocket.hpp +++ b/lib/base/unixsocket.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 8d2162011..cf8bc588f 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index 8311f8d54..e75ebfefa 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index 9ce5a2d24..9ce78460c 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/value.cpp b/lib/base/value.cpp index 93c515a2b..7132e95e0 100644 --- a/lib/base/value.cpp +++ b/lib/base/value.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/value.hpp b/lib/base/value.hpp index 9d036c2b7..55ecd1926 100644 --- a/lib/base/value.hpp +++ b/lib/base/value.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/win32.hpp b/lib/base/win32.hpp index be840ff9d..bd880b8a8 100644 --- a/lib/base/win32.hpp +++ b/lib/base/win32.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/workqueue.cpp b/lib/base/workqueue.cpp index 7e8ad5890..49a441289 100644 --- a/lib/base/workqueue.cpp +++ b/lib/base/workqueue.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/workqueue.hpp b/lib/base/workqueue.hpp index 002e5f21c..f1a1f4115 100644 --- a/lib/base/workqueue.hpp +++ b/lib/base/workqueue.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index 5a4aa6157..cde975b72 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp index 601bb58b2..f69f5092e 100644 --- a/lib/checker/checkercomponent.hpp +++ b/lib/checker/checkercomponent.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/apisetupcommand.cpp b/lib/cli/apisetupcommand.cpp index bc832c525..27c49a304 100644 --- a/lib/cli/apisetupcommand.cpp +++ b/lib/cli/apisetupcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp index f54da0685..d46c0da49 100644 --- a/lib/cli/apisetupcommand.hpp +++ b/lib/cli/apisetupcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 640a878c9..f8b12bacb 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/apisetuputility.hpp b/lib/cli/apisetuputility.hpp index 9523ebffc..426c6c18a 100644 --- a/lib/cli/apisetuputility.hpp +++ b/lib/cli/apisetuputility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/calistcommand.cpp b/lib/cli/calistcommand.cpp index 8d9caf382..5f793273a 100644 --- a/lib/cli/calistcommand.cpp +++ b/lib/cli/calistcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/calistcommand.hpp b/lib/cli/calistcommand.hpp index e71ffd872..e89aa6eb4 100644 --- a/lib/cli/calistcommand.hpp +++ b/lib/cli/calistcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/casigncommand.cpp b/lib/cli/casigncommand.cpp index 57c11d8f8..37b26fdbe 100644 --- a/lib/cli/casigncommand.cpp +++ b/lib/cli/casigncommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/casigncommand.hpp b/lib/cli/casigncommand.hpp index 28ae8b82a..41c7b9013 100644 --- a/lib/cli/casigncommand.hpp +++ b/lib/cli/casigncommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/clicommand.cpp b/lib/cli/clicommand.cpp index 069597ad9..1ac721345 100644 --- a/lib/cli/clicommand.cpp +++ b/lib/cli/clicommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/clicommand.hpp b/lib/cli/clicommand.hpp index 3023ed4f9..1aa4aca91 100644 --- a/lib/cli/clicommand.hpp +++ b/lib/cli/clicommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index e8c1a50d6..15d5ecc77 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/consolecommand.hpp b/lib/cli/consolecommand.hpp index 9369080c4..88f8c8b0a 100644 --- a/lib/cli/consolecommand.hpp +++ b/lib/cli/consolecommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index d744d0dc1..88461f148 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/daemoncommand.hpp b/lib/cli/daemoncommand.hpp index 7fafe6d10..437a19383 100644 --- a/lib/cli/daemoncommand.hpp +++ b/lib/cli/daemoncommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index cddbf4ec5..5a4bd2c1d 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/daemonutility.hpp b/lib/cli/daemonutility.hpp index ffd8f04b3..457b7e7dc 100644 --- a/lib/cli/daemonutility.hpp +++ b/lib/cli/daemonutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/editline.hpp b/lib/cli/editline.hpp index cd78e5d57..3670bdd2b 100644 --- a/lib/cli/editline.hpp +++ b/lib/cli/editline.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featuredisablecommand.cpp b/lib/cli/featuredisablecommand.cpp index 54a702c3d..acee0209e 100644 --- a/lib/cli/featuredisablecommand.cpp +++ b/lib/cli/featuredisablecommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featuredisablecommand.hpp b/lib/cli/featuredisablecommand.hpp index 7dc5465d2..cc3f6dc33 100644 --- a/lib/cli/featuredisablecommand.hpp +++ b/lib/cli/featuredisablecommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featureenablecommand.cpp b/lib/cli/featureenablecommand.cpp index 244bbdb95..f4d41cd53 100644 --- a/lib/cli/featureenablecommand.cpp +++ b/lib/cli/featureenablecommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featureenablecommand.hpp b/lib/cli/featureenablecommand.hpp index a81ecc2c9..c337ae80c 100644 --- a/lib/cli/featureenablecommand.hpp +++ b/lib/cli/featureenablecommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featurelistcommand.cpp b/lib/cli/featurelistcommand.cpp index 33e4e96ad..8f1667cca 100644 --- a/lib/cli/featurelistcommand.cpp +++ b/lib/cli/featurelistcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featurelistcommand.hpp b/lib/cli/featurelistcommand.hpp index 46f357c75..30a599408 100644 --- a/lib/cli/featurelistcommand.hpp +++ b/lib/cli/featurelistcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index 74c7a75bd..bfb6026a6 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/featureutility.hpp b/lib/cli/featureutility.hpp index 38f91cce0..a153f53ac 100644 --- a/lib/cli/featureutility.hpp +++ b/lib/cli/featureutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/i2-cli.hpp b/lib/cli/i2-cli.hpp index c23e2b875..f0770f6e4 100644 --- a/lib/cli/i2-cli.hpp +++ b/lib/cli/i2-cli.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/internalsignalcommand.cpp b/lib/cli/internalsignalcommand.cpp index 3e196728d..24797de12 100644 --- a/lib/cli/internalsignalcommand.cpp +++ b/lib/cli/internalsignalcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/internalsignalcommand.hpp b/lib/cli/internalsignalcommand.hpp index 44830ccd9..98f134d23 100644 --- a/lib/cli/internalsignalcommand.hpp +++ b/lib/cli/internalsignalcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index e97b9952e..166c8425b 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodesetupcommand.hpp b/lib/cli/nodesetupcommand.hpp index 1e3560a3b..16d0b6c0f 100644 --- a/lib/cli/nodesetupcommand.hpp +++ b/lib/cli/nodesetupcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index 101607fe0..235e24200 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodeutility.hpp b/lib/cli/nodeutility.hpp index 3017a8ead..57948bfa0 100644 --- a/lib/cli/nodeutility.hpp +++ b/lib/cli/nodeutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodewizardcommand.cpp b/lib/cli/nodewizardcommand.cpp index 96beba825..ea5759305 100644 --- a/lib/cli/nodewizardcommand.cpp +++ b/lib/cli/nodewizardcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/nodewizardcommand.hpp b/lib/cli/nodewizardcommand.hpp index 5cc6033c0..fcf9e5495 100644 --- a/lib/cli/nodewizardcommand.hpp +++ b/lib/cli/nodewizardcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/objectlistcommand.cpp b/lib/cli/objectlistcommand.cpp index 32495153a..89859fe77 100644 --- a/lib/cli/objectlistcommand.cpp +++ b/lib/cli/objectlistcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/objectlistcommand.hpp b/lib/cli/objectlistcommand.hpp index 2220e40c8..067f90514 100644 --- a/lib/cli/objectlistcommand.hpp +++ b/lib/cli/objectlistcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/objectlistutility.cpp b/lib/cli/objectlistutility.cpp index 3f5d9c0a3..00de35b14 100644 --- a/lib/cli/objectlistutility.cpp +++ b/lib/cli/objectlistutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/objectlistutility.hpp b/lib/cli/objectlistutility.hpp index 1b80f7dc2..3c7a48f00 100644 --- a/lib/cli/objectlistutility.hpp +++ b/lib/cli/objectlistutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkinewcacommand.cpp b/lib/cli/pkinewcacommand.cpp index c9c1e172e..f67dd4276 100644 --- a/lib/cli/pkinewcacommand.cpp +++ b/lib/cli/pkinewcacommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkinewcacommand.hpp b/lib/cli/pkinewcacommand.hpp index b9d362a9a..d1058d20e 100644 --- a/lib/cli/pkinewcacommand.hpp +++ b/lib/cli/pkinewcacommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkinewcertcommand.cpp b/lib/cli/pkinewcertcommand.cpp index 61215bd0a..8ee01b0b6 100644 --- a/lib/cli/pkinewcertcommand.cpp +++ b/lib/cli/pkinewcertcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkinewcertcommand.hpp b/lib/cli/pkinewcertcommand.hpp index c3b639c23..57e0417af 100644 --- a/lib/cli/pkinewcertcommand.hpp +++ b/lib/cli/pkinewcertcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkirequestcommand.cpp b/lib/cli/pkirequestcommand.cpp index c14fb7b21..0f2cc6d8d 100644 --- a/lib/cli/pkirequestcommand.cpp +++ b/lib/cli/pkirequestcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkirequestcommand.hpp b/lib/cli/pkirequestcommand.hpp index 71b9ca3a9..d6f5f202a 100644 --- a/lib/cli/pkirequestcommand.hpp +++ b/lib/cli/pkirequestcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkisavecertcommand.cpp b/lib/cli/pkisavecertcommand.cpp index 1cfd463e1..d78f3202b 100644 --- a/lib/cli/pkisavecertcommand.cpp +++ b/lib/cli/pkisavecertcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkisavecertcommand.hpp b/lib/cli/pkisavecertcommand.hpp index 0fb0c4847..1b362e435 100644 --- a/lib/cli/pkisavecertcommand.hpp +++ b/lib/cli/pkisavecertcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkisigncsrcommand.cpp b/lib/cli/pkisigncsrcommand.cpp index e7de7aca8..c03f1a0fc 100644 --- a/lib/cli/pkisigncsrcommand.cpp +++ b/lib/cli/pkisigncsrcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkisigncsrcommand.hpp b/lib/cli/pkisigncsrcommand.hpp index da9e1c8e7..0de37578e 100644 --- a/lib/cli/pkisigncsrcommand.hpp +++ b/lib/cli/pkisigncsrcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkiticketcommand.cpp b/lib/cli/pkiticketcommand.cpp index 8ba088488..20110cb6d 100644 --- a/lib/cli/pkiticketcommand.cpp +++ b/lib/cli/pkiticketcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/pkiticketcommand.hpp b/lib/cli/pkiticketcommand.hpp index 0ada10ea5..14dfe255e 100644 --- a/lib/cli/pkiticketcommand.hpp +++ b/lib/cli/pkiticketcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/troubleshootcommand.cpp b/lib/cli/troubleshootcommand.cpp index 1e9892d9c..934678688 100644 --- a/lib/cli/troubleshootcommand.cpp +++ b/lib/cli/troubleshootcommand.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * +* Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/troubleshootcommand.hpp b/lib/cli/troubleshootcommand.hpp index dbe5fba5e..2646ec0ec 100644 --- a/lib/cli/troubleshootcommand.hpp +++ b/lib/cli/troubleshootcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variablegetcommand.cpp b/lib/cli/variablegetcommand.cpp index 72e5b58b4..564552d19 100644 --- a/lib/cli/variablegetcommand.cpp +++ b/lib/cli/variablegetcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variablegetcommand.hpp b/lib/cli/variablegetcommand.hpp index 84f63df5b..f85b24a21 100644 --- a/lib/cli/variablegetcommand.hpp +++ b/lib/cli/variablegetcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variablelistcommand.cpp b/lib/cli/variablelistcommand.cpp index 612f912f8..1fe58dbdd 100644 --- a/lib/cli/variablelistcommand.cpp +++ b/lib/cli/variablelistcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variablelistcommand.hpp b/lib/cli/variablelistcommand.hpp index d5502dca1..f96cf3a86 100644 --- a/lib/cli/variablelistcommand.hpp +++ b/lib/cli/variablelistcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variableutility.cpp b/lib/cli/variableutility.cpp index 1c03f25d7..cc97c03f9 100644 --- a/lib/cli/variableutility.cpp +++ b/lib/cli/variableutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/cli/variableutility.hpp b/lib/cli/variableutility.hpp index af1f3fb8e..f758a9287 100644 --- a/lib/cli/variableutility.hpp +++ b/lib/cli/variableutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/checkresultreader.cpp b/lib/compat/checkresultreader.cpp index 016248765..f900ad189 100644 --- a/lib/compat/checkresultreader.cpp +++ b/lib/compat/checkresultreader.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/checkresultreader.hpp b/lib/compat/checkresultreader.hpp index 445f8354c..53068b0be 100644 --- a/lib/compat/checkresultreader.hpp +++ b/lib/compat/checkresultreader.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/compatlogger.cpp b/lib/compat/compatlogger.cpp index 5e6d2c752..8c177c23a 100644 --- a/lib/compat/compatlogger.cpp +++ b/lib/compat/compatlogger.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/compatlogger.hpp b/lib/compat/compatlogger.hpp index fecab1f99..94a62756f 100644 --- a/lib/compat/compatlogger.hpp +++ b/lib/compat/compatlogger.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/externalcommandlistener.cpp b/lib/compat/externalcommandlistener.cpp index bb9402c79..84d7adb16 100644 --- a/lib/compat/externalcommandlistener.cpp +++ b/lib/compat/externalcommandlistener.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/externalcommandlistener.hpp b/lib/compat/externalcommandlistener.hpp index a2adc47ef..370dec668 100644 --- a/lib/compat/externalcommandlistener.hpp +++ b/lib/compat/externalcommandlistener.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index b2b8ce376..a1821ad1a 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/statusdatawriter.hpp b/lib/compat/statusdatawriter.hpp index b8fb71d33..ed6a35616 100644 --- a/lib/compat/statusdatawriter.hpp +++ b/lib/compat/statusdatawriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/activationcontext.cpp b/lib/config/activationcontext.cpp index c22f41caf..c9bd3897d 100644 --- a/lib/config/activationcontext.cpp +++ b/lib/config/activationcontext.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/activationcontext.hpp b/lib/config/activationcontext.hpp index c5a275631..df4ce58a5 100644 --- a/lib/config/activationcontext.hpp +++ b/lib/config/activationcontext.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/applyrule.cpp b/lib/config/applyrule.cpp index 7bbb8d7e0..e7200c314 100644 --- a/lib/config/applyrule.cpp +++ b/lib/config/applyrule.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/applyrule.hpp b/lib/config/applyrule.hpp index b57d6c565..b4feff743 100644 --- a/lib/config/applyrule.hpp +++ b/lib/config/applyrule.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configcompiler.cpp b/lib/config/configcompiler.cpp index 05db34e02..74cfaa292 100644 --- a/lib/config/configcompiler.cpp +++ b/lib/config/configcompiler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configcompiler.hpp b/lib/config/configcompiler.hpp index 4bbc5c083..8d10c72e1 100644 --- a/lib/config/configcompiler.hpp +++ b/lib/config/configcompiler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configcompilercontext.cpp b/lib/config/configcompilercontext.cpp index b298a33ec..03843e89b 100644 --- a/lib/config/configcompilercontext.cpp +++ b/lib/config/configcompilercontext.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configcompilercontext.hpp b/lib/config/configcompilercontext.hpp index 7a7fb54c8..145f682dd 100644 --- a/lib/config/configcompilercontext.hpp +++ b/lib/config/configcompilercontext.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configfragment.hpp b/lib/config/configfragment.hpp index cbc772737..9d3bf9ab8 100644 --- a/lib/config/configfragment.hpp +++ b/lib/config/configfragment.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 503491b52..1fd640cff 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configitem.hpp b/lib/config/configitem.hpp index f560fa64d..54c664c57 100644 --- a/lib/config/configitem.hpp +++ b/lib/config/configitem.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configitembuilder.cpp b/lib/config/configitembuilder.cpp index 392156cae..2652761fb 100644 --- a/lib/config/configitembuilder.cpp +++ b/lib/config/configitembuilder.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/configitembuilder.hpp b/lib/config/configitembuilder.hpp index 2144bdbe2..ceb29e202 100644 --- a/lib/config/configitembuilder.hpp +++ b/lib/config/configitembuilder.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index e3910488e..e2c8bef31 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index c0fab4096..390f1cef0 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/i2-config.hpp b/lib/config/i2-config.hpp index 5ec9145c3..05d99690e 100644 --- a/lib/config/i2-config.hpp +++ b/lib/config/i2-config.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/objectrule.cpp b/lib/config/objectrule.cpp index ce6c8d409..c46836a6e 100644 --- a/lib/config/objectrule.cpp +++ b/lib/config/objectrule.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/objectrule.hpp b/lib/config/objectrule.hpp index 1e20f346c..04bf7628a 100644 --- a/lib/config/objectrule.hpp +++ b/lib/config/objectrule.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/vmops.hpp b/lib/config/vmops.hpp index 38f8507a7..2e1ba76a2 100644 --- a/lib/config/vmops.hpp +++ b/lib/config/vmops.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/commanddbobject.cpp b/lib/db_ido/commanddbobject.cpp index b097bed33..277c61709 100644 --- a/lib/db_ido/commanddbobject.cpp +++ b/lib/db_ido/commanddbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/commanddbobject.hpp b/lib/db_ido/commanddbobject.hpp index 18534e423..80c423830 100644 --- a/lib/db_ido/commanddbobject.hpp +++ b/lib/db_ido/commanddbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbconnection.cpp b/lib/db_ido/dbconnection.cpp index 30f602d56..b8e1a50f2 100644 --- a/lib/db_ido/dbconnection.cpp +++ b/lib/db_ido/dbconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index 20ea9324f..ba68a44d1 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index 97709793b..cd3792b48 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbevents.hpp b/lib/db_ido/dbevents.hpp index 3e27d2960..0db322aea 100644 --- a/lib/db_ido/dbevents.hpp +++ b/lib/db_ido/dbevents.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbobject.cpp b/lib/db_ido/dbobject.cpp index 9ab72ec1d..a615b873f 100644 --- a/lib/db_ido/dbobject.cpp +++ b/lib/db_ido/dbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbobject.hpp b/lib/db_ido/dbobject.hpp index a90170d74..7a0490d04 100644 --- a/lib/db_ido/dbobject.hpp +++ b/lib/db_ido/dbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbquery.cpp b/lib/db_ido/dbquery.cpp index d64904f53..a5e4fb616 100644 --- a/lib/db_ido/dbquery.cpp +++ b/lib/db_ido/dbquery.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbquery.hpp b/lib/db_ido/dbquery.hpp index fe1220681..1badcbf14 100644 --- a/lib/db_ido/dbquery.hpp +++ b/lib/db_ido/dbquery.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbreference.cpp b/lib/db_ido/dbreference.cpp index f2eba39bf..1b4f4f561 100644 --- a/lib/db_ido/dbreference.cpp +++ b/lib/db_ido/dbreference.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbreference.hpp b/lib/db_ido/dbreference.hpp index eef22157a..2942b3fd9 100644 --- a/lib/db_ido/dbreference.hpp +++ b/lib/db_ido/dbreference.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbtype.cpp b/lib/db_ido/dbtype.cpp index 65b56896b..123901ad2 100644 --- a/lib/db_ido/dbtype.cpp +++ b/lib/db_ido/dbtype.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbtype.hpp b/lib/db_ido/dbtype.hpp index ad6f3f957..292f36d80 100644 --- a/lib/db_ido/dbtype.hpp +++ b/lib/db_ido/dbtype.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbvalue.cpp b/lib/db_ido/dbvalue.cpp index 9f1f22bc9..c9ea1b6ba 100644 --- a/lib/db_ido/dbvalue.cpp +++ b/lib/db_ido/dbvalue.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbvalue.hpp b/lib/db_ido/dbvalue.hpp index 146189ca0..83e285442 100644 --- a/lib/db_ido/dbvalue.hpp +++ b/lib/db_ido/dbvalue.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/endpointdbobject.cpp b/lib/db_ido/endpointdbobject.cpp index ed9b27fb3..ed6a82c22 100644 --- a/lib/db_ido/endpointdbobject.cpp +++ b/lib/db_ido/endpointdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/endpointdbobject.hpp b/lib/db_ido/endpointdbobject.hpp index e2edb4b6f..10524ca4a 100644 --- a/lib/db_ido/endpointdbobject.hpp +++ b/lib/db_ido/endpointdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/hostdbobject.cpp b/lib/db_ido/hostdbobject.cpp index 808ecf640..a50d59166 100644 --- a/lib/db_ido/hostdbobject.cpp +++ b/lib/db_ido/hostdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/hostdbobject.hpp b/lib/db_ido/hostdbobject.hpp index 6d5afc7ac..111836b11 100644 --- a/lib/db_ido/hostdbobject.hpp +++ b/lib/db_ido/hostdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/hostgroupdbobject.cpp b/lib/db_ido/hostgroupdbobject.cpp index 13ee82783..013b75f7e 100644 --- a/lib/db_ido/hostgroupdbobject.cpp +++ b/lib/db_ido/hostgroupdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/hostgroupdbobject.hpp b/lib/db_ido/hostgroupdbobject.hpp index dc7016959..5c77b40b8 100644 --- a/lib/db_ido/hostgroupdbobject.hpp +++ b/lib/db_ido/hostgroupdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/i2-db_ido.hpp b/lib/db_ido/i2-db_ido.hpp index 959fb9fbc..e88a1a05f 100644 --- a/lib/db_ido/i2-db_ido.hpp +++ b/lib/db_ido/i2-db_ido.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/idochecktask.cpp b/lib/db_ido/idochecktask.cpp index ed87b9e0b..871aa27d5 100644 --- a/lib/db_ido/idochecktask.cpp +++ b/lib/db_ido/idochecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/idochecktask.hpp b/lib/db_ido/idochecktask.hpp index 8f73b36cd..b0705c5bf 100644 --- a/lib/db_ido/idochecktask.hpp +++ b/lib/db_ido/idochecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/servicedbobject.cpp b/lib/db_ido/servicedbobject.cpp index 2d80f526b..903bba655 100644 --- a/lib/db_ido/servicedbobject.cpp +++ b/lib/db_ido/servicedbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/servicedbobject.hpp b/lib/db_ido/servicedbobject.hpp index b88bbbd86..3693ff3f7 100644 --- a/lib/db_ido/servicedbobject.hpp +++ b/lib/db_ido/servicedbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/servicegroupdbobject.cpp b/lib/db_ido/servicegroupdbobject.cpp index 085e76f7f..b667b3ed9 100644 --- a/lib/db_ido/servicegroupdbobject.cpp +++ b/lib/db_ido/servicegroupdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/servicegroupdbobject.hpp b/lib/db_ido/servicegroupdbobject.hpp index c62516352..23e1f2d7c 100644 --- a/lib/db_ido/servicegroupdbobject.hpp +++ b/lib/db_ido/servicegroupdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/timeperioddbobject.cpp b/lib/db_ido/timeperioddbobject.cpp index a53ae5c2a..d7f41141c 100644 --- a/lib/db_ido/timeperioddbobject.cpp +++ b/lib/db_ido/timeperioddbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/timeperioddbobject.hpp b/lib/db_ido/timeperioddbobject.hpp index f40a024f3..5759de109 100644 --- a/lib/db_ido/timeperioddbobject.hpp +++ b/lib/db_ido/timeperioddbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/userdbobject.cpp b/lib/db_ido/userdbobject.cpp index 2078d57cc..10c55b2a3 100644 --- a/lib/db_ido/userdbobject.cpp +++ b/lib/db_ido/userdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/userdbobject.hpp b/lib/db_ido/userdbobject.hpp index fa2be5198..6eb742193 100644 --- a/lib/db_ido/userdbobject.hpp +++ b/lib/db_ido/userdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/usergroupdbobject.cpp b/lib/db_ido/usergroupdbobject.cpp index 2a8458f94..0bbde24d5 100644 --- a/lib/db_ido/usergroupdbobject.cpp +++ b/lib/db_ido/usergroupdbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/usergroupdbobject.hpp b/lib/db_ido/usergroupdbobject.hpp index ec2330627..d387b79db 100644 --- a/lib/db_ido/usergroupdbobject.hpp +++ b/lib/db_ido/usergroupdbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/zonedbobject.cpp b/lib/db_ido/zonedbobject.cpp index 1c462d7e9..a321dd3a8 100644 --- a/lib/db_ido/zonedbobject.cpp +++ b/lib/db_ido/zonedbobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/zonedbobject.hpp b/lib/db_ido/zonedbobject.hpp index ac051ab6c..03ae4e3f6 100644 --- a/lib/db_ido/zonedbobject.hpp +++ b/lib/db_ido/zonedbobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 24f6ce66d..1a13b89cc 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_mysql/idomysqlconnection.hpp b/lib/db_ido_mysql/idomysqlconnection.hpp index 0a13bb73a..79946f34d 100644 --- a/lib/db_ido_mysql/idomysqlconnection.hpp +++ b/lib/db_ido_mysql/idomysqlconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index acd0fc2b1..96cf08c13 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_pgsql/idopgsqlconnection.hpp b/lib/db_ido_pgsql/idopgsqlconnection.hpp index 3b1dc2649..b3763a51a 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.hpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 0c28fe944..22684c9a2 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/apiactions.hpp b/lib/icinga/apiactions.hpp index 0b13bb546..9cd9fbbb9 100644 --- a/lib/icinga/apiactions.hpp +++ b/lib/icinga/apiactions.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/apievents.cpp b/lib/icinga/apievents.cpp index 7041890df..3097280ad 100644 --- a/lib/icinga/apievents.cpp +++ b/lib/icinga/apievents.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/apievents.hpp b/lib/icinga/apievents.hpp index 41c909a99..ce6d95451 100644 --- a/lib/icinga/apievents.hpp +++ b/lib/icinga/apievents.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index c836f0726..e70648d89 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-comment.cpp b/lib/icinga/checkable-comment.cpp index 25b828ca3..c0de3eca2 100644 --- a/lib/icinga/checkable-comment.cpp +++ b/lib/icinga/checkable-comment.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-dependency.cpp b/lib/icinga/checkable-dependency.cpp index 2b6b50f91..65cf386a9 100644 --- a/lib/icinga/checkable-dependency.cpp +++ b/lib/icinga/checkable-dependency.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-downtime.cpp b/lib/icinga/checkable-downtime.cpp index 3222986da..1df068442 100644 --- a/lib/icinga/checkable-downtime.cpp +++ b/lib/icinga/checkable-downtime.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-event.cpp b/lib/icinga/checkable-event.cpp index 494b14cac..900c40012 100644 --- a/lib/icinga/checkable-event.cpp +++ b/lib/icinga/checkable-event.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-flapping.cpp b/lib/icinga/checkable-flapping.cpp index 9efd5f38e..d4e6987ca 100644 --- a/lib/icinga/checkable-flapping.cpp +++ b/lib/icinga/checkable-flapping.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-notification.cpp b/lib/icinga/checkable-notification.cpp index 3dad5a7af..1a2c18363 100644 --- a/lib/icinga/checkable-notification.cpp +++ b/lib/icinga/checkable-notification.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable-script.cpp b/lib/icinga/checkable-script.cpp index 532fb58dd..d0fe3be6c 100644 --- a/lib/icinga/checkable-script.cpp +++ b/lib/icinga/checkable-script.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index fe52e37ef..fe2fed9e3 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index a71487e54..141d0a43c 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkcommand.cpp b/lib/icinga/checkcommand.cpp index e32af3220..4d33341c4 100644 --- a/lib/icinga/checkcommand.cpp +++ b/lib/icinga/checkcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkcommand.hpp b/lib/icinga/checkcommand.hpp index 471d6c2a1..9bf12f412 100644 --- a/lib/icinga/checkcommand.hpp +++ b/lib/icinga/checkcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkresult.cpp b/lib/icinga/checkresult.cpp index e1c8d160c..47288a22d 100644 --- a/lib/icinga/checkresult.cpp +++ b/lib/icinga/checkresult.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkresult.hpp b/lib/icinga/checkresult.hpp index 245b4ba32..ade435bc5 100644 --- a/lib/icinga/checkresult.hpp +++ b/lib/icinga/checkresult.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/cib.cpp b/lib/icinga/cib.cpp index d84dad4c8..a0a8e1271 100644 --- a/lib/icinga/cib.cpp +++ b/lib/icinga/cib.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/cib.hpp b/lib/icinga/cib.hpp index 09bcba5e1..82f8c0da9 100644 --- a/lib/icinga/cib.hpp +++ b/lib/icinga/cib.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/clusterevents-check.cpp b/lib/icinga/clusterevents-check.cpp index 9ad1c798f..29b4e2445 100644 --- a/lib/icinga/clusterevents-check.cpp +++ b/lib/icinga/clusterevents-check.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/clusterevents.cpp b/lib/icinga/clusterevents.cpp index e892caabf..db8102729 100644 --- a/lib/icinga/clusterevents.cpp +++ b/lib/icinga/clusterevents.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/clusterevents.hpp b/lib/icinga/clusterevents.hpp index 5b8acf78a..d2c2e48f2 100644 --- a/lib/icinga/clusterevents.hpp +++ b/lib/icinga/clusterevents.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/command.cpp b/lib/icinga/command.cpp index 628ed301a..3de275943 100644 --- a/lib/icinga/command.cpp +++ b/lib/icinga/command.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/command.hpp b/lib/icinga/command.hpp index fa1aa5c03..65c6b668a 100644 --- a/lib/icinga/command.hpp +++ b/lib/icinga/command.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/comment.cpp b/lib/icinga/comment.cpp index 9931b42bd..c4630354f 100644 --- a/lib/icinga/comment.cpp +++ b/lib/icinga/comment.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/comment.hpp b/lib/icinga/comment.hpp index d031b66de..89211b5e4 100644 --- a/lib/icinga/comment.hpp +++ b/lib/icinga/comment.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/compatutility.cpp b/lib/icinga/compatutility.cpp index 3eb0dc573..d3e106be3 100644 --- a/lib/icinga/compatutility.cpp +++ b/lib/icinga/compatutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/compatutility.hpp b/lib/icinga/compatutility.hpp index 388cdcb05..e6f49b3b6 100644 --- a/lib/icinga/compatutility.hpp +++ b/lib/icinga/compatutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/customvarobject.cpp b/lib/icinga/customvarobject.cpp index 2055dbd78..90cb3a00e 100644 --- a/lib/icinga/customvarobject.cpp +++ b/lib/icinga/customvarobject.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/customvarobject.hpp b/lib/icinga/customvarobject.hpp index 84328bd7b..2c4a72510 100644 --- a/lib/icinga/customvarobject.hpp +++ b/lib/icinga/customvarobject.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/dependency-apply.cpp b/lib/icinga/dependency-apply.cpp index cc464aa7d..5304da1ff 100644 --- a/lib/icinga/dependency-apply.cpp +++ b/lib/icinga/dependency-apply.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/dependency.cpp b/lib/icinga/dependency.cpp index 328a20e76..02073ba54 100644 --- a/lib/icinga/dependency.cpp +++ b/lib/icinga/dependency.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/dependency.hpp b/lib/icinga/dependency.hpp index b9db395c3..1306594f7 100644 --- a/lib/icinga/dependency.hpp +++ b/lib/icinga/dependency.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index aafefadb2..336329bc2 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/downtime.hpp b/lib/icinga/downtime.hpp index c4646eabb..59209e8c9 100644 --- a/lib/icinga/downtime.hpp +++ b/lib/icinga/downtime.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/eventcommand.cpp b/lib/icinga/eventcommand.cpp index a2a1cdc79..a7a035e9d 100644 --- a/lib/icinga/eventcommand.cpp +++ b/lib/icinga/eventcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/eventcommand.hpp b/lib/icinga/eventcommand.hpp index d971976a1..158a5b466 100644 --- a/lib/icinga/eventcommand.hpp +++ b/lib/icinga/eventcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index f117743fa..b2d2c3cb2 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/externalcommandprocessor.hpp b/lib/icinga/externalcommandprocessor.hpp index 5aff98cb2..54e01fcf3 100644 --- a/lib/icinga/externalcommandprocessor.hpp +++ b/lib/icinga/externalcommandprocessor.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index 89c4131e6..4f464652e 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/host.hpp b/lib/icinga/host.hpp index cbd49d1db..28b09975c 100644 --- a/lib/icinga/host.hpp +++ b/lib/icinga/host.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/hostgroup.cpp b/lib/icinga/hostgroup.cpp index d0ca7b323..a859139c2 100644 --- a/lib/icinga/hostgroup.cpp +++ b/lib/icinga/hostgroup.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/hostgroup.hpp b/lib/icinga/hostgroup.hpp index fb2564620..edeeae8d1 100644 --- a/lib/icinga/hostgroup.hpp +++ b/lib/icinga/hostgroup.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/i2-icinga.hpp b/lib/icinga/i2-icinga.hpp index 80469b4bd..3738eaf88 100644 --- a/lib/icinga/i2-icinga.hpp +++ b/lib/icinga/i2-icinga.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index a8d7104b3..bcad227b5 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/icingaapplication.hpp b/lib/icinga/icingaapplication.hpp index ba8b77cf3..cb4b8717e 100644 --- a/lib/icinga/icingaapplication.hpp +++ b/lib/icinga/icingaapplication.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 777a1cc10..427f6903a 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/legacytimeperiod.hpp b/lib/icinga/legacytimeperiod.hpp index 9bec5b68c..28f1e8052 100644 --- a/lib/icinga/legacytimeperiod.hpp +++ b/lib/icinga/legacytimeperiod.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index d99f7649d..dfe3c3c0e 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/macroprocessor.hpp b/lib/icinga/macroprocessor.hpp index c7b3b5b36..9a17d5131 100644 --- a/lib/icinga/macroprocessor.hpp +++ b/lib/icinga/macroprocessor.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/macroresolver.hpp b/lib/icinga/macroresolver.hpp index 33d3a97ae..523487231 100644 --- a/lib/icinga/macroresolver.hpp +++ b/lib/icinga/macroresolver.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notification-apply.cpp b/lib/icinga/notification-apply.cpp index 7f8f39dab..653f52e57 100644 --- a/lib/icinga/notification-apply.cpp +++ b/lib/icinga/notification-apply.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 9ac006e1e..19dc8268d 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notification.hpp b/lib/icinga/notification.hpp index 47dd9d52d..1be21603f 100644 --- a/lib/icinga/notification.hpp +++ b/lib/icinga/notification.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notificationcommand.cpp b/lib/icinga/notificationcommand.cpp index 46dc7c086..492566162 100644 --- a/lib/icinga/notificationcommand.cpp +++ b/lib/icinga/notificationcommand.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notificationcommand.hpp b/lib/icinga/notificationcommand.hpp index 10079250e..ff288ac76 100644 --- a/lib/icinga/notificationcommand.hpp +++ b/lib/icinga/notificationcommand.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/objectutils.cpp b/lib/icinga/objectutils.cpp index 0f77502b2..eacbace69 100644 --- a/lib/icinga/objectutils.cpp +++ b/lib/icinga/objectutils.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/objectutils.hpp b/lib/icinga/objectutils.hpp index 60a77646f..16f269d24 100644 --- a/lib/icinga/objectutils.hpp +++ b/lib/icinga/objectutils.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 15189f7b9..2a15c0e25 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/pluginutility.hpp b/lib/icinga/pluginutility.hpp index 1cfd38d87..a11b558a0 100644 --- a/lib/icinga/pluginutility.hpp +++ b/lib/icinga/pluginutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/scheduleddowntime-apply.cpp b/lib/icinga/scheduleddowntime-apply.cpp index 3909f6fc0..498b7b1ed 100644 --- a/lib/icinga/scheduleddowntime-apply.cpp +++ b/lib/icinga/scheduleddowntime-apply.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 80d7617ba..6436487b4 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 7fbcd1e12..c3891676f 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/service-apply.cpp b/lib/icinga/service-apply.cpp index 4e9f78a66..8cbce1bb7 100644 --- a/lib/icinga/service-apply.cpp +++ b/lib/icinga/service-apply.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index ffbbedd2d..ef8a99df9 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/service.hpp b/lib/icinga/service.hpp index 8fb45d684..44e9c3806 100644 --- a/lib/icinga/service.hpp +++ b/lib/icinga/service.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/servicegroup.cpp b/lib/icinga/servicegroup.cpp index 2b99f4214..7ef7347cb 100644 --- a/lib/icinga/servicegroup.cpp +++ b/lib/icinga/servicegroup.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/servicegroup.hpp b/lib/icinga/servicegroup.hpp index 9a8d49a7b..a0c375caf 100644 --- a/lib/icinga/servicegroup.hpp +++ b/lib/icinga/servicegroup.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/timeperiod.cpp b/lib/icinga/timeperiod.cpp index a145e7e69..f71e36c74 100644 --- a/lib/icinga/timeperiod.cpp +++ b/lib/icinga/timeperiod.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/timeperiod.hpp b/lib/icinga/timeperiod.hpp index a641d40cb..d5a589508 100644 --- a/lib/icinga/timeperiod.hpp +++ b/lib/icinga/timeperiod.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/user.cpp b/lib/icinga/user.cpp index 2d72d7373..87c818219 100644 --- a/lib/icinga/user.cpp +++ b/lib/icinga/user.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/user.hpp b/lib/icinga/user.hpp index 57a007799..4aa8b134d 100644 --- a/lib/icinga/user.hpp +++ b/lib/icinga/user.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/usergroup.cpp b/lib/icinga/usergroup.cpp index 8f2a4e7fc..d9feee4bb 100644 --- a/lib/icinga/usergroup.cpp +++ b/lib/icinga/usergroup.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/usergroup.hpp b/lib/icinga/usergroup.hpp index 9bf02a4e8..d72680157 100644 --- a/lib/icinga/usergroup.hpp +++ b/lib/icinga/usergroup.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/aggregator.cpp b/lib/livestatus/aggregator.cpp index 1cc4b9762..a5294b51c 100644 --- a/lib/livestatus/aggregator.cpp +++ b/lib/livestatus/aggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/aggregator.hpp b/lib/livestatus/aggregator.hpp index 28aa60355..4b9e1b190 100644 --- a/lib/livestatus/aggregator.hpp +++ b/lib/livestatus/aggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/andfilter.cpp b/lib/livestatus/andfilter.cpp index 66b46766b..7ce777b80 100644 --- a/lib/livestatus/andfilter.cpp +++ b/lib/livestatus/andfilter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/andfilter.hpp b/lib/livestatus/andfilter.hpp index cdbd21752..26c6fbdbd 100644 --- a/lib/livestatus/andfilter.hpp +++ b/lib/livestatus/andfilter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/attributefilter.cpp b/lib/livestatus/attributefilter.cpp index 35ed40cf7..347819858 100644 --- a/lib/livestatus/attributefilter.cpp +++ b/lib/livestatus/attributefilter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/attributefilter.hpp b/lib/livestatus/attributefilter.hpp index f8220eaad..d584824c2 100644 --- a/lib/livestatus/attributefilter.hpp +++ b/lib/livestatus/attributefilter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/avgaggregator.cpp b/lib/livestatus/avgaggregator.cpp index 592aadb1c..25836188d 100644 --- a/lib/livestatus/avgaggregator.cpp +++ b/lib/livestatus/avgaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/avgaggregator.hpp b/lib/livestatus/avgaggregator.hpp index 664134832..39b05df99 100644 --- a/lib/livestatus/avgaggregator.hpp +++ b/lib/livestatus/avgaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/column.cpp b/lib/livestatus/column.cpp index 8cdd4eacf..8c2ade4d6 100644 --- a/lib/livestatus/column.cpp +++ b/lib/livestatus/column.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/column.hpp b/lib/livestatus/column.hpp index 4cc132ab7..1a473f18e 100644 --- a/lib/livestatus/column.hpp +++ b/lib/livestatus/column.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/combinerfilter.cpp b/lib/livestatus/combinerfilter.cpp index 0657b8397..b82f06e9f 100644 --- a/lib/livestatus/combinerfilter.cpp +++ b/lib/livestatus/combinerfilter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/combinerfilter.hpp b/lib/livestatus/combinerfilter.hpp index 56b7e9b90..4a35c28b5 100644 --- a/lib/livestatus/combinerfilter.hpp +++ b/lib/livestatus/combinerfilter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/commandstable.cpp b/lib/livestatus/commandstable.cpp index a26ae91a2..1598c7af5 100644 --- a/lib/livestatus/commandstable.cpp +++ b/lib/livestatus/commandstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/commandstable.hpp b/lib/livestatus/commandstable.hpp index 3589f969f..3f5177145 100644 --- a/lib/livestatus/commandstable.hpp +++ b/lib/livestatus/commandstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/commentstable.cpp b/lib/livestatus/commentstable.cpp index ca75eb259..57775258c 100644 --- a/lib/livestatus/commentstable.cpp +++ b/lib/livestatus/commentstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/commentstable.hpp b/lib/livestatus/commentstable.hpp index f6dbf7dc8..8b6f2ac4e 100644 --- a/lib/livestatus/commentstable.hpp +++ b/lib/livestatus/commentstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/contactgroupstable.cpp b/lib/livestatus/contactgroupstable.cpp index 2be78ffad..b074c7349 100644 --- a/lib/livestatus/contactgroupstable.cpp +++ b/lib/livestatus/contactgroupstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/contactgroupstable.hpp b/lib/livestatus/contactgroupstable.hpp index f8e46390d..a94c19095 100644 --- a/lib/livestatus/contactgroupstable.hpp +++ b/lib/livestatus/contactgroupstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/contactstable.cpp b/lib/livestatus/contactstable.cpp index 62030aae6..1d65c1b5a 100644 --- a/lib/livestatus/contactstable.cpp +++ b/lib/livestatus/contactstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/contactstable.hpp b/lib/livestatus/contactstable.hpp index 4c4816c0c..55d6f414f 100644 --- a/lib/livestatus/contactstable.hpp +++ b/lib/livestatus/contactstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/countaggregator.cpp b/lib/livestatus/countaggregator.cpp index 11ceb96ff..77858c986 100644 --- a/lib/livestatus/countaggregator.cpp +++ b/lib/livestatus/countaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/countaggregator.hpp b/lib/livestatus/countaggregator.hpp index 5b4d19588..2de91ae85 100644 --- a/lib/livestatus/countaggregator.hpp +++ b/lib/livestatus/countaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/downtimestable.cpp b/lib/livestatus/downtimestable.cpp index 008a391ac..9881e253c 100644 --- a/lib/livestatus/downtimestable.cpp +++ b/lib/livestatus/downtimestable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/downtimestable.hpp b/lib/livestatus/downtimestable.hpp index 9b3ca2a96..63e0d54f4 100644 --- a/lib/livestatus/downtimestable.hpp +++ b/lib/livestatus/downtimestable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/endpointstable.cpp b/lib/livestatus/endpointstable.cpp index 260916fa6..ce31a4d5b 100644 --- a/lib/livestatus/endpointstable.cpp +++ b/lib/livestatus/endpointstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/endpointstable.hpp b/lib/livestatus/endpointstable.hpp index ced85cfe5..42bc424d0 100644 --- a/lib/livestatus/endpointstable.hpp +++ b/lib/livestatus/endpointstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/filter.hpp b/lib/livestatus/filter.hpp index 2febc8db3..6bbf8c37d 100644 --- a/lib/livestatus/filter.hpp +++ b/lib/livestatus/filter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/historytable.hpp b/lib/livestatus/historytable.hpp index 9d032e617..4d10ed8d0 100644 --- a/lib/livestatus/historytable.hpp +++ b/lib/livestatus/historytable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/hostgroupstable.cpp b/lib/livestatus/hostgroupstable.cpp index a4ab713a3..07816df3f 100644 --- a/lib/livestatus/hostgroupstable.cpp +++ b/lib/livestatus/hostgroupstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/hostgroupstable.hpp b/lib/livestatus/hostgroupstable.hpp index 91d2847a1..468998f08 100644 --- a/lib/livestatus/hostgroupstable.hpp +++ b/lib/livestatus/hostgroupstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/hoststable.cpp b/lib/livestatus/hoststable.cpp index d46b88535..9b133fb35 100644 --- a/lib/livestatus/hoststable.cpp +++ b/lib/livestatus/hoststable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/hoststable.hpp b/lib/livestatus/hoststable.hpp index 9a08bec0c..c48aa4d32 100644 --- a/lib/livestatus/hoststable.hpp +++ b/lib/livestatus/hoststable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/i2-livestatus.hpp b/lib/livestatus/i2-livestatus.hpp index 7e7acf1fe..f9e905edb 100644 --- a/lib/livestatus/i2-livestatus.hpp +++ b/lib/livestatus/i2-livestatus.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/invavgaggregator.cpp b/lib/livestatus/invavgaggregator.cpp index 82ed69f70..e144b2b1b 100644 --- a/lib/livestatus/invavgaggregator.cpp +++ b/lib/livestatus/invavgaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/invavgaggregator.hpp b/lib/livestatus/invavgaggregator.hpp index d8e43d6aa..99e7ddfc0 100644 --- a/lib/livestatus/invavgaggregator.hpp +++ b/lib/livestatus/invavgaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/invsumaggregator.cpp b/lib/livestatus/invsumaggregator.cpp index dc6eac69c..aa5a94195 100644 --- a/lib/livestatus/invsumaggregator.cpp +++ b/lib/livestatus/invsumaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/invsumaggregator.hpp b/lib/livestatus/invsumaggregator.hpp index 709928fd1..ae6a5f69e 100644 --- a/lib/livestatus/invsumaggregator.hpp +++ b/lib/livestatus/invsumaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatuslistener.cpp b/lib/livestatus/livestatuslistener.cpp index 31cdebf4c..a591d3ecc 100644 --- a/lib/livestatus/livestatuslistener.cpp +++ b/lib/livestatus/livestatuslistener.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatuslistener.hpp b/lib/livestatus/livestatuslistener.hpp index 56fd96c65..0e1df4c4c 100644 --- a/lib/livestatus/livestatuslistener.hpp +++ b/lib/livestatus/livestatuslistener.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatuslogutility.cpp b/lib/livestatus/livestatuslogutility.cpp index 91db16253..edb3a8875 100644 --- a/lib/livestatus/livestatuslogutility.cpp +++ b/lib/livestatus/livestatuslogutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatuslogutility.hpp b/lib/livestatus/livestatuslogutility.hpp index c2d934433..2056506bc 100644 --- a/lib/livestatus/livestatuslogutility.hpp +++ b/lib/livestatus/livestatuslogutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatusquery.cpp b/lib/livestatus/livestatusquery.cpp index 376176918..4e2fe2786 100644 --- a/lib/livestatus/livestatusquery.cpp +++ b/lib/livestatus/livestatusquery.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatusquery.hpp b/lib/livestatus/livestatusquery.hpp index d8583eb40..d232ef15e 100644 --- a/lib/livestatus/livestatusquery.hpp +++ b/lib/livestatus/livestatusquery.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/logtable.cpp b/lib/livestatus/logtable.cpp index 034dbb770..ea446d716 100644 --- a/lib/livestatus/logtable.cpp +++ b/lib/livestatus/logtable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/logtable.hpp b/lib/livestatus/logtable.hpp index aab3e1f0e..08a698e61 100644 --- a/lib/livestatus/logtable.hpp +++ b/lib/livestatus/logtable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/maxaggregator.cpp b/lib/livestatus/maxaggregator.cpp index a2265430b..9251c6cc7 100644 --- a/lib/livestatus/maxaggregator.cpp +++ b/lib/livestatus/maxaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/maxaggregator.hpp b/lib/livestatus/maxaggregator.hpp index 3207159f1..16d1a9145 100644 --- a/lib/livestatus/maxaggregator.hpp +++ b/lib/livestatus/maxaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/minaggregator.cpp b/lib/livestatus/minaggregator.cpp index bf4390230..85625fc75 100644 --- a/lib/livestatus/minaggregator.cpp +++ b/lib/livestatus/minaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/minaggregator.hpp b/lib/livestatus/minaggregator.hpp index 76be4d10e..ce473b4a1 100644 --- a/lib/livestatus/minaggregator.hpp +++ b/lib/livestatus/minaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/negatefilter.cpp b/lib/livestatus/negatefilter.cpp index 8a8f341c6..12a111085 100644 --- a/lib/livestatus/negatefilter.cpp +++ b/lib/livestatus/negatefilter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/negatefilter.hpp b/lib/livestatus/negatefilter.hpp index 4a88f35e4..55ce5292c 100644 --- a/lib/livestatus/negatefilter.hpp +++ b/lib/livestatus/negatefilter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/orfilter.cpp b/lib/livestatus/orfilter.cpp index 14da7b7a2..00813a55e 100644 --- a/lib/livestatus/orfilter.cpp +++ b/lib/livestatus/orfilter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/orfilter.hpp b/lib/livestatus/orfilter.hpp index d37f2e09f..561424b4b 100644 --- a/lib/livestatus/orfilter.hpp +++ b/lib/livestatus/orfilter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/servicegroupstable.cpp b/lib/livestatus/servicegroupstable.cpp index 1d98bfd50..38b0db161 100644 --- a/lib/livestatus/servicegroupstable.cpp +++ b/lib/livestatus/servicegroupstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/servicegroupstable.hpp b/lib/livestatus/servicegroupstable.hpp index 4f97f8a4e..3e34a0b73 100644 --- a/lib/livestatus/servicegroupstable.hpp +++ b/lib/livestatus/servicegroupstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/servicestable.cpp b/lib/livestatus/servicestable.cpp index dce09bf57..a6faba6a9 100644 --- a/lib/livestatus/servicestable.cpp +++ b/lib/livestatus/servicestable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/servicestable.hpp b/lib/livestatus/servicestable.hpp index 17ff49a3a..5304d0362 100644 --- a/lib/livestatus/servicestable.hpp +++ b/lib/livestatus/servicestable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/statehisttable.cpp b/lib/livestatus/statehisttable.cpp index bb402580c..a4ab5eaea 100644 --- a/lib/livestatus/statehisttable.cpp +++ b/lib/livestatus/statehisttable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/statehisttable.hpp b/lib/livestatus/statehisttable.hpp index 5ef4027e7..544a87140 100644 --- a/lib/livestatus/statehisttable.hpp +++ b/lib/livestatus/statehisttable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/statustable.cpp b/lib/livestatus/statustable.cpp index ec0b62103..d532a3ec7 100644 --- a/lib/livestatus/statustable.cpp +++ b/lib/livestatus/statustable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/statustable.hpp b/lib/livestatus/statustable.hpp index 9edc9e3b8..4b104c242 100644 --- a/lib/livestatus/statustable.hpp +++ b/lib/livestatus/statustable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/stdaggregator.cpp b/lib/livestatus/stdaggregator.cpp index 8d3876e02..080eb82e8 100644 --- a/lib/livestatus/stdaggregator.cpp +++ b/lib/livestatus/stdaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/stdaggregator.hpp b/lib/livestatus/stdaggregator.hpp index e7b0509eb..52f77368e 100644 --- a/lib/livestatus/stdaggregator.hpp +++ b/lib/livestatus/stdaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/sumaggregator.cpp b/lib/livestatus/sumaggregator.cpp index 50d124f05..9166a4961 100644 --- a/lib/livestatus/sumaggregator.cpp +++ b/lib/livestatus/sumaggregator.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/sumaggregator.hpp b/lib/livestatus/sumaggregator.hpp index 030d15761..c62f67bf9 100644 --- a/lib/livestatus/sumaggregator.hpp +++ b/lib/livestatus/sumaggregator.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/table.cpp b/lib/livestatus/table.cpp index c1990f274..6ff3761ce 100644 --- a/lib/livestatus/table.cpp +++ b/lib/livestatus/table.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/table.hpp b/lib/livestatus/table.hpp index 5a3094e05..f5286a51d 100644 --- a/lib/livestatus/table.hpp +++ b/lib/livestatus/table.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/timeperiodstable.cpp b/lib/livestatus/timeperiodstable.cpp index bb1329511..d3cd44001 100644 --- a/lib/livestatus/timeperiodstable.cpp +++ b/lib/livestatus/timeperiodstable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/timeperiodstable.hpp b/lib/livestatus/timeperiodstable.hpp index ee05cc4e3..69e4b1e40 100644 --- a/lib/livestatus/timeperiodstable.hpp +++ b/lib/livestatus/timeperiodstable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/zonestable.cpp b/lib/livestatus/zonestable.cpp index b755862be..12b489a23 100644 --- a/lib/livestatus/zonestable.cpp +++ b/lib/livestatus/zonestable.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/zonestable.hpp b/lib/livestatus/zonestable.hpp index 7c223da48..614cabbd5 100644 --- a/lib/livestatus/zonestable.hpp +++ b/lib/livestatus/zonestable.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/clusterchecktask.cpp b/lib/methods/clusterchecktask.cpp index da51f5343..d33f9ae75 100644 --- a/lib/methods/clusterchecktask.cpp +++ b/lib/methods/clusterchecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/clusterchecktask.hpp b/lib/methods/clusterchecktask.hpp index ecdf5d6db..c07815054 100644 --- a/lib/methods/clusterchecktask.hpp +++ b/lib/methods/clusterchecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 67ce5f85b..925e4c7e7 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/clusterzonechecktask.hpp b/lib/methods/clusterzonechecktask.hpp index d3c2f392b..c2d936088 100644 --- a/lib/methods/clusterzonechecktask.hpp +++ b/lib/methods/clusterzonechecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/dummychecktask.cpp b/lib/methods/dummychecktask.cpp index 85985f367..b045c09d8 100644 --- a/lib/methods/dummychecktask.cpp +++ b/lib/methods/dummychecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/dummychecktask.hpp b/lib/methods/dummychecktask.hpp index 83fd476cf..ebaa44121 100644 --- a/lib/methods/dummychecktask.hpp +++ b/lib/methods/dummychecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/exceptionchecktask.cpp b/lib/methods/exceptionchecktask.cpp index e68a66aa8..7fbd41d0b 100644 --- a/lib/methods/exceptionchecktask.cpp +++ b/lib/methods/exceptionchecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/exceptionchecktask.hpp b/lib/methods/exceptionchecktask.hpp index 99fc0a5c2..bace374a8 100644 --- a/lib/methods/exceptionchecktask.hpp +++ b/lib/methods/exceptionchecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/i2-methods.hpp b/lib/methods/i2-methods.hpp index e3543bb04..0bf5b4ae2 100644 --- a/lib/methods/i2-methods.hpp +++ b/lib/methods/i2-methods.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 0f10739a7..0c85de6d4 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/icingachecktask.hpp b/lib/methods/icingachecktask.hpp index 24f9f232f..d1da5ab6d 100644 --- a/lib/methods/icingachecktask.hpp +++ b/lib/methods/icingachecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/nullchecktask.cpp b/lib/methods/nullchecktask.cpp index c141decfe..d1d57240b 100644 --- a/lib/methods/nullchecktask.cpp +++ b/lib/methods/nullchecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/nullchecktask.hpp b/lib/methods/nullchecktask.hpp index cf41c3e75..0d7029a7a 100644 --- a/lib/methods/nullchecktask.hpp +++ b/lib/methods/nullchecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/nulleventtask.cpp b/lib/methods/nulleventtask.cpp index e5a80ed76..dc2feb250 100644 --- a/lib/methods/nulleventtask.cpp +++ b/lib/methods/nulleventtask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/nulleventtask.hpp b/lib/methods/nulleventtask.hpp index aac040a6f..171a34631 100644 --- a/lib/methods/nulleventtask.hpp +++ b/lib/methods/nulleventtask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index 31fcc658a..9672d4de0 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/pluginchecktask.hpp b/lib/methods/pluginchecktask.hpp index 19c10b4ff..8eab5f99c 100644 --- a/lib/methods/pluginchecktask.hpp +++ b/lib/methods/pluginchecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index 550d159d1..59f78df9c 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/plugineventtask.hpp b/lib/methods/plugineventtask.hpp index 0739bd13f..2ddc2732f 100644 --- a/lib/methods/plugineventtask.hpp +++ b/lib/methods/plugineventtask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index 6bf75e75d..5faf650b3 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/pluginnotificationtask.hpp b/lib/methods/pluginnotificationtask.hpp index 3fe7db757..98b69c064 100644 --- a/lib/methods/pluginnotificationtask.hpp +++ b/lib/methods/pluginnotificationtask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/randomchecktask.cpp b/lib/methods/randomchecktask.cpp index 25b3b593a..615a848a3 100644 --- a/lib/methods/randomchecktask.cpp +++ b/lib/methods/randomchecktask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/randomchecktask.hpp b/lib/methods/randomchecktask.hpp index 29b67cda3..05e2e78f5 100644 --- a/lib/methods/randomchecktask.hpp +++ b/lib/methods/randomchecktask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/timeperiodtask.cpp b/lib/methods/timeperiodtask.cpp index ccd7bc979..cd76c80f3 100644 --- a/lib/methods/timeperiodtask.cpp +++ b/lib/methods/timeperiodtask.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/timeperiodtask.hpp b/lib/methods/timeperiodtask.hpp index 2bfe7eac4..e44c14e24 100644 --- a/lib/methods/timeperiodtask.hpp +++ b/lib/methods/timeperiodtask.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/mysql_shim/mysqlinterface.cpp b/lib/mysql_shim/mysqlinterface.cpp index b9d9af1ab..54188b6eb 100644 --- a/lib/mysql_shim/mysqlinterface.cpp +++ b/lib/mysql_shim/mysqlinterface.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/mysql_shim/mysqlinterface.hpp b/lib/mysql_shim/mysqlinterface.hpp index dc2b3f109..b70c5519f 100644 --- a/lib/mysql_shim/mysqlinterface.hpp +++ b/lib/mysql_shim/mysqlinterface.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index bbe6ad480..4b638c62d 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/notification/notificationcomponent.hpp b/lib/notification/notificationcomponent.hpp index 39bb220f2..e03972cb2 100644 --- a/lib/notification/notificationcomponent.hpp +++ b/lib/notification/notificationcomponent.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index c10baf12d..40581eafb 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -49,6 +49,15 @@ void ElasticsearchWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("ElasticsearchWriter, " + GetName()); + + if (!GetEnableHa()) { + Log(LogDebug, "ElasticsearchWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } } void ElasticsearchWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) diff --git a/lib/perfdata/elasticsearchwriter.hpp b/lib/perfdata/elasticsearchwriter.hpp index e28ad4a7c..a22552ad6 100644 --- a/lib/perfdata/elasticsearchwriter.hpp +++ b/lib/perfdata/elasticsearchwriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index 2bbdd9d6a..39e4c5628 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -37,6 +37,10 @@ class ElasticsearchWriter : ConfigObject [config] int flush_threshold { default {{{ return 1024; }}} }; + + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } diff --git a/lib/perfdata/gelfwriter.cpp b/lib/perfdata/gelfwriter.cpp index e6b43e09f..78e15ff77 100644 --- a/lib/perfdata/gelfwriter.cpp +++ b/lib/perfdata/gelfwriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp index 0948ecdd7..4e27a3c92 100644 --- a/lib/perfdata/gelfwriter.hpp +++ b/lib/perfdata/gelfwriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index d878cf953..d58e2c53b 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index 86a517f96..48a2f4203 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 27dd69831..437fe542a 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp index 4d3e8037a..109e3a872 100644 --- a/lib/perfdata/influxdbwriter.hpp +++ b/lib/perfdata/influxdbwriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/opentsdbwriter.cpp b/lib/perfdata/opentsdbwriter.cpp index c55529ffa..1099f4449 100644 --- a/lib/perfdata/opentsdbwriter.cpp +++ b/lib/perfdata/opentsdbwriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/opentsdbwriter.hpp b/lib/perfdata/opentsdbwriter.hpp index f368918e6..4d40387dd 100644 --- a/lib/perfdata/opentsdbwriter.hpp +++ b/lib/perfdata/opentsdbwriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/perfdatawriter.cpp b/lib/perfdata/perfdatawriter.cpp index 0d2f979be..a00dc45d7 100644 --- a/lib/perfdata/perfdatawriter.cpp +++ b/lib/perfdata/perfdatawriter.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/perfdatawriter.hpp b/lib/perfdata/perfdatawriter.hpp index 3e0306950..10fe7a2dd 100644 --- a/lib/perfdata/perfdatawriter.hpp +++ b/lib/perfdata/perfdatawriter.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/pgsql_shim/pgsqlinterface.cpp b/lib/pgsql_shim/pgsqlinterface.cpp index b5b3ef351..659ec9019 100644 --- a/lib/pgsql_shim/pgsqlinterface.cpp +++ b/lib/pgsql_shim/pgsqlinterface.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/pgsql_shim/pgsqlinterface.hpp b/lib/pgsql_shim/pgsqlinterface.hpp index 49148080b..78fee5fb9 100644 --- a/lib/pgsql_shim/pgsqlinterface.hpp +++ b/lib/pgsql_shim/pgsqlinterface.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/actionshandler.cpp b/lib/remote/actionshandler.cpp index be95ce6c8..bff0826cc 100644 --- a/lib/remote/actionshandler.cpp +++ b/lib/remote/actionshandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/actionshandler.hpp b/lib/remote/actionshandler.hpp index dd5ab9032..ad210c8c0 100644 --- a/lib/remote/actionshandler.hpp +++ b/lib/remote/actionshandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiaction.cpp b/lib/remote/apiaction.cpp index a2ad15737..d3f643724 100644 --- a/lib/remote/apiaction.cpp +++ b/lib/remote/apiaction.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiaction.hpp b/lib/remote/apiaction.hpp index 96f8b4480..d3c9fbbec 100644 --- a/lib/remote/apiaction.hpp +++ b/lib/remote/apiaction.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiclient.cpp b/lib/remote/apiclient.cpp index 6e507b029..793bd1547 100644 --- a/lib/remote/apiclient.cpp +++ b/lib/remote/apiclient.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiclient.hpp b/lib/remote/apiclient.hpp index c6814c02b..c058142b1 100644 --- a/lib/remote/apiclient.hpp +++ b/lib/remote/apiclient.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apifunction.cpp b/lib/remote/apifunction.cpp index b549bef29..057cef3ff 100644 --- a/lib/remote/apifunction.cpp +++ b/lib/remote/apifunction.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apifunction.hpp b/lib/remote/apifunction.hpp index 8e41040ab..08a6b432c 100644 --- a/lib/remote/apifunction.hpp +++ b/lib/remote/apifunction.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index 361cb2790..1cac5b39e 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener-filesync.cpp b/lib/remote/apilistener-filesync.cpp index 5d3c1ddb9..efb2a59e6 100644 --- a/lib/remote/apilistener-filesync.cpp +++ b/lib/remote/apilistener-filesync.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 7691c4ddc..dcaf85218 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 3a24133e7..60c2ab016 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index d7b40d13e..346aadbef 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiuser.hpp b/lib/remote/apiuser.hpp index 15b1c41e3..7f01dba48 100644 --- a/lib/remote/apiuser.hpp +++ b/lib/remote/apiuser.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/authority.cpp b/lib/remote/authority.cpp index 0be53b156..1c4ffe38f 100644 --- a/lib/remote/authority.cpp +++ b/lib/remote/authority.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configfileshandler.cpp b/lib/remote/configfileshandler.cpp index 49703ae00..2ad6c1f0a 100644 --- a/lib/remote/configfileshandler.cpp +++ b/lib/remote/configfileshandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configfileshandler.hpp b/lib/remote/configfileshandler.hpp index 8551aeb9d..01a18cc4d 100644 --- a/lib/remote/configfileshandler.hpp +++ b/lib/remote/configfileshandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index 7feb9e84f..1fc8dcb92 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configobjectutility.hpp b/lib/remote/configobjectutility.hpp index 472af3c83..fc17ec8f4 100644 --- a/lib/remote/configobjectutility.hpp +++ b/lib/remote/configobjectutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configpackageshandler.cpp b/lib/remote/configpackageshandler.cpp index 8ad25d0cb..c474d633e 100644 --- a/lib/remote/configpackageshandler.cpp +++ b/lib/remote/configpackageshandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configpackageshandler.hpp b/lib/remote/configpackageshandler.hpp index 4663fbf18..9ed2d2016 100644 --- a/lib/remote/configpackageshandler.hpp +++ b/lib/remote/configpackageshandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 607185491..3b15724d3 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configpackageutility.hpp b/lib/remote/configpackageutility.hpp index bea1a5a51..71cbdbea3 100644 --- a/lib/remote/configpackageutility.hpp +++ b/lib/remote/configpackageutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configstageshandler.cpp b/lib/remote/configstageshandler.cpp index 673e134a9..ead546c0c 100644 --- a/lib/remote/configstageshandler.cpp +++ b/lib/remote/configstageshandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/configstageshandler.hpp b/lib/remote/configstageshandler.hpp index 159856e51..124af87e2 100644 --- a/lib/remote/configstageshandler.hpp +++ b/lib/remote/configstageshandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index 22b49d4b7..b834b2d52 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/consolehandler.hpp b/lib/remote/consolehandler.hpp index 762cb83d4..b5e838f50 100644 --- a/lib/remote/consolehandler.hpp +++ b/lib/remote/consolehandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/createobjecthandler.cpp b/lib/remote/createobjecthandler.cpp index a365ed664..174b6dd88 100644 --- a/lib/remote/createobjecthandler.cpp +++ b/lib/remote/createobjecthandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/createobjecthandler.hpp b/lib/remote/createobjecthandler.hpp index 12dc12377..9926e10bf 100644 --- a/lib/remote/createobjecthandler.hpp +++ b/lib/remote/createobjecthandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/deleteobjecthandler.cpp b/lib/remote/deleteobjecthandler.cpp index 0d4053df3..684c180ba 100644 --- a/lib/remote/deleteobjecthandler.cpp +++ b/lib/remote/deleteobjecthandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/deleteobjecthandler.hpp b/lib/remote/deleteobjecthandler.hpp index 77e68ea5b..665cf1ba8 100644 --- a/lib/remote/deleteobjecthandler.hpp +++ b/lib/remote/deleteobjecthandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp index 2b2fb655b..1d5cf2943 100644 --- a/lib/remote/endpoint.cpp +++ b/lib/remote/endpoint.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/endpoint.hpp b/lib/remote/endpoint.hpp index 41aea0270..79c7b493f 100644 --- a/lib/remote/endpoint.hpp +++ b/lib/remote/endpoint.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/eventqueue.cpp b/lib/remote/eventqueue.cpp index 5f3b01a2f..d72451771 100644 --- a/lib/remote/eventqueue.cpp +++ b/lib/remote/eventqueue.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/eventqueue.hpp b/lib/remote/eventqueue.hpp index 56fe23c6f..aaec04ec7 100644 --- a/lib/remote/eventqueue.hpp +++ b/lib/remote/eventqueue.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index bfdca28dc..a076bc458 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/eventshandler.hpp b/lib/remote/eventshandler.hpp index 0e89972e9..2d00ff530 100644 --- a/lib/remote/eventshandler.hpp +++ b/lib/remote/eventshandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/filterutility.cpp b/lib/remote/filterutility.cpp index df3ca54da..cf6cb9ed4 100644 --- a/lib/remote/filterutility.cpp +++ b/lib/remote/filterutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/filterutility.hpp b/lib/remote/filterutility.hpp index e2c69dfc3..d9ccb3ba6 100644 --- a/lib/remote/filterutility.hpp +++ b/lib/remote/filterutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpchunkedencoding.cpp b/lib/remote/httpchunkedencoding.cpp index 9981749c2..6ae9e3852 100644 --- a/lib/remote/httpchunkedencoding.cpp +++ b/lib/remote/httpchunkedencoding.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpchunkedencoding.hpp b/lib/remote/httpchunkedencoding.hpp index c0a658c99..fd22fbfe4 100644 --- a/lib/remote/httpchunkedencoding.hpp +++ b/lib/remote/httpchunkedencoding.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpclientconnection.cpp b/lib/remote/httpclientconnection.cpp index 28d6e50fa..3fde14abf 100644 --- a/lib/remote/httpclientconnection.cpp +++ b/lib/remote/httpclientconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpclientconnection.hpp b/lib/remote/httpclientconnection.hpp index 752c40c22..dd6a2b5ec 100644 --- a/lib/remote/httpclientconnection.hpp +++ b/lib/remote/httpclientconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httphandler.cpp b/lib/remote/httphandler.cpp index e8fa64427..2d30c402f 100644 --- a/lib/remote/httphandler.cpp +++ b/lib/remote/httphandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httphandler.hpp b/lib/remote/httphandler.hpp index c06c4030b..e88fee700 100644 --- a/lib/remote/httphandler.hpp +++ b/lib/remote/httphandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httprequest.cpp b/lib/remote/httprequest.cpp index 4ba9aad69..f422a44a8 100644 --- a/lib/remote/httprequest.cpp +++ b/lib/remote/httprequest.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httprequest.hpp b/lib/remote/httprequest.hpp index 14e0677cd..ffdcb1c7e 100644 --- a/lib/remote/httprequest.hpp +++ b/lib/remote/httprequest.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index cfe99d608..fe67052c9 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpresponse.hpp b/lib/remote/httpresponse.hpp index 5021bbbde..5bd29a2f0 100644 --- a/lib/remote/httpresponse.hpp +++ b/lib/remote/httpresponse.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 337673a69..81ea16b95 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index 7712ad66d..9e6c7edb3 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 1647c46aa..5231e7ee9 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/httputility.hpp b/lib/remote/httputility.hpp index 2bc3690d8..a797f8907 100644 --- a/lib/remote/httputility.hpp +++ b/lib/remote/httputility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/i2-remote.hpp b/lib/remote/i2-remote.hpp index 292e8f2e0..4e76bee72 100644 --- a/lib/remote/i2-remote.hpp +++ b/lib/remote/i2-remote.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp index 5336c84cf..0d0020d84 100644 --- a/lib/remote/infohandler.cpp +++ b/lib/remote/infohandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/infohandler.hpp b/lib/remote/infohandler.hpp index f99eab5c8..7a5eae0e7 100644 --- a/lib/remote/infohandler.hpp +++ b/lib/remote/infohandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpc.cpp b/lib/remote/jsonrpc.cpp index 710d184aa..f446cbc31 100644 --- a/lib/remote/jsonrpc.cpp +++ b/lib/remote/jsonrpc.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpc.hpp b/lib/remote/jsonrpc.hpp index e7d2a05ea..81bd77449 100644 --- a/lib/remote/jsonrpc.hpp +++ b/lib/remote/jsonrpc.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpcconnection-heartbeat.cpp b/lib/remote/jsonrpcconnection-heartbeat.cpp index 12b0d0c53..f93884d59 100644 --- a/lib/remote/jsonrpcconnection-heartbeat.cpp +++ b/lib/remote/jsonrpcconnection-heartbeat.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpcconnection-pki.cpp b/lib/remote/jsonrpcconnection-pki.cpp index 6c867400c..f0ec8fe1b 100644 --- a/lib/remote/jsonrpcconnection-pki.cpp +++ b/lib/remote/jsonrpcconnection-pki.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 3733cdb45..099d28723 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/jsonrpcconnection.hpp b/lib/remote/jsonrpcconnection.hpp index db97f6fee..48c1dcef1 100644 --- a/lib/remote/jsonrpcconnection.hpp +++ b/lib/remote/jsonrpcconnection.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/messageorigin.cpp b/lib/remote/messageorigin.cpp index 184038497..04b7ee072 100644 --- a/lib/remote/messageorigin.cpp +++ b/lib/remote/messageorigin.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/messageorigin.hpp b/lib/remote/messageorigin.hpp index 71be262fe..61fd4c264 100644 --- a/lib/remote/messageorigin.hpp +++ b/lib/remote/messageorigin.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/modifyobjecthandler.cpp b/lib/remote/modifyobjecthandler.cpp index c08d1dee2..f787b354b 100644 --- a/lib/remote/modifyobjecthandler.cpp +++ b/lib/remote/modifyobjecthandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/modifyobjecthandler.hpp b/lib/remote/modifyobjecthandler.hpp index c5583ac44..cbfc55a59 100644 --- a/lib/remote/modifyobjecthandler.hpp +++ b/lib/remote/modifyobjecthandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/objectqueryhandler.cpp b/lib/remote/objectqueryhandler.cpp index 490b50dad..6e87afa2a 100644 --- a/lib/remote/objectqueryhandler.cpp +++ b/lib/remote/objectqueryhandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/objectqueryhandler.hpp b/lib/remote/objectqueryhandler.hpp index acefdb63b..52e669640 100644 --- a/lib/remote/objectqueryhandler.hpp +++ b/lib/remote/objectqueryhandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/pkiutility.cpp b/lib/remote/pkiutility.cpp index 915b3ee2e..3e514cc4a 100644 --- a/lib/remote/pkiutility.cpp +++ b/lib/remote/pkiutility.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/pkiutility.hpp b/lib/remote/pkiutility.hpp index 8ddd20037..6fb6119fd 100644 --- a/lib/remote/pkiutility.hpp +++ b/lib/remote/pkiutility.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/statushandler.cpp b/lib/remote/statushandler.cpp index 7ef59ed68..173425ced 100644 --- a/lib/remote/statushandler.cpp +++ b/lib/remote/statushandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/statushandler.hpp b/lib/remote/statushandler.hpp index 7dfa8380e..ef991864a 100644 --- a/lib/remote/statushandler.hpp +++ b/lib/remote/statushandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/templatequeryhandler.cpp b/lib/remote/templatequeryhandler.cpp index 153c887e5..75cf907a1 100644 --- a/lib/remote/templatequeryhandler.cpp +++ b/lib/remote/templatequeryhandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/templatequeryhandler.hpp b/lib/remote/templatequeryhandler.hpp index a70188b2a..114f5879f 100644 --- a/lib/remote/templatequeryhandler.hpp +++ b/lib/remote/templatequeryhandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/typequeryhandler.cpp b/lib/remote/typequeryhandler.cpp index fe4703f60..4b293f38b 100644 --- a/lib/remote/typequeryhandler.cpp +++ b/lib/remote/typequeryhandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/typequeryhandler.hpp b/lib/remote/typequeryhandler.hpp index 11e533efd..6019432ad 100644 --- a/lib/remote/typequeryhandler.hpp +++ b/lib/remote/typequeryhandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/url-characters.hpp b/lib/remote/url-characters.hpp index 5e1c722b0..5f799926b 100644 --- a/lib/remote/url-characters.hpp +++ b/lib/remote/url-characters.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/url.cpp b/lib/remote/url.cpp index f6c84ece1..ed79fe3b4 100644 --- a/lib/remote/url.cpp +++ b/lib/remote/url.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/url.hpp b/lib/remote/url.hpp index 20386980c..d25b5607c 100644 --- a/lib/remote/url.hpp +++ b/lib/remote/url.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/variablequeryhandler.cpp b/lib/remote/variablequeryhandler.cpp index 04cc254b9..f9c66247c 100644 --- a/lib/remote/variablequeryhandler.cpp +++ b/lib/remote/variablequeryhandler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/variablequeryhandler.hpp b/lib/remote/variablequeryhandler.hpp index 6ce4dacc1..a9ccc1a1b 100644 --- a/lib/remote/variablequeryhandler.hpp +++ b/lib/remote/variablequeryhandler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index e2b6d3a9b..55503aa71 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/zone.hpp b/lib/remote/zone.hpp index 8573131c5..0b041d85d 100644 --- a/lib/remote/zone.hpp +++ b/lib/remote/zone.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_disk.cpp b/plugins/check_disk.cpp index c6bd9cdd3..91c40d0c2 100644 --- a/plugins/check_disk.cpp +++ b/plugins/check_disk.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_load.cpp b/plugins/check_load.cpp index 44a99a456..83c8cc9e2 100644 --- a/plugins/check_load.cpp +++ b/plugins/check_load.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index 2d723b487..e8cb8aae9 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_network.cpp b/plugins/check_network.cpp index e0c464139..db0bb1970 100644 --- a/plugins/check_network.cpp +++ b/plugins/check_network.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_nscp_api.cpp b/plugins/check_nscp_api.cpp index 1fd12209e..f48c63ab8 100644 --- a/plugins/check_nscp_api.cpp +++ b/plugins/check_nscp_api.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_perfmon.cpp b/plugins/check_perfmon.cpp index ad3c8bcc5..e9d44cf55 100644 --- a/plugins/check_perfmon.cpp +++ b/plugins/check_perfmon.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_ping.cpp b/plugins/check_ping.cpp index 18aa1f046..872ea1638 100644 --- a/plugins/check_ping.cpp +++ b/plugins/check_ping.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_procs.cpp b/plugins/check_procs.cpp index ee7fd3261..0fa38e44c 100644 --- a/plugins/check_procs.cpp +++ b/plugins/check_procs.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_service.cpp b/plugins/check_service.cpp index 93e0a58a2..0543518ce 100644 --- a/plugins/check_service.cpp +++ b/plugins/check_service.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 4c3a1deb0..7f6db013a 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_update.cpp b/plugins/check_update.cpp index 3543400c0..d7efe2931 100644 --- a/plugins/check_update.cpp +++ b/plugins/check_update.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_uptime.cpp b/plugins/check_uptime.cpp index 2e5997e8c..8f47214be 100644 --- a/plugins/check_uptime.cpp +++ b/plugins/check_uptime.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/check_users.cpp b/plugins/check_users.cpp index 83ab5d05d..5fb0a74f0 100644 --- a/plugins/check_users.cpp +++ b/plugins/check_users.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index 87a19e5a3..f32e6d360 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index 9fa11abbc..8348306f2 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-array.cpp b/test/base-array.cpp index 74bbd692c..258693d37 100644 --- a/test/base-array.cpp +++ b/test/base-array.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-base64.cpp b/test/base-base64.cpp index eb9c2af01..ef988c618 100644 --- a/test/base-base64.cpp +++ b/test/base-base64.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-convert.cpp b/test/base-convert.cpp index 5f32cc392..26919b61f 100644 --- a/test/base-convert.cpp +++ b/test/base-convert.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-dictionary.cpp b/test/base-dictionary.cpp index 92146c879..1eb5a1b7e 100644 --- a/test/base-dictionary.cpp +++ b/test/base-dictionary.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-fifo.cpp b/test/base-fifo.cpp index eb67cdda4..63ad15883 100644 --- a/test/base-fifo.cpp +++ b/test/base-fifo.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-json.cpp b/test/base-json.cpp index e7054c776..5d22f2901 100644 --- a/test/base-json.cpp +++ b/test/base-json.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-match.cpp b/test/base-match.cpp index 5c3b44dfc..87df138e2 100644 --- a/test/base-match.cpp +++ b/test/base-match.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-netstring.cpp b/test/base-netstring.cpp index 8e477fcc0..a4ad1a1af 100644 --- a/test/base-netstring.cpp +++ b/test/base-netstring.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-object-packer.cpp b/test/base-object-packer.cpp index 62a09e72c..8eae53382 100644 --- a/test/base-object-packer.cpp +++ b/test/base-object-packer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-object.cpp b/test/base-object.cpp index e81c5bb38..6d17cc4de 100644 --- a/test/base-object.cpp +++ b/test/base-object.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-serialize.cpp b/test/base-serialize.cpp index 7f7d21523..6733fdf8f 100644 --- a/test/base-serialize.cpp +++ b/test/base-serialize.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-shellescape.cpp b/test/base-shellescape.cpp index 51754465c..d2e9a21f2 100644 --- a/test/base-shellescape.cpp +++ b/test/base-shellescape.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-stacktrace.cpp b/test/base-stacktrace.cpp index cad4903c9..085f1650d 100644 --- a/test/base-stacktrace.cpp +++ b/test/base-stacktrace.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-stream.cpp b/test/base-stream.cpp index 79d70a850..2d495e063 100644 --- a/test/base-stream.cpp +++ b/test/base-stream.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-string.cpp b/test/base-string.cpp index 5d790bbcb..c84496731 100644 --- a/test/base-string.cpp +++ b/test/base-string.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-timer.cpp b/test/base-timer.cpp index 2cbd519b2..48d20e381 100644 --- a/test/base-timer.cpp +++ b/test/base-timer.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-type.cpp b/test/base-type.cpp index 9013f9f7c..301ed5c29 100644 --- a/test/base-type.cpp +++ b/test/base-type.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/base-value.cpp b/test/base-value.cpp index f47f37d84..1692797fd 100644 --- a/test/base-value.cpp +++ b/test/base-value.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/config-ops.cpp b/test/config-ops.cpp index c47ab0305..c4adaf414 100644 --- a/test/config-ops.cpp +++ b/test/config-ops.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-checkresult.cpp b/test/icinga-checkresult.cpp index fb024ce31..0e85e6643 100644 --- a/test/icinga-checkresult.cpp +++ b/test/icinga-checkresult.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-macros.cpp b/test/icinga-macros.cpp index 94f067600..0c4391ebc 100644 --- a/test/icinga-macros.cpp +++ b/test/icinga-macros.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-notification.cpp b/test/icinga-notification.cpp index 09373a952..4beafd20e 100644 --- a/test/icinga-notification.cpp +++ b/test/icinga-notification.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-perfdata.cpp b/test/icinga-perfdata.cpp index bdd5ca281..ae859d48a 100644 --- a/test/icinga-perfdata.cpp +++ b/test/icinga-perfdata.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icingaapplication-fixture.cpp b/test/icingaapplication-fixture.cpp index bb3b1c710..a4893d521 100644 --- a/test/icingaapplication-fixture.cpp +++ b/test/icingaapplication-fixture.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * +* Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icingaapplication-fixture.hpp b/test/icingaapplication-fixture.hpp index d79836b8b..ac6c63134 100644 --- a/test/icingaapplication-fixture.hpp +++ b/test/icingaapplication-fixture.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * +* Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/livestatus-fixture.cpp b/test/livestatus-fixture.cpp index c016ffe95..c9fc74db7 100644 --- a/test/livestatus-fixture.cpp +++ b/test/livestatus-fixture.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/livestatus.cpp b/test/livestatus.cpp index bb74ffc30..da3b7fc38 100644 --- a/test/livestatus.cpp +++ b/test/livestatus.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/remote-url.cpp b/test/remote-url.cpp index 60df7c130..19e5ffe06 100644 --- a/test/remote-url.cpp +++ b/test/remote-url.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/test-runner.cpp b/test/test-runner.cpp index 4ed6aa30a..461001c33 100644 --- a/test/test-runner.cpp +++ b/test/test-runner.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * +* Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkclass/classcompiler.cpp b/tools/mkclass/classcompiler.cpp index 0e1ee8954..ce9a2f1ca 100644 --- a/tools/mkclass/classcompiler.cpp +++ b/tools/mkclass/classcompiler.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkclass/classcompiler.hpp b/tools/mkclass/classcompiler.hpp index e2124645d..5aa2ebc71 100644 --- a/tools/mkclass/classcompiler.hpp +++ b/tools/mkclass/classcompiler.hpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkclass/mkclass.cpp b/tools/mkclass/mkclass.cpp index 4fb3d177b..869a67366 100644 --- a/tools/mkclass/mkclass.cpp +++ b/tools/mkclass/mkclass.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * From a036bda601da566d7cdde4ee3b9e37bd220dc970 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:29:29 +0200 Subject: [PATCH 0248/1162] icinga.com: Update '*.h' --- third-party/execvpe/execvpe.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third-party/execvpe/execvpe.h b/third-party/execvpe/execvpe.h index c2230cad7..5a0e269af 100644 --- a/third-party/execvpe/execvpe.h +++ b/third-party/execvpe/execvpe.h @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * From 44c3b83769e8df874cbad8388bed4591146a5d81 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:30:00 +0200 Subject: [PATCH 0249/1162] icinga.com: Update '*.ti' --- lib/base/application.ti | 2 +- lib/base/configobject.ti | 2 +- lib/base/configuration.ti | 2 +- lib/base/datetime.ti | 2 +- lib/base/filelogger.ti | 2 +- lib/base/function.ti | 2 +- lib/base/logger.ti | 2 +- lib/base/perfdatavalue.ti | 2 +- lib/base/streamlogger.ti | 2 +- lib/base/sysloglogger.ti | 2 +- lib/checker/checkercomponent.ti | 2 +- lib/compat/checkresultreader.ti | 2 +- lib/compat/compatlogger.ti | 2 +- lib/compat/externalcommandlistener.ti | 2 +- lib/compat/statusdatawriter.ti | 2 +- lib/db_ido/dbconnection.ti | 2 +- lib/db_ido_mysql/idomysqlconnection.ti | 2 +- lib/db_ido_pgsql/idopgsqlconnection.ti | 2 +- lib/icinga/checkable.ti | 2 +- lib/icinga/checkcommand.ti | 2 +- lib/icinga/checkresult.ti | 2 +- lib/icinga/command.ti | 2 +- lib/icinga/comment.ti | 2 +- lib/icinga/customvarobject.ti | 2 +- lib/icinga/dependency.ti | 2 +- lib/icinga/downtime.ti | 2 +- lib/icinga/eventcommand.ti | 2 +- lib/icinga/host.ti | 2 +- lib/icinga/hostgroup.ti | 2 +- lib/icinga/icingaapplication.ti | 2 +- lib/icinga/notification.ti | 2 +- lib/icinga/notificationcommand.ti | 2 +- lib/icinga/scheduleddowntime.ti | 2 +- lib/icinga/service.ti | 2 +- lib/icinga/servicegroup.ti | 2 +- lib/icinga/timeperiod.ti | 2 +- lib/icinga/user.ti | 2 +- lib/icinga/usergroup.ti | 2 +- lib/livestatus/livestatuslistener.ti | 2 +- lib/notification/notificationcomponent.ti | 2 +- lib/perfdata/gelfwriter.ti | 2 +- lib/perfdata/graphitewriter.ti | 2 +- lib/perfdata/influxdbwriter.ti | 2 +- lib/perfdata/opentsdbwriter.ti | 2 +- lib/perfdata/perfdatawriter.ti | 2 +- lib/remote/apilistener.ti | 2 +- lib/remote/apiuser.ti | 2 +- lib/remote/endpoint.ti | 2 +- lib/remote/zone.ti | 2 +- 49 files changed, 49 insertions(+), 49 deletions(-) diff --git a/lib/base/application.ti b/lib/base/application.ti index a1dcd964f..fb6309574 100644 --- a/lib/base/application.ti +++ b/lib/base/application.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configobject.ti b/lib/base/configobject.ti index 7a010b1ab..60e651231 100644 --- a/lib/base/configobject.ti +++ b/lib/base/configobject.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti index b15d5b21e..22f121411 100644 --- a/lib/base/configuration.ti +++ b/lib/base/configuration.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/datetime.ti b/lib/base/datetime.ti index d2e7351e0..789bfac08 100644 --- a/lib/base/datetime.ti +++ b/lib/base/datetime.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/filelogger.ti b/lib/base/filelogger.ti index f19b7c9d6..7bc29f1dd 100644 --- a/lib/base/filelogger.ti +++ b/lib/base/filelogger.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/function.ti b/lib/base/function.ti index c8a1d529a..0f4c2eea8 100644 --- a/lib/base/function.ti +++ b/lib/base/function.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/logger.ti b/lib/base/logger.ti index faff9f936..d2ff595da 100644 --- a/lib/base/logger.ti +++ b/lib/base/logger.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/perfdatavalue.ti b/lib/base/perfdatavalue.ti index f234df2b1..194682382 100644 --- a/lib/base/perfdatavalue.ti +++ b/lib/base/perfdatavalue.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/streamlogger.ti b/lib/base/streamlogger.ti index 750c9f689..3585dccb2 100644 --- a/lib/base/streamlogger.ti +++ b/lib/base/streamlogger.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/base/sysloglogger.ti b/lib/base/sysloglogger.ti index 9ca92d637..b7dd7343c 100644 --- a/lib/base/sysloglogger.ti +++ b/lib/base/sysloglogger.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/checker/checkercomponent.ti b/lib/checker/checkercomponent.ti index d6a76c9df..9663bb189 100644 --- a/lib/checker/checkercomponent.ti +++ b/lib/checker/checkercomponent.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/checkresultreader.ti b/lib/compat/checkresultreader.ti index 1f97c22fd..86b5ca701 100644 --- a/lib/compat/checkresultreader.ti +++ b/lib/compat/checkresultreader.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/compatlogger.ti b/lib/compat/compatlogger.ti index 0ea63ad1d..e6192f5b5 100644 --- a/lib/compat/compatlogger.ti +++ b/lib/compat/compatlogger.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/externalcommandlistener.ti b/lib/compat/externalcommandlistener.ti index 8ff99a5d3..3ba8d3220 100644 --- a/lib/compat/externalcommandlistener.ti +++ b/lib/compat/externalcommandlistener.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/compat/statusdatawriter.ti b/lib/compat/statusdatawriter.ti index db81940ed..346540003 100644 --- a/lib/compat/statusdatawriter.ti +++ b/lib/compat/statusdatawriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/dbconnection.ti b/lib/db_ido/dbconnection.ti index 2f6e60d02..2200ee1a1 100644 --- a/lib/db_ido/dbconnection.ti +++ b/lib/db_ido/dbconnection.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_mysql/idomysqlconnection.ti b/lib/db_ido_mysql/idomysqlconnection.ti index 8a70d5668..ed84d09fa 100644 --- a/lib/db_ido_mysql/idomysqlconnection.ti +++ b/lib/db_ido_mysql/idomysqlconnection.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido_pgsql/idopgsqlconnection.ti b/lib/db_ido_pgsql/idopgsqlconnection.ti index ef7cf6ccb..d2b539203 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.ti +++ b/lib/db_ido_pgsql/idopgsqlconnection.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index d9918e7f8..d6a65a834 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkcommand.ti b/lib/icinga/checkcommand.ti index bcc29526d..85275c8f2 100644 --- a/lib/icinga/checkcommand.ti +++ b/lib/icinga/checkcommand.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/checkresult.ti b/lib/icinga/checkresult.ti index f95a4ed64..91fcd894d 100644 --- a/lib/icinga/checkresult.ti +++ b/lib/icinga/checkresult.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/command.ti b/lib/icinga/command.ti index 64b7482a8..4f72e3569 100644 --- a/lib/icinga/command.ti +++ b/lib/icinga/command.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/comment.ti b/lib/icinga/comment.ti index 003fe0ff5..5baee7453 100644 --- a/lib/icinga/comment.ti +++ b/lib/icinga/comment.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/customvarobject.ti b/lib/icinga/customvarobject.ti index 949c36498..4231a01fe 100644 --- a/lib/icinga/customvarobject.ti +++ b/lib/icinga/customvarobject.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/dependency.ti b/lib/icinga/dependency.ti index 66c215bda..e43701c9a 100644 --- a/lib/icinga/dependency.ti +++ b/lib/icinga/dependency.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index 0cbc6738a..17c8cfe91 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/eventcommand.ti b/lib/icinga/eventcommand.ti index 10ee9d532..c4eee11d0 100644 --- a/lib/icinga/eventcommand.ti +++ b/lib/icinga/eventcommand.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/host.ti b/lib/icinga/host.ti index 04fc8f90f..9736d459c 100644 --- a/lib/icinga/host.ti +++ b/lib/icinga/host.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/hostgroup.ti b/lib/icinga/hostgroup.ti index 3ef1d0b91..f8ad91070 100644 --- a/lib/icinga/hostgroup.ti +++ b/lib/icinga/hostgroup.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/icingaapplication.ti b/lib/icinga/icingaapplication.ti index b9f0381b3..dd4e060b1 100644 --- a/lib/icinga/icingaapplication.ti +++ b/lib/icinga/icingaapplication.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notification.ti b/lib/icinga/notification.ti index d11f1b377..8cae58072 100644 --- a/lib/icinga/notification.ti +++ b/lib/icinga/notification.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/notificationcommand.ti b/lib/icinga/notificationcommand.ti index 3749c0613..cf7b29c98 100644 --- a/lib/icinga/notificationcommand.ti +++ b/lib/icinga/notificationcommand.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/scheduleddowntime.ti b/lib/icinga/scheduleddowntime.ti index e2d2aca30..27195d21f 100644 --- a/lib/icinga/scheduleddowntime.ti +++ b/lib/icinga/scheduleddowntime.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/service.ti b/lib/icinga/service.ti index 0d30978ca..73e041b3f 100644 --- a/lib/icinga/service.ti +++ b/lib/icinga/service.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/servicegroup.ti b/lib/icinga/servicegroup.ti index 1111c4b35..4fea8d87b 100644 --- a/lib/icinga/servicegroup.ti +++ b/lib/icinga/servicegroup.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/timeperiod.ti b/lib/icinga/timeperiod.ti index f7e2576f4..362432cea 100644 --- a/lib/icinga/timeperiod.ti +++ b/lib/icinga/timeperiod.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/user.ti b/lib/icinga/user.ti index 74034a212..cca3c936a 100644 --- a/lib/icinga/user.ti +++ b/lib/icinga/user.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/usergroup.ti b/lib/icinga/usergroup.ti index d51b5e7e1..ccb03e65c 100644 --- a/lib/icinga/usergroup.ti +++ b/lib/icinga/usergroup.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/livestatus/livestatuslistener.ti b/lib/livestatus/livestatuslistener.ti index 5c886176e..13e41fde0 100644 --- a/lib/livestatus/livestatuslistener.ti +++ b/lib/livestatus/livestatuslistener.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/notification/notificationcomponent.ti b/lib/notification/notificationcomponent.ti index 547528d1e..840667fb8 100644 --- a/lib/notification/notificationcomponent.ti +++ b/lib/notification/notificationcomponent.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/gelfwriter.ti b/lib/perfdata/gelfwriter.ti index facc94a6d..6382541bb 100644 --- a/lib/perfdata/gelfwriter.ti +++ b/lib/perfdata/gelfwriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/graphitewriter.ti b/lib/perfdata/graphitewriter.ti index ca04959f5..dfe62a14b 100644 --- a/lib/perfdata/graphitewriter.ti +++ b/lib/perfdata/graphitewriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/influxdbwriter.ti b/lib/perfdata/influxdbwriter.ti index 5ff116754..58962d5b5 100644 --- a/lib/perfdata/influxdbwriter.ti +++ b/lib/perfdata/influxdbwriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/opentsdbwriter.ti b/lib/perfdata/opentsdbwriter.ti index ea9455b9e..fbec3a491 100644 --- a/lib/perfdata/opentsdbwriter.ti +++ b/lib/perfdata/opentsdbwriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index ab0a2b6d6..8381c6c9e 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index 7d0b018d5..f10014fb7 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apiuser.ti b/lib/remote/apiuser.ti index 36ec98704..16fa2402d 100644 --- a/lib/remote/apiuser.ti +++ b/lib/remote/apiuser.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/endpoint.ti b/lib/remote/endpoint.ti index 079782053..035866fc7 100644 --- a/lib/remote/endpoint.ti +++ b/lib/remote/endpoint.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/zone.ti b/lib/remote/zone.ti index 638858036..5d6172cf3 100644 --- a/lib/remote/zone.ti +++ b/lib/remote/zone.ti @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * From e6f404ec4adf1a2cdcd7133c1645703a6a9ce31e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:32:14 +0200 Subject: [PATCH 0250/1162] icinga.com: Update docs for /community/get-involved -> /community --- doc/01-about.md | 2 +- doc/04-configuring-icinga-2.md | 2 +- doc/05-service-monitoring.md | 2 +- doc/06-distributed-monitoring.md | 6 +++--- doc/13-addons.md | 2 +- doc/21-development.md | 2 +- doc/22-selinux.md | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/01-about.md b/doc/01-about.md index 6397100fe..efd65b67e 100644 --- a/doc/01-about.md +++ b/doc/01-about.md @@ -18,7 +18,7 @@ LICENSE file included in the source package. ## Support Check the project website at [icinga.com](https://www.icinga.com) for status updates. Join the -[community channels](https://www.icinga.com/community/get-involved/) for questions +[community channels](https://icinga.com/community/) for questions or ask an Icinga partner for [professional support](https://www.icinga.com/services/support/). ## Contribute diff --git a/doc/04-configuring-icinga-2.md b/doc/04-configuring-icinga-2.md index 61e920126..4d8770ced 100644 --- a/doc/04-configuring-icinga-2.md +++ b/doc/04-configuring-icinga-2.md @@ -66,7 +66,7 @@ There is a detailed chapter on [distributed monitoring scenarios](06-distributed Please ensure to have read the [introduction](06-distributed-monitoring.md#distributed-monitoring) at first glance. If you happen to have further questions, do not hesitate to join the -[community support channels](https://www.icinga.com/community/get-involved/) +[community support channels](https://icinga.com/community/) and ask community members for their experience and best practices. ## Your Configuration diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index 004bf4581..2ee74e0e9 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -93,7 +93,7 @@ For further information on your monitoring configuration read the [Monitoring Basics](03-monitoring-basics.md#monitoring-basics) chapter. If you have created your own `CheckCommand` definition, please kindly -[send it upstream](https://www.icinga.com/community/get-involved/). +[send it upstream](https://icinga.com/community/). ### Plugin API diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 8bd68d9ff..fa1bcdb67 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -1215,7 +1215,7 @@ If you are eager to start fresh instead you might take a look into the The following examples should give you an idea on how to build your own distributed monitoring environment. We've seen them all in production -environments and received feedback from our [community](https://www.icinga.com/community/get-involved/) +environments and received feedback from our [community](https://icinga.com/community/) and [partner support](https://www.icinga.com/services/support/) channels: * Single master with clients. @@ -1989,7 +1989,7 @@ to make sure that your cluster notifies you in case of failure. ## Best Practice We've put together a collection of configuration examples from community feedback. -If you like to share your tips and tricks with us, please join the [community channels](https://www.icinga.com/community/get-involved/)! +If you like to share your tips and tricks with us, please join the [community channels](https://icinga.com/community/)! ### Global Zone for Config Sync @@ -2666,7 +2666,7 @@ These are collected best practices from various community channels. If you prefer an alternate method, we still recommend leaving all the Icinga 2 features intact (e.g. `icinga2 feature enable api`). You should also use well known and documented default configuration file locations (e.g. `zones.conf`). -This will tremendously help when someone is trying to help in the [community channels](https://www.icinga.com/community/get-involved/). +This will tremendously help when someone is trying to help in the [community channels](https://icinga.com/community/). ### Silent Windows Setup diff --git a/doc/13-addons.md b/doc/13-addons.md index 1d26de747..7a7e81d22 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -131,7 +131,7 @@ touch with their developers. The Icinga project does not provide a configuration yet. Follow the [Icinga Blog](https://www.icinga.com/blog/) for updates on this topic. If you're looking for puppet manifests, chef cookbooks, ansible recipes, etc. -- we're happy -to integrate them upstream, so please get in touch with the [Icinga team](https://www.icinga.com/community/get-involved/). +to integrate them upstream, so please get in touch with the [Icinga team](https://icinga.com/community/). These tools are currently in development and require feedback and tests: diff --git a/doc/21-development.md b/doc/21-development.md index 4565fd94b..c7e54878d 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -167,7 +167,7 @@ running Icinga 2. (gdb) handle SIGPIPE nostop noprint pass (gdb) r -If you create a [bug report](https://www.icinga.com/community/get-involved/), +If you create a [bug report](https://icinga.com/community/), make sure to attach as much detail as possible. ### GDB Backtrace from Running Process diff --git a/doc/22-selinux.md b/doc/22-selinux.md index 0e442ecf3..9801553cc 100644 --- a/doc/22-selinux.md +++ b/doc/22-selinux.md @@ -231,7 +231,7 @@ If you experience any problems while running in enforcing mode try to reproduce After some feedback Icinga 2 is now running in a enforced domain, but still adds also some rules for other necessary services so no problems should occure at all. But you can help to enhance the policy by testing Icinga 2 running confined by SELinux. -Please add the following information to [bug reports](https://www.icinga.com/community/get-involved/): +Please add the following information to [bug reports](https://icinga.com/community/): * Versions, configuration snippets, etc. * Output of `semodule -l | grep -e icinga2 -e nagios -e apache` From dea5ec614e09b00d2c529ce834cb1a60e28837b0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:35:18 +0200 Subject: [PATCH 0251/1162] icinga.com: Update CMakeLists.txt --- CMakeLists.txt | 2 +- agent/CMakeLists.txt | 2 +- choco/CMakeLists.txt | 2 +- doc/CMakeLists.txt | 2 +- doc/update-links.py | 2 +- etc/CMakeLists.txt | 2 +- etc/initsystem/CMakeLists.txt | 2 +- icinga-app/CMakeLists.txt | 2 +- icinga-installer/CMakeLists.txt | 2 +- itl/CMakeLists.txt | 2 +- itl/plugins-contrib.d/CMakeLists.txt | 2 +- lib/CMakeLists.txt | 2 +- lib/base/CMakeLists.txt | 2 +- lib/checker/CMakeLists.txt | 2 +- lib/cli/CMakeLists.txt | 2 +- lib/compat/CMakeLists.txt | 2 +- lib/config/CMakeLists.txt | 2 +- lib/db_ido/CMakeLists.txt | 2 +- lib/db_ido_mysql/CMakeLists.txt | 2 +- lib/db_ido_pgsql/CMakeLists.txt | 2 +- lib/icinga/CMakeLists.txt | 2 +- lib/livestatus/CMakeLists.txt | 2 +- lib/methods/CMakeLists.txt | 2 +- lib/mysql_shim/CMakeLists.txt | 2 +- lib/notification/CMakeLists.txt | 2 +- lib/perfdata/CMakeLists.txt | 2 +- lib/pgsql_shim/CMakeLists.txt | 2 +- lib/remote/CMakeLists.txt | 2 +- plugins/CMakeLists.txt | 2 +- test/CMakeLists.txt | 2 +- third-party/CMakeLists.txt | 2 +- third-party/execvpe/CMakeLists.txt | 2 +- third-party/mmatch/CMakeLists.txt | 2 +- third-party/socketpair/CMakeLists.txt | 2 +- tools/CMakeLists.txt | 2 +- tools/mkclass/CMakeLists.txt | 2 +- tools/mkembedconfig/CMakeLists.txt | 2 +- tools/mkunity/CMakeLists.txt | 2 +- 38 files changed, 38 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1af131836..9c3664291 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/agent/CMakeLists.txt b/agent/CMakeLists.txt index 98885c62b..d59d31d2d 100644 --- a/agent/CMakeLists.txt +++ b/agent/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/choco/CMakeLists.txt b/choco/CMakeLists.txt index 21a7cf028..7460dddee 100644 --- a/choco/CMakeLists.txt +++ b/choco/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index bbd924b31..ac07bfcb6 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/doc/update-links.py b/doc/update-links.py index 24bfcde58..e569b0d84 100755 --- a/doc/update-links.py +++ b/doc/update-links.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt index 4c967cc43..08e5bcec8 100644 --- a/etc/CMakeLists.txt +++ b/etc/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/etc/initsystem/CMakeLists.txt b/etc/initsystem/CMakeLists.txt index dd57ab1a0..e702c839a 100644 --- a/etc/initsystem/CMakeLists.txt +++ b/etc/initsystem/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/icinga-app/CMakeLists.txt b/icinga-app/CMakeLists.txt index 49286776d..87993df4c 100644 --- a/icinga-app/CMakeLists.txt +++ b/icinga-app/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt index 6e51928a4..06aa843ab 100644 --- a/icinga-installer/CMakeLists.txt +++ b/icinga-installer/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/itl/CMakeLists.txt b/itl/CMakeLists.txt index 6d70ad9f1..a67ff65d8 100644 --- a/itl/CMakeLists.txt +++ b/itl/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/itl/plugins-contrib.d/CMakeLists.txt b/itl/plugins-contrib.d/CMakeLists.txt index 360836414..cda1c7999 100644 --- a/itl/plugins-contrib.d/CMakeLists.txt +++ b/itl/plugins-contrib.d/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 67ad4afee..8c0fe2cfb 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 9988d8e70..5dda17939 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/checker/CMakeLists.txt b/lib/checker/CMakeLists.txt index 65bca61bb..c983b2b17 100644 --- a/lib/checker/CMakeLists.txt +++ b/lib/checker/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/cli/CMakeLists.txt b/lib/cli/CMakeLists.txt index 258597dec..1fac5a474 100644 --- a/lib/cli/CMakeLists.txt +++ b/lib/cli/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/compat/CMakeLists.txt b/lib/compat/CMakeLists.txt index be33add0b..1438626d4 100644 --- a/lib/compat/CMakeLists.txt +++ b/lib/compat/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/config/CMakeLists.txt b/lib/config/CMakeLists.txt index 471384cbb..fa136479c 100644 --- a/lib/config/CMakeLists.txt +++ b/lib/config/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/db_ido/CMakeLists.txt b/lib/db_ido/CMakeLists.txt index 6b94a7b9d..2a63f3e0a 100644 --- a/lib/db_ido/CMakeLists.txt +++ b/lib/db_ido/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/db_ido_mysql/CMakeLists.txt b/lib/db_ido_mysql/CMakeLists.txt index 30e180f65..5ac948649 100644 --- a/lib/db_ido_mysql/CMakeLists.txt +++ b/lib/db_ido_mysql/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/db_ido_pgsql/CMakeLists.txt b/lib/db_ido_pgsql/CMakeLists.txt index b34736e66..1e61786be 100644 --- a/lib/db_ido_pgsql/CMakeLists.txt +++ b/lib/db_ido_pgsql/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/icinga/CMakeLists.txt b/lib/icinga/CMakeLists.txt index 6f9f14d7e..5eef7e0d3 100644 --- a/lib/icinga/CMakeLists.txt +++ b/lib/icinga/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/livestatus/CMakeLists.txt b/lib/livestatus/CMakeLists.txt index 9b657645f..14267272e 100644 --- a/lib/livestatus/CMakeLists.txt +++ b/lib/livestatus/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/methods/CMakeLists.txt b/lib/methods/CMakeLists.txt index 353189369..b7e1f5fe9 100644 --- a/lib/methods/CMakeLists.txt +++ b/lib/methods/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/mysql_shim/CMakeLists.txt b/lib/mysql_shim/CMakeLists.txt index 1bc2db28f..c6d99d52f 100644 --- a/lib/mysql_shim/CMakeLists.txt +++ b/lib/mysql_shim/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/notification/CMakeLists.txt b/lib/notification/CMakeLists.txt index 91207ad6d..2a30d9205 100644 --- a/lib/notification/CMakeLists.txt +++ b/lib/notification/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/perfdata/CMakeLists.txt b/lib/perfdata/CMakeLists.txt index 06a9f7336..ab963f7dc 100644 --- a/lib/perfdata/CMakeLists.txt +++ b/lib/perfdata/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/pgsql_shim/CMakeLists.txt b/lib/pgsql_shim/CMakeLists.txt index 35f4c5cc4..0f4b22e6c 100644 --- a/lib/pgsql_shim/CMakeLists.txt +++ b/lib/pgsql_shim/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/remote/CMakeLists.txt b/lib/remote/CMakeLists.txt index 61b6523ff..65113d231 100644 --- a/lib/remote/CMakeLists.txt +++ b/lib/remote/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index c908a89e4..4e4fe6bb9 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index df291e6dc..766d15a2e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 7ccccb5f9..3873dde7a 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/third-party/execvpe/CMakeLists.txt b/third-party/execvpe/CMakeLists.txt index 4be31bc1b..318072ec9 100644 --- a/third-party/execvpe/CMakeLists.txt +++ b/third-party/execvpe/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/third-party/mmatch/CMakeLists.txt b/third-party/mmatch/CMakeLists.txt index 70bb6f1c2..75d85eda0 100644 --- a/third-party/mmatch/CMakeLists.txt +++ b/third-party/mmatch/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/third-party/socketpair/CMakeLists.txt b/third-party/socketpair/CMakeLists.txt index 18f9dba79..a5e51cf8f 100644 --- a/third-party/socketpair/CMakeLists.txt +++ b/third-party/socketpair/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index b9867123e..60cbfb608 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/tools/mkclass/CMakeLists.txt b/tools/mkclass/CMakeLists.txt index 2e9c52812..682d94002 100644 --- a/tools/mkclass/CMakeLists.txt +++ b/tools/mkclass/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/tools/mkembedconfig/CMakeLists.txt b/tools/mkembedconfig/CMakeLists.txt index 4884ec0bd..5ff942b2a 100644 --- a/tools/mkembedconfig/CMakeLists.txt +++ b/tools/mkembedconfig/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/tools/mkunity/CMakeLists.txt b/tools/mkunity/CMakeLists.txt index 1a9ceb5a3..6356c2ce0 100644 --- a/tools/mkunity/CMakeLists.txt +++ b/tools/mkunity/CMakeLists.txt @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License From eabea68c563a30ef5cbaac0ec83e5a6436a93141 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:36:22 +0200 Subject: [PATCH 0252/1162] icinga.com: Update config files (ITL, etc.) --- itl/command-icinga.conf | 2 +- itl/command-nscp-local.conf | 2 +- itl/command-plugins-manubulon.conf | 2 +- itl/command-plugins-windows.conf | 2 +- itl/command-plugins.conf | 2 +- itl/hangman | 2 +- itl/itl | 2 +- itl/manubulon | 2 +- itl/nscp | 2 +- itl/plugins | 2 +- itl/plugins-contrib | 2 +- itl/plugins-contrib.d/big-data.conf | 2 +- itl/plugins-contrib.d/databases.conf | 2 +- itl/plugins-contrib.d/hardware.conf | 2 +- itl/plugins-contrib.d/icingacli.conf | 2 +- itl/plugins-contrib.d/ipmi.conf | 2 +- itl/plugins-contrib.d/logmanagement.conf | 2 +- itl/plugins-contrib.d/metrics.conf | 2 +- itl/plugins-contrib.d/network-components.conf | 2 +- itl/plugins-contrib.d/network-services.conf | 2 +- itl/plugins-contrib.d/operating-system.conf | 2 +- itl/plugins-contrib.d/storage.conf | 2 +- itl/plugins-contrib.d/virtualization.conf | 2 +- itl/plugins-contrib.d/vmware.conf | 2 +- itl/plugins-contrib.d/web.conf | 2 +- itl/windows-plugins | 2 +- lib/db_ido/db_ido-itl.conf | 2 +- lib/icinga/icinga-itl.conf | 2 +- lib/methods/methods-itl.conf | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/itl/command-icinga.conf b/itl/command-icinga.conf index 4141b9030..29ca06082 100644 --- a/itl/command-icinga.conf +++ b/itl/command-icinga.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/command-nscp-local.conf b/itl/command-nscp-local.conf index ca69ea2f2..3e134adc0 100644 --- a/itl/command-nscp-local.conf +++ b/itl/command-nscp-local.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index 910a4ceae..ce9cfa1a4 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/command-plugins-windows.conf b/itl/command-plugins-windows.conf index eddee07fd..12ec154d7 100644 --- a/itl/command-plugins-windows.conf +++ b/itl/command-plugins-windows.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 89308e913..8868b0456 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/hangman b/itl/hangman index 48cd177d7..336796945 100644 --- a/itl/hangman +++ b/itl/hangman @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/itl b/itl/itl index 340633ca6..519e367c7 100644 --- a/itl/itl +++ b/itl/itl @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/manubulon b/itl/manubulon index 094f1836e..635037750 100644 --- a/itl/manubulon +++ b/itl/manubulon @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/nscp b/itl/nscp index 49283f323..c191c4163 100644 --- a/itl/nscp +++ b/itl/nscp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins b/itl/plugins index d142acdc9..b2367de06 100644 --- a/itl/plugins +++ b/itl/plugins @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib b/itl/plugins-contrib index 9857a63ce..dd1fe4dde 100644 --- a/itl/plugins-contrib +++ b/itl/plugins-contrib @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/big-data.conf b/itl/plugins-contrib.d/big-data.conf index dc448009a..5d757e282 100644 --- a/itl/plugins-contrib.d/big-data.conf +++ b/itl/plugins-contrib.d/big-data.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index 23397ba49..c12475d19 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/hardware.conf b/itl/plugins-contrib.d/hardware.conf index ae7c3f9ba..e88b611d2 100644 --- a/itl/plugins-contrib.d/hardware.conf +++ b/itl/plugins-contrib.d/hardware.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/icingacli.conf b/itl/plugins-contrib.d/icingacli.conf index 056b84ae7..1d27ab2ca 100644 --- a/itl/plugins-contrib.d/icingacli.conf +++ b/itl/plugins-contrib.d/icingacli.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/ipmi.conf b/itl/plugins-contrib.d/ipmi.conf index 95570406a..f5eb18ae0 100644 --- a/itl/plugins-contrib.d/ipmi.conf +++ b/itl/plugins-contrib.d/ipmi.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/logmanagement.conf b/itl/plugins-contrib.d/logmanagement.conf index 6e1a910a9..4b5c5a9a4 100644 --- a/itl/plugins-contrib.d/logmanagement.conf +++ b/itl/plugins-contrib.d/logmanagement.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/metrics.conf b/itl/plugins-contrib.d/metrics.conf index 180aa93c6..76b3a8eff 100644 --- a/itl/plugins-contrib.d/metrics.conf +++ b/itl/plugins-contrib.d/metrics.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/network-components.conf b/itl/plugins-contrib.d/network-components.conf index e34175952..53cadba29 100644 --- a/itl/plugins-contrib.d/network-components.conf +++ b/itl/plugins-contrib.d/network-components.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/network-services.conf b/itl/plugins-contrib.d/network-services.conf index 31a9c84a0..0e1420d5b 100644 --- a/itl/plugins-contrib.d/network-services.conf +++ b/itl/plugins-contrib.d/network-services.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/operating-system.conf b/itl/plugins-contrib.d/operating-system.conf index c58332c98..1ebfadfe0 100644 --- a/itl/plugins-contrib.d/operating-system.conf +++ b/itl/plugins-contrib.d/operating-system.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index b47e8af72..3e413e0ab 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/virtualization.conf b/itl/plugins-contrib.d/virtualization.conf index 7a1401c05..9c02e7545 100644 --- a/itl/plugins-contrib.d/virtualization.conf +++ b/itl/plugins-contrib.d/virtualization.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/vmware.conf b/itl/plugins-contrib.d/vmware.conf index 8e6c1061f..92abe8986 100644 --- a/itl/plugins-contrib.d/vmware.conf +++ b/itl/plugins-contrib.d/vmware.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 49bf33166..0f5daac48 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/itl/windows-plugins b/itl/windows-plugins index e95f0a1e6..dfff686b6 100644 --- a/itl/windows-plugins +++ b/itl/windows-plugins @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/db_ido/db_ido-itl.conf b/lib/db_ido/db_ido-itl.conf index ca1272a01..61a84c9f1 100644 --- a/lib/db_ido/db_ido-itl.conf +++ b/lib/db_ido/db_ido-itl.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/icinga/icinga-itl.conf b/lib/icinga/icinga-itl.conf index b734a7032..5e6546e71 100644 --- a/lib/icinga/icinga-itl.conf +++ b/lib/icinga/icinga-itl.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/methods/methods-itl.conf b/lib/methods/methods-itl.conf index 22d8fff26..caa8f9cf8 100644 --- a/lib/methods/methods-itl.conf +++ b/lib/methods/methods-itl.conf @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * From 0072a6f7d9a544b2120b03e38d0c7777563e6b51 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:39:34 +0200 Subject: [PATCH 0253/1162] icinga.com: Update icinga-app --- icinga-app/icinga.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 9dbdb3ad8..b97e79e83 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -543,7 +543,7 @@ static int Main() } if (vm.count("version")) { - std::cout << "Copyright (c) 2012-2018 Icinga Development Team (https://www.icinga.com/)" << std::endl + std::cout << "Copyright (c) 2012-2018 Icinga Development Team (https://icinga.com/)" << std::endl << "License GPLv2+: GNU GPL version 2 or later " << std::endl << "This is free software: you are free to change and redistribute it." << std::endl << "There is NO WARRANTY, to the extent permitted by law."; @@ -566,8 +566,9 @@ static int Main() std::cout << visibleDesc << std::endl << "Report bugs at " << std::endl - << "Get support: " << std::endl - << "Icinga home page: " << std::endl; + << "Get support: " << std::endl + << "Documentation: " << std::endl + << "Icinga home page: " << std::endl; return EXIT_SUCCESS; } } From a2cb542a2e9d1d97295bfb59c792e5425ce32d59 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:41:54 +0200 Subject: [PATCH 0254/1162] icinga.com: Update '*.sql' --- lib/db_ido_mysql/schema/mysql.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.0.2.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.1.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.2.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.3.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.4.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.5.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.6.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.8.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.8.1.sql | 2 +- lib/db_ido_pgsql/schema/pgsql.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.0.2.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.1.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.2.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.3.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.4.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.5.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.6.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.8.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.8.1.sql | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/db_ido_mysql/schema/mysql.sql b/lib/db_ido_mysql/schema/mysql.sql index 414acb10a..6fec218c5 100644 --- a/lib/db_ido_mysql/schema/mysql.sql +++ b/lib/db_ido_mysql/schema/mysql.sql @@ -2,7 +2,7 @@ -- mysql.sql -- DB definition for IDO MySQL -- --- Copyright (c) 2009-2018 Icinga Development Team (https://www.icinga.com/) +-- Copyright (c) 2009-2018 Icinga Development Team (https://icinga.com/) -- -- -- -------------------------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.0.2.sql b/lib/db_ido_mysql/schema/upgrade/2.0.2.sql index fb8834a22..968e1d694 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.0.2.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.0.2.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.0.2 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.1.0.sql b/lib/db_ido_mysql/schema/upgrade/2.1.0.sql index 244463829..e386da421 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.1.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.1.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.1.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.2.0.sql b/lib/db_ido_mysql/schema/upgrade/2.2.0.sql index 040c6ee3d..c0462e866 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.2.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.2.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.2.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.3.0.sql b/lib/db_ido_mysql/schema/upgrade/2.3.0.sql index 2c43d5844..27d37ff04 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.3.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.3.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.3.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.4.0.sql b/lib/db_ido_mysql/schema/upgrade/2.4.0.sql index 1064b7088..28e8ad27d 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.4.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.4.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.4.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.5.0.sql b/lib/db_ido_mysql/schema/upgrade/2.5.0.sql index 79090cf64..cd7aabb48 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.5.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.5.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.5.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.6.0.sql b/lib/db_ido_mysql/schema/upgrade/2.6.0.sql index fbf354452..672f8c9b8 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.6.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.6.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.6.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.8.0.sql b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql index db546d007..680f1b5c4 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.8.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.0 -- -- ----------------------------------------- --- Copyright (c) 2017 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2017 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.8.1.sql b/lib/db_ido_mysql/schema/upgrade/2.8.1.sql index 4bf943e10..0c558f77d 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.8.1.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.8.1.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.1 (fix for fresh 2.8.0 installation only) -- -- ----------------------------------------- --- Copyright (c) 2018 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/pgsql.sql b/lib/db_ido_pgsql/schema/pgsql.sql index d491051ed..46697ee8c 100644 --- a/lib/db_ido_pgsql/schema/pgsql.sql +++ b/lib/db_ido_pgsql/schema/pgsql.sql @@ -2,7 +2,7 @@ -- pgsql.sql -- DB definition for IDO Postgresql -- --- Copyright (c) 2009-2018 Icinga Development Team (https://www.icinga.com/) +-- Copyright (c) 2009-2018 Icinga Development Team (https://icinga.com/) -- -- -------------------------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql b/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql index 39d738650..6c6fd2126 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.0.2 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql index 8efc9cc81..6c5acfdce 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.1.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql index f9d5501a5..e3af07a3b 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.2.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql index 445deda23..aa693f273 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.3.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql index 35d8dad2f..e4b3e16c8 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.4.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql index c9d4c2f7e..db7cc246b 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.5.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql index 229e9f106..f7c3a709e 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.6.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql index cae9b6699..e11ba03ce 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.0 -- -- ----------------------------------------- --- Copyright (c) 2017 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2017 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql b/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql index 0ee92f659..ebff8fc9c 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.1 (fix for fresh 2.8.0 installation only) -- -- ----------------------------------------- --- Copyright (c) 2018 Icinga Development Team (https://www.icinga.com) +-- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- From 1a8a2c25f20d6c0534486a2a113181953850390d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:45:36 +0200 Subject: [PATCH 0255/1162] icinga.com: Update test and tools --- test/icinga-checkable-fixture.cpp | 2 +- test/icinga-checkable-flapping.cpp | 2 +- test/icinga-legacytimeperiod.cpp | 2 +- tools/mkclass/class_lexer.ll | 2 +- tools/mkclass/class_parser.yy | 2 +- tools/mkembedconfig/mkembedconfig.c | 2 +- tools/mkunity/mkunity.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/icinga-checkable-fixture.cpp b/test/icinga-checkable-fixture.cpp index 3743fd382..9ba2841ff 100644 --- a/test/icinga-checkable-fixture.cpp +++ b/test/icinga-checkable-fixture.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.org/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-checkable-flapping.cpp b/test/icinga-checkable-flapping.cpp index 256c7b517..be6ac0744 100644 --- a/test/icinga-checkable-flapping.cpp +++ b/test/icinga-checkable-flapping.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.org/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/test/icinga-legacytimeperiod.cpp b/test/icinga-legacytimeperiod.cpp index f178934c9..b40d19f61 100644 --- a/test/icinga-legacytimeperiod.cpp +++ b/test/icinga-legacytimeperiod.cpp @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.org/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkclass/class_lexer.ll b/tools/mkclass/class_lexer.ll index 19c75b626..bb4407586 100644 --- a/tools/mkclass/class_lexer.ll +++ b/tools/mkclass/class_lexer.ll @@ -1,7 +1,7 @@ %{ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkclass/class_parser.yy b/tools/mkclass/class_parser.yy index 8f14ffc9d..01af32ead 100644 --- a/tools/mkclass/class_parser.yy +++ b/tools/mkclass/class_parser.yy @@ -1,7 +1,7 @@ %{ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkembedconfig/mkembedconfig.c b/tools/mkembedconfig/mkembedconfig.c index b948e70fa..9618ccb8a 100644 --- a/tools/mkembedconfig/mkembedconfig.c +++ b/tools/mkembedconfig/mkembedconfig.c @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/tools/mkunity/mkunity.c b/tools/mkunity/mkunity.c index e7568b150..9f3069c04 100644 --- a/tools/mkunity/mkunity.c +++ b/tools/mkunity/mkunity.c @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * From 3cb2c1d1435f19bc5e46fa8f8518645f62549dde Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:50:53 +0200 Subject: [PATCH 0256/1162] icinga.com: Update everything else --- INSTALL.md | 2 +- NEWS | 2 +- README.md | 14 ++++++------- choco/icinga2.nuspec.cmake | 6 +++--- cmake/InstallConfig.cmake | 2 +- cmake/SetFullDir.cmake | 2 +- contrib/GPLHeader | 2 +- contrib/discover-api.py | 2 +- contrib/discover.py | 2 +- doc/01-about.md | 6 +++--- doc/02-getting-started.md | 4 ++-- doc/03-monitoring-basics.md | 2 +- doc/06-distributed-monitoring.md | 4 ++-- doc/11-cli-commands.md | 20 +++++++++---------- doc/12-icinga2-api.md | 2 +- doc/13-addons.md | 14 ++++++------- doc/15-troubleshooting.md | 10 +++++----- doc/16-upgrading-icinga-2.md | 4 ++-- doc/icinga2.8 | 4 ++-- etc/icinga2/scripts/mail-host-notification.sh | 2 +- .../scripts/mail-service-notification.sh | 2 +- lib/config/config_lexer.ll | 2 +- lib/config/config_parser.yy | 2 +- lib/remote/apilistener.cpp | 2 +- plugins/README.md | 2 +- tools/syntax/vim/syntax/icinga2.vim | 6 +++--- 26 files changed, 61 insertions(+), 61 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 10c3cd40a..e0573e0ec 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -7,7 +7,7 @@ of operating systems. Please check the documentation in the [doc/](doc/) directory for a current list of available packages and detailed installation instructions. -The online documentation is available on [icinga.com/docs](https://www.icinga.com/docs/) +The online documentation is available on [icinga.com/docs](https://icinga.com/docs/) and will guide you step by step. There are a number of known caveats when installing from source such as diff --git a/NEWS b/NEWS index ef80fe476..3cc501a7a 100644 --- a/NEWS +++ b/NEWS @@ -1 +1 @@ -News for this application can be found on the project website at https://www.icinga.com +News for this application can be found on the project website at https://icinga.com diff --git a/README.md b/README.md index 595af36fe..0a08c12c6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Icinga 2 -![Icinga Logo](https://www.icinga.com/wp-content/uploads/2014/06/icinga_logo.png) +![Icinga Logo](https://icinga.com/wp-content/uploads/2014/06/icinga_logo.png) #### Table of Contents @@ -21,11 +21,11 @@ network resources, notifies users of outages, and generates performance data for Scalable and extensible, Icinga 2 can monitor large, complex environments across multiple locations. -Icinga 2 as monitoring core works best with [Icinga Web 2](https://www.icinga.com/products/icinga-web-2/) +Icinga 2 as monitoring core works best with [Icinga Web 2](https://icinga.com/products/icinga-web-2/) as web interface. -More information can be found at [www.icinga.com](https://www.icinga.com/products/icinga-2/) -and inside the [documentation](https://www.icinga.com/docs/icinga2/latest/). +More information can be found at [icinga.com](https://icinga.com/products/icinga-2/) +and inside the [documentation](https://icinga.com/docs/icinga2/latest/). ## Licensing @@ -58,9 +58,9 @@ is also available on https://docs.icinga.com ## Support -Check the project website at https://www.icinga.com for status updates. Join the -[community channels](https://www.icinga.com/community) for questions -or ask an Icinga partner for [professional support](https://www.icinga.com/services/support/). +Check the project website at https://icinga.com for status updates. Join the +[community channels](https://icinga.com/community) for questions +or ask an Icinga partner for [professional support](https://icinga.com/services/support/). ## Contributing diff --git a/choco/icinga2.nuspec.cmake b/choco/icinga2.nuspec.cmake index 2fa56d64a..59af944f4 100755 --- a/choco/icinga2.nuspec.cmake +++ b/choco/icinga2.nuspec.cmake @@ -11,16 +11,16 @@ Icinga Development Team icinga2 - Monitoring Agent for Windows Icinga 2 is an open source monitoring platform which notifies users about host and service outages. - https://www.icinga.com/ + https://icinga.com/ icinga2 agent monitoring admin - https://www.icinga.com/resources/faq/ + https://icinga.com/resources/faq/ https://github.com/Icinga/icinga2/blob/master/ChangeLog https://docs.icinga.com/icinga2/ https://github.com/Icinga/icinga2/issues https://github.com/Icinga/icinga2 https://github.com/Icinga/icinga2 false - https://www.icinga.com/wp-content/uploads/2015/05/icinga_icon_128x128.png + https://icinga.com/wp-content/uploads/2015/05/icinga_icon_128x128.png diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index aa39b9dfb..3f24b39d0 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/cmake/SetFullDir.cmake b/cmake/SetFullDir.cmake index bd63a68bf..3e9e2236a 100644 --- a/cmake/SetFullDir.cmake +++ b/cmake/SetFullDir.cmake @@ -1,5 +1,5 @@ # Icinga 2 -# Copyright (C) 2018 Icinga Development Team (https://www.icinga.com) +# Copyright (C) 2018 Icinga Development Team (https://icinga.com) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/contrib/GPLHeader b/contrib/GPLHeader index 6bc8a95ba..3fd58b106 100644 --- a/contrib/GPLHeader +++ b/contrib/GPLHeader @@ -1,6 +1,6 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/contrib/discover-api.py b/contrib/discover-api.py index 9c3dd6a20..27f06e6c7 100755 --- a/contrib/discover-api.py +++ b/contrib/discover-api.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/contrib/discover.py b/contrib/discover.py index a49b62c95..2a8618a78 100755 --- a/contrib/discover.py +++ b/contrib/discover.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/doc/01-about.md b/doc/01-about.md index efd65b67e..554c077b9 100644 --- a/doc/01-about.md +++ b/doc/01-about.md @@ -17,9 +17,9 @@ LICENSE file included in the source package. ## Support -Check the project website at [icinga.com](https://www.icinga.com) for status updates. Join the +Check the project website at [icinga.com](https://icinga.com) for status updates. Join the [community channels](https://icinga.com/community/) for questions -or ask an Icinga partner for [professional support](https://www.icinga.com/services/support/). +or ask an Icinga partner for [professional support](https://icinga.com/services/support/). ## Contribute @@ -40,4 +40,4 @@ file. ## What's New The Icinga 2 Changelog is located [here](https://github.com/Icinga/icinga2/blob/master/CHANGELOG.md). -Please follow our release announcements on [icinga.com](https://www.icinga.com/blog/) too. +Please follow our release announcements on [icinga.com](https://icinga.com/blog/) too. diff --git a/doc/02-getting-started.md b/doc/02-getting-started.md index 244a797de..285544e70 100644 --- a/doc/02-getting-started.md +++ b/doc/02-getting-started.md @@ -1003,10 +1003,10 @@ rc-service icinga2 restart ### Installing Icinga Web 2 -Please consult the [installation documentation](https://www.icinga.com/docs/icingaweb2/latest/doc/02-Installation/) +Please consult the [installation documentation](https://icinga.com/docs/icingaweb2/latest/doc/02-Installation/) for further instructions on how to install Icinga Web 2. -The Icinga 2 API can be defined as [command transport](https://www.icinga.com/docs/icingaweb2/latest/modules/monitoring/doc/05-Command-Transports/) +The Icinga 2 API can be defined as [command transport](https://icinga.com/docs/icingaweb2/latest/modules/monitoring/doc/05-Command-Transports/) in Icinga Web 2 >= 2.4. ## Addons diff --git a/doc/03-monitoring-basics.md b/doc/03-monitoring-basics.md index a4775c69f..3c44b67c5 100644 --- a/doc/03-monitoring-basics.md +++ b/doc/03-monitoring-basics.md @@ -2227,7 +2227,7 @@ in the service object then. > **Note** > > Keep in mind that the values are still visible with the [debug console](11-cli-commands.md#cli-command-console) -> and the inspect mode in the [Icinga Director](https://www.icinga.com/docs/director/latest/). +> and the inspect mode in the [Icinga Director](https://icinga.com/docs/director/latest/). You can also set global environment variables in the application's sysconfig configuration file, e.g. `HOME` or specific library paths diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index fa1bcdb67..44e1ae2e3 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -1209,14 +1209,14 @@ section where you can find detailed information on extending the setup. If you are eager to start fresh instead you might take a look into the -[Icinga Director](https://www.icinga.com/docs/director/latest/). +[Icinga Director](https://icinga.com/docs/director/latest/). ## Scenarios The following examples should give you an idea on how to build your own distributed monitoring environment. We've seen them all in production environments and received feedback from our [community](https://icinga.com/community/) -and [partner support](https://www.icinga.com/services/support/) channels: +and [partner support](https://icinga.com/services/support/) channels: * Single master with clients. * HA master with clients as command endpoint. diff --git a/doc/11-cli-commands.md b/doc/11-cli-commands.md index a6a625e5f..886dff5ea 100644 --- a/doc/11-cli-commands.md +++ b/doc/11-cli-commands.md @@ -55,7 +55,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` @@ -165,7 +165,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Ca @@ -200,7 +200,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Console @@ -254,7 +254,7 @@ Command options: --sandbox enable sandbox mode Report bugs at -Icinga home page: +Icinga home page: ``` @@ -394,7 +394,7 @@ Command options: --close-stdio do not log to stdout (or stderr) after startup Report bugs at -Icinga home page: +Icinga home page: ``` ### Config Files @@ -467,7 +467,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Object @@ -509,7 +509,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Pki @@ -556,7 +556,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Troubleshoot @@ -600,7 +600,7 @@ Command options: --include-vars Print all Variables (like `variable list`) Report bugs at -Icinga home page: +Icinga home page: ``` ## CLI command: Variable @@ -633,7 +633,7 @@ Global options: -X [ --script-debugger ] whether to enable the script debugger Report bugs at -Icinga home page: +Icinga home page: ``` ## Enabling/Disabling Features diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index c26ef937d..8709438d1 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1875,7 +1875,7 @@ There are a couple of existing clients which can be used with the Icinga 2 API: * [curl](https://curl.haxx.se/) or any other HTTP client really * [Icinga 2 console (CLI command)](12-icinga2-api.md#icinga2-api-clients-cli-console) -* [Icinga Web 2 Director](https://www.icinga.com/products/icinga-web-2-modules/) +* [Icinga Web 2 Director](https://icinga.com/products/icinga-web-2-modules/) Demo cases: diff --git a/doc/13-addons.md b/doc/13-addons.md index 7a7e81d22..eaf1af858 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -102,7 +102,7 @@ is even simpler these days. * Configure the logstash `nagios` output to send passive traps to Icinga 2 using the external command pipe. * Execute a plugin to check Graylog alert streams. -More details can be found in [this blog post](https://www.icinga.com/2014/12/02/team-icinga-at-osmc-2014/). +More details can be found in [this blog post](https://icinga.com/2014/12/02/team-icinga-at-osmc-2014/). ## Notification Scripts and Interfaces @@ -116,19 +116,19 @@ There's a variety of resources available, for example different notification scr * Ticket systems * etc. -Additionally external services can be [integrated with Icinga 2](https://www.icinga.com/products/integrations/): +Additionally external services can be [integrated with Icinga 2](https://icinga.com/products/integrations/): -* [Pagerduty](https://www.icinga.com/partners/pagerduty/) -* [VictorOps](https://www.icinga.com/partners/victorops/) -* [StackStorm](https://www.icinga.com/partners/stackstorm/) +* [Pagerduty](https://icinga.com/partners/pagerduty/) +* [VictorOps](https://icinga.com/partners/victorops/) +* [StackStorm](https://icinga.com/partners/stackstorm/) -More information can be found on the [Icinga Website](https://www.icinga.com/). +More information can be found on the [Icinga Website](https://icinga.com/). ## Configuration Management Tools If you require your favourite configuration tool to export the Icinga 2 configuration, please get in touch with their developers. The Icinga project does not provide a configuration web interface -yet. Follow the [Icinga Blog](https://www.icinga.com/blog/) for updates on this topic. +yet. Follow the [Icinga Blog](https://icinga.com/blog/) for updates on this topic. If you're looking for puppet manifests, chef cookbooks, ansible recipes, etc. -- we're happy to integrate them upstream, so please get in touch with the [Icinga team](https://icinga.com/community/). diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index e4758921f..8ccfda895 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -18,8 +18,8 @@ findings and details please. * `icinga2 --version` * `icinga2 feature list` * `icinga2 daemon -C` - * [Icinga Web 2](https://www.icinga.com/products/icinga-web-2/) version (screenshot from System - About) - * [Icinga Web 2 modules](https://www.icinga.com/products/icinga-web-2-modules/) e.g. the Icinga Director (optional) + * [Icinga Web 2](https://icinga.com/products/icinga-web-2/) version (screenshot from System - About) + * [Icinga Web 2 modules](https://icinga.com/products/icinga-web-2-modules/) e.g. the Icinga Director (optional) * Configuration insights: * Provide complete configuration snippets explaining your problem in detail * Your [icinga2.conf](04-configuring-icinga-2.md#icinga2-conf) file @@ -568,7 +568,7 @@ trying because you probably have a problem that requires manual intervention. ### Late Check Results -[Icinga Web 2](https://www.icinga.com/products/icinga-web-2/) provides +[Icinga Web 2](https://icinga.com/products/icinga-web-2/) provides a dashboard overview for `overdue checks`. The REST API provides the [status](12-icinga2-api.md#icinga2-api-status) URL endpoint with some generic metrics @@ -584,7 +584,7 @@ You can also calculate late check results via the REST API: * Compare the timestamp with the current time and add `check_interval` multiple times (change it to see which results are really late, like five times check_interval) You can use the [icinga2 console](11-cli-commands.md#cli-command-console) to connect to the instance, fetch all data -and calculate the differences. More infos can be found in [this blogpost](https://www.icinga.com/2016/08/11/analyse-icinga-2-problems-using-the-console-api/). +and calculate the differences. More infos can be found in [this blogpost](https://icinga.com/2016/08/11/analyse-icinga-2-problems-using-the-console-api/). ``` # ICINGA2_API_USERNAME=root ICINGA2_API_PASSWORD=icinga icinga2 console --connect 'https://localhost:5665/' @@ -879,7 +879,7 @@ critical/config: Error: Cannot make SSL context for cert path: 'C:\ProgramData\i ``` A technical analysis and solution for re-creating the public CA certificate is -available in [this advisory](https://www.icinga.com/2017/08/30/advisory-for-ssl-problems-with-leading-zeros-on-openssl-1-1-0/). +available in [this advisory](https://icinga.com/2017/08/30/advisory-for-ssl-problems-with-leading-zeros-on-openssl-1-1-0/). ## Cluster and Clients Troubleshooting diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index bc15462bb..9809066d9 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -402,10 +402,10 @@ attributes. More details can be found [here](08-advanced-topics.md#check-flappin ## Upgrading to v2.7 v2.7.0 provided new notification scripts and commands. Please ensure to -update your configuration accordingly. An advisory has been published [here](https://www.icinga.com/2017/08/23/advisory-for-icinga-2-v2-7-update-and-mail-notification-scripts/). +update your configuration accordingly. An advisory has been published [here](https://icinga.com/2017/08/23/advisory-for-icinga-2-v2-7-update-and-mail-notification-scripts/). In case are having troubles with OpenSSL 1.1.0 and the -public CA certificates, please read [this advisory](https://www.icinga.com/2017/08/30/advisory-for-ssl-problems-with-leading-zeros-on-openssl-1-1-0/) +public CA certificates, please read [this advisory](https://icinga.com/2017/08/30/advisory-for-ssl-problems-with-leading-zeros-on-openssl-1-1-0/) and check the [troubleshooting chapter](15-troubleshooting.md#troubleshooting). If Icinga 2 fails to start with an empty reference to `$ICINGA2_CACHE_DIR` diff --git a/doc/icinga2.8 b/doc/icinga2.8 index f9ea45bb7..ca177eefd 100644 --- a/doc/icinga2.8 +++ b/doc/icinga2.8 @@ -90,9 +90,9 @@ Detach from the controlling terminal. .SH "REPORTING BUGS" Report bugs at .br -Icinga home page: +Icinga home page: .SH COPYRIGHT -Copyright \(co 2012\-2014 Icinga Development Team (https://www.icinga.com) +Copyright \(co 2012\-2014 Icinga Development Team (https://icinga.com) License GPLv2+: GNU GPL version 2 or later .br This is free software: you are free to change and redistribute it. diff --git a/etc/icinga2/scripts/mail-host-notification.sh b/etc/icinga2/scripts/mail-host-notification.sh index cecb2d754..781fee355 100755 --- a/etc/icinga2/scripts/mail-host-notification.sh +++ b/etc/icinga2/scripts/mail-host-notification.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license PROG="`basename $0`" diff --git a/etc/icinga2/scripts/mail-service-notification.sh b/etc/icinga2/scripts/mail-service-notification.sh index c53d4d022..d4a1944dc 100755 --- a/etc/icinga2/scripts/mail-service-notification.sh +++ b/etc/icinga2/scripts/mail-service-notification.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license PROG="`basename $0`" diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index 899280ff7..5fae7aabc 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -1,7 +1,7 @@ %{ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index 5db8f5598..bad5796bd 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -3,7 +3,7 @@ /****************************************************************************** * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) * + * Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index dcaf85218..504ad77e2 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -149,7 +149,7 @@ void ApiListener::OnConfigLoaded() CopyCertificateFile(oldCaPath, defaultCaPath); if (!oldCertPath.IsEmpty() && !oldKeyPath.IsEmpty() && !oldCaPath.IsEmpty()) { - Log(LogWarning, "ApiListener", "Please read the upgrading documentation for v2.8: https://www.icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/"); + Log(LogWarning, "ApiListener", "Please read the upgrading documentation for v2.8: https://icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/"); } /* set up SSL context */ diff --git a/plugins/README.md b/plugins/README.md index f524f31ab..0a34bffd8 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -34,7 +34,7 @@ A critical state always overwrites a warning state, meaning the check would be c ### License Icinga 2 -Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) +Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) This program is free software; you can redistribute it and/or modify it under the tems of the GNU General Public License diff --git a/tools/syntax/vim/syntax/icinga2.vim b/tools/syntax/vim/syntax/icinga2.vim index 33d178671..0374c7b5a 100644 --- a/tools/syntax/vim/syntax/icinga2.vim +++ b/tools/syntax/vim/syntax/icinga2.vim @@ -96,7 +96,7 @@ syn keyword icinga2ObjAttr contained timeout times tls_handshake_timeout tls_p syn keyword icinga2ObjAttr contained types update_interval user user_groups username users volatile zone syn match icinga2ObjAttr contained "\(vars.\w\+\)" -" keywords: https://www.icinga.com/docs/icinga2/latest/doc/17-language-reference/#reserved-keywords +" keywords: https://icinga.com/docs/icinga2/latest/doc/17-language-reference/#reserved-keywords syn keyword icinga2Keyword object template include include_recursive include_zones library syn keyword icinga2Keyword const var this globals locals use default ignore_on_error syn keyword icinga2Keyword current_filename current_line apply to where import assign @@ -107,7 +107,7 @@ syn keyword icinga2Keyword ignore function return in syn match icinga2AssignCond contained "\(assign[ \t]\+\where\|ignore[ \t]\+\where\)" -" Documentation reference: https://www.icinga.com/docs/icinga2/latest/doc/18-library-reference/ +" Documentation reference: https://icinga.com/docs/icinga2/latest/doc/18-library-reference/ " Global functions syn keyword icinga2GFunction contained regex match cidr_match range len union intersection keys string @@ -257,7 +257,7 @@ syn match icinga2Operators "[ \t]\+\(/=\)\+" " ### Global settings " Global constants -" https://www.icinga.com/docs/icinga2/snapshot/doc/17-language-reference/#icinga-2-specific-constants +" https://icinga.com/docs/icinga2/snapshot/doc/17-language-reference/#icinga-2-specific-constants " Path specific constants syn keyword icinga2PathConstant CacheDir ConfigDir DataDir IncludeConfDir InitRunDir LocalStateDir LogDir ModAttrPath From 12ef5c053f19c88751c4478c7b8120a8665d32ee Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 09:59:33 +0200 Subject: [PATCH 0257/1162] Docs: Use the correct URLs in various places --- doc/05-service-monitoring.md | 2 +- doc/06-distributed-monitoring.md | 2 +- doc/10-icinga-template-library.md | 2 +- doc/13-addons.md | 8 ++++---- doc/21-development.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index 2ee74e0e9..cdaa8ed1a 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -93,7 +93,7 @@ For further information on your monitoring configuration read the [Monitoring Basics](03-monitoring-basics.md#monitoring-basics) chapter. If you have created your own `CheckCommand` definition, please kindly -[send it upstream](https://icinga.com/community/). +[send it upstream](https://github.com/Icinga/icinga2/blob/master/CONTRIBUTING.md). ### Plugin API diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 44e1ae2e3..48cfd1b26 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -1216,7 +1216,7 @@ If you are eager to start fresh instead you might take a look into the The following examples should give you an idea on how to build your own distributed monitoring environment. We've seen them all in production environments and received feedback from our [community](https://icinga.com/community/) -and [partner support](https://icinga.com/services/support/) channels: +and [partner support](https://icinga.com/support/) channels: * Single master with clients. * HA master with clients as command endpoint. diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index aa38ee46f..a9a861651 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -849,7 +849,7 @@ negate_arguments | **Optional.** Arguments for the negated command. ### nrpe -The `check_nrpe` plugin can be used to query an [NRPE](https://docs.icinga.com/latest/en/nrpe.html) +The `check_nrpe` plugin can be used to query an [NRPE](https://icinga.com/docs/icinga1/latest/en/nrpe.html) server or [NSClient++](https://www.nsclient.org). **Note**: This plugin is considered insecure/deprecated. diff --git a/doc/13-addons.md b/doc/13-addons.md index eaf1af858..7c9623c4b 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -71,7 +71,7 @@ A popular frontend for InfluxDB is for example [Grafana](https://grafana.org). ### Icinga Reporting By enabling the [DB IDO](14-features.md#db-ido) feature you can use the -[Icinga Reporting package](https://docs.icinga.com/latest/en/reporting.html). +[Icinga Reporting package](https://icinga.com/docs/icinga1/latest/en/reporting.html). ### NagVis @@ -118,9 +118,9 @@ There's a variety of resources available, for example different notification scr Additionally external services can be [integrated with Icinga 2](https://icinga.com/products/integrations/): -* [Pagerduty](https://icinga.com/partners/pagerduty/) -* [VictorOps](https://icinga.com/partners/victorops/) -* [StackStorm](https://icinga.com/partners/stackstorm/) +* [Pagerduty](https://icinga.com/products/integrations/pagerduty/) +* [VictorOps](https://icinga.com/products/integrations/victorops/) +* [StackStorm](https://icinga.com/products/integrations/stackstorm/) More information can be found on the [Icinga Website](https://icinga.com/). diff --git a/doc/21-development.md b/doc/21-development.md index c7e54878d..d90d50def 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -167,7 +167,7 @@ running Icinga 2. (gdb) handle SIGPIPE nostop noprint pass (gdb) r -If you create a [bug report](https://icinga.com/community/), +If you create a [new issue](https://github.com/Icinga/icinga2/issues), make sure to attach as much detail as possible. ### GDB Backtrace from Running Process From f7be04c22ff20738fafdd31119bf00164f0233de Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 10:38:11 +0200 Subject: [PATCH 0258/1162] Enhance the addon chapter in the docs --- doc/13-addons.md | 120 ++++++++++++------ doc/images/addons/dashing_icinga2.png | Bin 0 -> 883821 bytes .../addons/icingaweb2_businessprocess.png | Bin 0 -> 181635 bytes doc/images/addons/icingaweb2_grafana.png | Bin 0 -> 573452 bytes doc/images/addons/icingaweb2_graphite.png | Bin 0 -> 252196 bytes doc/images/addons/icingaweb2_maps.png | Bin 0 -> 543265 bytes 6 files changed, 82 insertions(+), 38 deletions(-) create mode 100644 doc/images/addons/dashing_icinga2.png create mode 100644 doc/images/addons/icingaweb2_businessprocess.png create mode 100644 doc/images/addons/icingaweb2_grafana.png create mode 100644 doc/images/addons/icingaweb2_graphite.png create mode 100644 doc/images/addons/icingaweb2_maps.png diff --git a/doc/13-addons.md b/doc/13-addons.md index 7c9623c4b..f2b2986d4 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -2,6 +2,49 @@ ## Graphing +### Graphite + +[Graphite](https://graphite.readthedocs.org/en/latest/) is a time-series database +storing collected metrics and making them available through restful apis +and web interfaces. + +Graphite consists of 3 software components: + +* carbon -- a Twisted daemon that listens for time-series data +* whisper -- a simple database library for storing time-series data (similar in design to RRD) +* graphite webapp -- a Django webapp that renders graphs on-demand using Cairo + +You need to install Graphite first, then proceed with configuring it in Icinga 2. + +Use the [GraphiteWriter](14-features.md#graphite-carbon-cache-writer) feature +for sending real-time metrics from Icinga 2 to Graphite. + + # icinga2 feature enable graphite + +A popular alternative frontend for Graphite is for example [Grafana](https://grafana.org). + +Integration in Icinga Web 2 is possible by installing the official [graphite module](https://icinga.com/docs/graphite/latest/). + +![Icinga Web 2 Detail View with Graphite](images/addons/icingaweb2_graphite.png) + + +### InfluxDB + +[InfluxDB](https://influxdb.com) is a time series, metrics, and analytics database. +It’s written in Go and has no external dependencies. + +Use the [InfluxdbWriter](14-features.md#influxdb-writer) feature +for sending real-time metrics from Icinga 2 to InfluxDB. + + # icinga2 feature enable influxdb + +A popular frontend for InfluxDB is for example [Grafana](https://grafana.org). + +Integration in Icinga Web 2 is possible by installing the community [Grafana module](https://github.com/Mikesch-mp/icingaweb2-module-grafana). + +![Icinga Web 2 Detail View with Grafana](images/addons/icingaweb2_grafana.png) + + ### PNP [PNP](https://www.pnp4nagios.org) is a graphing addon. @@ -33,50 +76,46 @@ More information on [action_url as attribute](13-addons.md#addons-graphing-pnp-a and [graph template names](13-addons.md#addons-graphing-pnp-custom-templates). -### Graphite - -[Graphite](https://graphite.readthedocs.org/en/latest/) is a time-series database -storing collected metrics and making them available through restful apis -and web interfaces. - -Graphite consists of 3 software components: - -* carbon -- a Twisted daemon that listens for time-series data -* whisper -- a simple database library for storing time-series data (similar in design to RRD) -* graphite webapp -- a Django webapp that renders graphs on-demand using Cairo - -Use the [GraphiteWriter](14-features.md#graphite-carbon-cache-writer) feature -for sending real-time metrics from Icinga 2 to Graphite. - - # icinga2 feature enable graphite - -There are Graphite addons available for collecting the performance data files too (e.g. `Graphios`). - -A popular alternative frontend for Graphite is for example [Grafana](https://grafana.org). - -### InfluxDB - -[InfluxDB](https://influxdb.com) is a time series, metrics, and analytics database. -It’s written in Go and has no external dependencies. - -Use the [InfluxdbWriter](14-features.md#influxdb-writer) feature -for sending real-time metrics from Icinga 2 to InfluxDB. - - # icinga2 feature enable influxdb - -A popular frontend for InfluxDB is for example [Grafana](https://grafana.org). - ## Visualization -### Icinga Reporting +### Maps -By enabling the [DB IDO](14-features.md#db-ido) feature you can use the -[Icinga Reporting package](https://icinga.com/docs/icinga1/latest/en/reporting.html). +This community module displays host objects as markers on openstreetmap in Icinga Web 2. +It uses the data provided by the monitoring module and as such the [DB IDO](14-features.md#db-ido) +from Icinga 2. + +If you configure multiple hosts with the same coordinates, i.e. servers in a datacenter, a clustered view is rendered. + +Check the [Map module docs](https://github.com/nbuchwitz/icingaweb2-module-map) for more details on +installation, configuration and integration. + +![Icinga Web 2 Maps](images/addons/icingaweb2_maps.png) + +### Dashing Dashboard + +The [Icinga 2 dashboard](https://github.com/dnsmichi/dashing-icinga2) is built +on top of Dashing and uses the [REST API](#icinga2-api) to visualize what's going +on with your monitoring. It combines several popular widgets and provides development +instructions for your own implementation. + +The dashboard also allows to embed the [Icinga Web 2](https://icinga.com/products/icinga-web-2/) +host and service problem lists as Iframe. + +![Dashing dashboard](images/addons/dashing_icinga2.png) + +### Business Process + +Create top-level views of your applications in a graphical editor. +Rules express dependencies between existing hosts and services and +let you alert on application level. Business processes are displayed +in a tree or list overview and can be added to any dashboard. + +![Icinga Web 2 Business Process](images/addons/icingaweb2_businessprocess.png) ### NagVis -By using either [Livestatus](14-features.md#setting-up-livestatus) or -[DB IDO](14-features.md#db-ido) as a backend you can create your own network maps +By using the [DB IDO](14-features.md#db-ido) feature +you can create your own network maps based on your monitoring configuration and status data using [NagVis](https://www.nagvis.org). The configuration in nagvis.ini.php should look like this for Livestatus for example: @@ -87,6 +126,11 @@ The configuration in nagvis.ini.php should look like this for Livestatus for exa If you are planning an integration into Icinga Web 2, look at [this module](https://github.com/Icinga/icingaweb2-module-nagvis). +### Icinga Reporting + +By enabling the [DB IDO](14-features.md#db-ido) feature you can use the +[Icinga Reporting package](https://icinga.com/docs/icinga1/latest/en/reporting.html). + ### Thruk [Thruk](https://www.thruk.org) is an alternative web interface which can be used with Icinga 2 diff --git a/doc/images/addons/dashing_icinga2.png b/doc/images/addons/dashing_icinga2.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e0e42d83eee710ee486cf1692b788b61c4da07 GIT binary patch literal 883821 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

-zKof@}| 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
x^g-G2-FMiUPn6ohlnaVw{NxP*}&&wPOssj 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
  • HLN)HlOU>RF{dKfRoGT6?6VTOTmN%VlH3aE&%h+ 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�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μKk4~$4MPj>sJ(s^lmcf3Dib` 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π7(##c7r(4yCNE#Z5ysn7qL_5g9gIyg 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�JmVAFxu9 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

    #g0N4(mG5979sK7vBK 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�=8Ks5OuItxJVdwB@Os@=A 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�c`C#M$s-8h9H*@C%Fkr}NP;S0 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 z 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©QYM_f+ zma~JpeL4+dF&!JBpYmsy2%N=pJ< z`n@r~rLo3oA!r>Qjpu~1Pk<*7uy)H8Qfesrm^=ib`x_ihpkcIZk)n=$Othdp3cj-Nq<`vBcGaRy~)!||Z6)s@j}>mdxQSh}|fRgG<(Q%d#->!{&DRX;QeWAf@mJLhN_=Wj%=yegUOA z9ji|}9LSP*>VDwATVh_swZHr>&eBOnh#gbOJDKKV*ay;5>O4%NWr^wz5gdr z6N{1im|L<<)5q3m4=bBln+^XKDEdn`tmvAUyK)&IgnpAI)-^?%Z^jwok;gk&$tT2b z06AG+ULM^&xLy>>2=_?Yo2}BxiJ$(3piWGwv=AHZ8j*rV3U{pH8o?m}6V30&%!0Bp zJvdI|L!mWu6TSz$<27|&|CAv}69mUhqv5dc>hT_zFOYA{8y%Tek(C7*yN;`abq~A3 z0uP0bat55ZT&Dz^ULgjBUWkA!@?QPl>W_;LnJ1xv1V7{EfV$K`+}axtD+xGJtzi(= z3>3p8*MIH0v;SbK-rE`8RQIR>jo3oK`bLSUQxDcfG_$Q^3YWaqR3&7F2EU>6!ey6LY9v{m?yczdF zfp|)Fd`0%9!o#XUGtu}8&uxF*=H@3IqVd&fem&n$no?V_=yk$O-ijl)IwRDyB3{ddlJ`|W6*P__?tORX^@moJ%&4xg~g+OmAOEOxRLCz=4y}m@p#$E z5P!7Lr7EolzW@dX+aB;^nA9PE-OAXzk$dPse=t>5S-{t02aJ^Q*2EKI+>d-g>^n+z zqn*^>4pJK35-x4XF0OP`c}Z&%>9DOwMjny#;uI{@==8EcP@<9QSJ(WmwKj@ zxPY6G>=No%xFA=k!*9-292Jn(v{F4&Q3s6rNi5ojqHEQTug%y;{e)R8&I-t5>msqK zrinaARJS)Kb6W>LyRCykKZl?)MMjaJiG%tf2%;F?Uaac3mblpp_FdT=Ia;0?$x=hM zD^KdT&#)-tO=M%l)emrUb%wH^J9Z>tWwGA**XYD|A5x{keWxC;RV_br9M3hsCtF$E zlsu4Qf>j=J9Im@hHJWd$I=Fz7sjDO$KvV3%GXSOQchFvT_{E{(yq>YNA(hMM{1ZPf zARHF!D3lg;k`aZlP{KQXoO87tgNcZ6w~(8rav?TjOamq2T_S7dbP;)sV%o%2k+gxW zDgjI@p-unpBDf_;&daKqZxR-KU=Jfy4oMrKzhzARto2S28651j0?wRv0fZEXilfR; zH&v6Qoek&6uzi-kDuH57smGFNE-FzNTvV^D;Z=db^D?qYe(j4J>z2HBHI1BrP72M) zX+Fw`4Zg*(`)uwR?AbM%F`wKGv_fbJ)JX8bI49>_~XdyGnS5R1{m&QiRuwuLhcHG&+*LH@!N|L(iu{*sLdfHM3 zFH^U*!DzdwuH5?$GRKCbP~}h8;F%2q<~e?2zpZe%CPN`1?yEN_;Qq zmhd#2A)!6X0!C$KTr35rHlTiiuJ_3+a1bKC+I2=1e~@%a`Lf{ZC)Srly&~%*>Z=zq zjlWWH_g}lK{y&PtkN2XvrC`DM-KEqvN!6m#40T_EvG~^k&pKV2wU!+AJ0}ReWvmh9 zvzeO+zEn}0l;^DmnQ8}8T{6zbkFlKoUAaCM`IrAoDE z*doeTp9aGL9HnHi!Tn#PeFs!iY1{4C3o0TCC{mQBQ~?F4Q4s`bN)ag`BZx=|y$S>y z0@6fEzyLvd6Ql+R5C`eK2M9%K2#_FM2ubdXe)E0zzyDqLpP9Q>T;dY+obx_)@BKVS z54)0?Bz6rQ{Fa&kB!dszu`1PW2Xeeg>1(CRFFP_MfVRm$Lk2tUm)Ks7=NNr*f@-XV zk~_2>AD8T!Kcz$*NN?GaFG^HsD^KR|L{rTn1wfAz;X*#M;K1bLI0^m<-KBEJqnqe< zJm*{+)+ONThwC?=arfLY3d@DG%(`ZE%<3H)#&3^3Ht|ff@9O_A;IDGI9J%t|*kpqVo#_}T4&$Ldj zY&K{h_f+?pgy~@^3uix>Ej)}8k@FssBY7ky36B&QBJ3b0m;Du8iq7kOFhw-aTucN< zC%DTrOLtsXnMvWfi1`XFckIjvAv-eGxpY`?4vwjB*U2jE8w)9Pz+#L$=wJsF$Pg)V zccl!pq#$H-wQ!0)nT>CHSLmN(stJqEHZpPcHetaEcNqmxr=HC1r5Po{K1OjQ2+!$` z2>Him53yyo3;u!`^k8Nh+=e37t)GjEdj~}Ir`WI!r0*ryMA%!eLEi)=(#EDbkVZy~ zn+MZv7ut)siNfBLhDTD{=7~%0MP3WHNim_rRo|6Kem%$Mb#)G~SIR(_#GDSgV|z`>4%MF;DYxq0FP-$+fgfUUZ1*69oU%n~a9-*WJ4b zg#V;L98VuRo-aC!;RK;B7I%nmQy34tKNUXudeFGgBH+AB(*^U<<3;e^4DBMTRyMi$ ztkiRl>HL3Xvg!+66xg`#nf@iS^|#T-v3-xW#{7z>4~@~ z>of9lK9l1K%Q$b37YW9*r4x?;_8S5q$3fCq(s=IRI0eJB3GpL2Y|UHc9K7mn=0cO0 zDY@>h0#np8mOce;*n9*iL3S1KUPA z5+BqA7YK1c?wb*_8T;ryU%(B$m(?8M=>tBt7}c28eJ{-*$>Q*ZeZ+3_=O&DU1nvbX;7N2BwvXSFO5}W*OqXb zI!ne{LN@^urd+*BZ!O6FMD#lWt@58YdLxHjT{y{Az(il~*r|LvzF6Y;W?Xv9VT(N7 zyv$B1@YWeVrcOKf+BBm*GFL6SdCxp#z>cl+{Sg(lR!f~zIS*-kr9QqG!Fh4RWb}jE zj-^6xvPLPHW0!! zyzpv}9`j@4BgQYO_}J*Lhx*^^e5y5LYh1o8LqeTL#l1j->4L?*<_EUriM#EMu&{8Q zqb$8VNptBs&bD7zZl#G&S|^(!cEz9WOX|->Mj18iInEC_QB`?bdcnY_eq8fkrN|EN zQe*+t{(jVS&Hct!D9;1U)!zK*!bD=rboNq~b*0vD04{#u<^Wc$dY#vefJJi58PJOT&QxLpAq)M)Ip=TA>jiakdd zcS4uqi3X);KS2Rp9Dg;|?UdZN=eI-kj~7Vv6ML3YNskk?Mh%*c{v&uuIhr?h-4^2~ zT=eakT$U%(Wt%Zk$@Gq9@pqf1>Y3JWH`d=lu`|7A6jZ~jRqmSbOv?)E`FPj6RQyNl za5X;BG#PDjcV_N1Id@fj2IE@)qyn>ef@C@@q{r>Ne`%ybpH1{3FA$37P}NNHSDy%v z;2yVeoP|tSzi6FjQGj`^r_4J$oz*4ks< zh|rf?OOw=@Kp1XG_dM#V59aN!xmB8ZTz^5yS#`6r76BMEYD>V%ylJkLZm);SO3=rA zXS?Z*3;U)Ytb1*6M1?JR)9lao$QDu={k?3haK5!9s@>zF4|XpMJi4RbX;P}E zq-i{9+|VhCsOr_`nM0zJA-|xm=@DaZ(i!_JDG< z#?w+Gl;sU1=|Cd>c(l^prR(M)(gd}x(1UE!cp+b6lgxTaasOYTA&=hxzyPQe@HP^9 z2PoFp4^XlLIq1EO)0;?Uk8?X7RkEu?3KWpPDu@4IT(mZudVy~lAsK1jG2C$s?;Q7f z_{Q8R#MP(X5gmo9xpoCS=Us#V84?j?I=gt^^>{41a-1;j1IWL2wl(jl;>sEnx9vME zOd$w;qhv?OlB%b&5XRRhS))^K$(#`zDo;1F#`;i)+E#~Q`_(x)rozBzfQmM;bgIU@ zK08TU+&V{}T`gJ|GKs4|9jK#SQomO0(XU1NJiEt+pc->o$Y1sDWC8lI zIf6tQ(aM=O`tTo7moHyN+o@hf?8bo#pQ%?p`L1{BGZETvTZBG&jXPdTG?!}3$x$lu z9z9r*@zqKyr1%Xc$QKkcqSWodu!XGw8l>>RQp^K|GdY-aL=WSU=4X_$w8*H@kM zaNZWn8T3ogUrbWYFWNamlA4psl=NkxKUw#!wi*cy3ZQyK())E=agLng+5=e@^gY2A zbW?K!xf2ikGxPja)pEwiQd^g`Bk6YypTlNPe`D5%nZ-r!Oun44_j`1Kd_;u3rAb^! z&h^z!457ZzRthSe*1rw6F0T#@t+UOdl$; z3OUAc<%`2cRsI78#cQ=)HgWv--V&P?qbzSVnFKZ3%z^3!dSN5C2pHCNydE5N`LCEc zwE|G1fUff=5*d-jZ_F1Bf;m$dRN~&V&gwoynY#c+KLQqpM#LupKO8{ z)O4U_B|v(n#TAiYmiZ^*8UczipC@7-Y;)5pyJ!xkv(Sp&ItOl|MWnw1e>86 z@jPo%93S#Lp}#_B>&)Xunsk4P$3#u`yMAk`3GvCl1|WjnF+QUN_(m!Id?k#>117WC z!Qae7saRBYpKd6hy2D8SO>HsF}?SPeNR#)olhu zw@}A>E*4>fQ=J$jA#^k+ow}`lq|US)r$<(Y%`U1#7Gv418p`W1N2G~G-t|J zph)%frk7$KZw-@+)_ZlWrY7r)20!ro7W!LsDVB!N@Cnexf~bfxozv^NM;?C}^33Uo zT*+zidDmk4xOhai2s4r_4C)}C2eVp=#z|P`pwJqlPl{T!+2?0xWe=r!EZ|dH-oymk z_ZiL3@fQ6Uci$SW7!IID5%XdttvYI-{JxSfj~Y{MGK<~JO)@i!x8$CY9&RCLZ#WcWcotO{byJ*TQzN`F+xgWp5_Tz?$QB^ z8~JO`R+JXTV{*eGt-+pbt3RAO;JU3`;~H(2{*qrhT92)o`u9#+PY>RQ$UHjR$v(Qp zT#7|ls7$ROmyi>dh!~j+bY*YM%Is6ut?HEq?M#IOw90nHf-z_RZ3X70iBI|pJ19x# z#Qtz9F!=oFYZBG3sl$MUrO4uE7yF+8tr4);6IhAGQU#syg|A7{-KT2W>rlmbvy9HA zgmw;G#r&`~$pxws%02{i0-;7)aWbAjnMN)>%RY1dG-nx*fHRgPYpmllpOIh}brr=& zO-tVi!U;ihIA5Cbhi#j_j$A|2vX*(Wf+`4@Wb}4_o89!u`_!S;oM&5)NZp0EKa?7d z!=I+TKipREz{7FqLat0!at%^lqtkKr^RwBHj2{*mBe<1Eksa-6r7I$ZG_9n8%;X1K zaD7CP1IDa>;gnoz?)IdL5?5=in5zc^LMflJXy?_Rpbrs~L@x$3OuMtshd_tY~12%G!75hL~ABUQu699Q5d*FKrPvwm>tDW~)h^@JH z4Bl5Ggtdi2+dJDLec@{W_-a`pPAA+=sQ_Re)LfCr zi^(3`mcmx^XP|Xkst1K}{qwS1UNM_K$I_1M+5h(T7x7`d0(l`dB_$;pOX&o2RJ7Gh zwLXSMOIDE`UflTe?=Q}K3_hA?KX|Q!WBlaaH6*(-{fA{Y!~CfQLQ`KwJ>mRc8B86F zI1sBWYg|KrH7>t*BYeAZ;wy#~i_X`gZF4C9+gGRA^oDagUrv_nEIp1MkAT4w^37}G@drnCD_DbP@o zKEf?C!+dWPN_{rAEB%{WnVV%Bc4}V_B;GMcph6kl*(9 z;HU{Zi+Ma=h(Ep+nPxOaNSp`K7a%nde~)C-ey5xcKzfL#z`0GJD1Uj4P+TT$Sqz}r z<;sYj3`_FYj&=v;$_}v9$5#h^nWcjxPW6TiU@xZ5ux7M#S&rYSkSU}T3%X!Pp!o63 zHeBI$xRQ=-&9%FCpRJ3le<&ryYNXCYXp$@Cdb0gkZH$M_X7IP~o?BQ_ z$ikh?u`@sz7NuGs^TrJX1QG+)wb4uJ8Vj$O-j53@#5VU`(`^z#&8kOj9BSH=^Z9dd zOXulDLlK;C3@lyvYTmHHWg!gDMRpGb-4k%*xSgt#ZaM`xdS!yguuV@wR zpoFgtOrvT{C6s20nu%C%tY?jk=hZy!QrHrBRVi^GZRs&&v1fS&M)Wt_cC*c;`(k2G zeDZABH-3J4N9{#c0M+6QAp*ToVnE-quh8!&!{n_#j`%&v$trbeHXyl-JdB}U@%}!f zIX!V7DF?f#KF;M|JsgiKD3->VJwuD`3>l@9I)q^hf`C`ScpQ1PR!i&8aT-tM$K{wg zEM8Hk7)q;A_r7sF>c;#0#-0Nss#LtW&!^&TsOP9**CdTg!J{e9xOi6z;m&|FTXd;X z!ur^^K0IRWqm1pWIl*e#cnFH6{?eOLuT%^Jl&JV@lubuv%1Y=9mc2z=`m9evVWCD? ztXNBR@HK1N-0W~d^{^J&udIO9;8i~eH^*=5R_7;CjCeqgcr!uej8$_jCjD{q9osuU zO7&2p3F7wy26`$&`ZjoYrPTfQW$W@trz8`HKWU~v{;GI+sOX`s$bdSTBG$1j&^~-u z!$vk6ZYo&Hbx2bKrE>HG(s*%-OLNBE@HUN7R$r8};yP3%6bZv-z|$M|9BR4$srB(w z>>oV^R(2tY5anRUOX-Gcs>D0l*^c%3qxK=dBC*0F zOO(@;-1lzrxMc?t4$nSY*81L?CkTO5;Py>hBd0N@cw8sw7JyUYzYjL=kYylz6@;qe zg^%aYxFi&(R|)F?6%m0wXPm?7{pzQ$MF9H;HTeY+sUVUNc&sVkY5ZA(0k@SDd>LnT zTf**4?o;J6p1*oY0ea%JSHB!GJ8_FR!keh~#|tCS@O(CXB8;krv>MKIst4X=S6Dr! zFC*P>;%GvY&i<2^xc3yK(2|-Zd=IS8EF4)wj+&G_y-@vZy`{WvgG{jMPEqa1rwR;U zTBT2jPCidm@NCIMBZM1y{Hs<8&)!}))ccG34bDa1C~_JfbA}NMLfW)HdUur?<=MER z$y+0S8`XaBhR3$OwC&Ge!JJS1oQz*N@oq^5;}~m{^2L!Vie$}Z#-$Ni-dlIXT?5W8 zuup+G0j5d}wJLuXc8o4I${U^a{4{=aG!q8yx3}`uz88$nG3;;ZhGtugJ1-_Cl8^DG zD(>&Qx&MIMOZ6{@zDcB5e6P1Xsqx%Ua^Y<*mct?ia_vYY<3rFgyT(Jwkh@o(PQJQC z*_(3fB+D!2Bt8l6CfpgAoYEzB-Zbt`-+&M>lt(={qB?NlK$HW*(I5 zmOL8>yZU{@y84mX#+5t zsG*_Iy1&{`bis!g2= z13t?WxnVbw;SeW+m{`NOM zTfD!&rW(Z~N}bU4a~IX|-f>dQ-38S@dYYky!)yj+e)*MXv8E1XjoRDur0JoOF!-I@ zlaeZL0_>?rddDOhtT6D({8mLM)H9}Du)=|_EO}(6R|XneQ`#=>ng}bJRDMm>I)2%4 zzsJ&;HV_G11)AL|d%hSa*aHHi{cA5NGLT1yJH@99{FzQYjWTS>0ZBBfj=YdAYUvlrH3dO;`V0)_JB)?FfST7R!1K z1v65C6sJzm+z|L#x2KyZw@ww7KYZGRL@0RsWDPh@RrfZRC#2$C!wKP!PhjM9&!j{h z{3suH>0O-Lsf&O1bBWKJ*RVM8zFqVY#zf9Axy=Y?SxidMlyhshE`e zQ`|e!H0owY`o)}-h;is`W^?zD&FSA#>I`YD0o0LlS*0Ju#;1K1nWxC+ni1nlp$KuW zXXB0!R&h#ew)Db1soi%o2)nTUzddq59Nb9cf(=TYejy_o-em3Yi6iC|0LMF6wFR+YfB# zuYQubPkw$)6&1uwaDVKBS|P)x>cuNs1(l5`MH)QA)<|-tgC(`Rqd7eIA&orAY@2KO zvIR`b+D3h2z3=r>vi&Y}eFDQpNYa5eW(bEs5=YLUS~6$|tLjPmstrZr^{X2u`yb>z zyy-{XNC&e2jDB%@r*}?hBfS57Jmgdeqrq%b$r@>8D&w;OY5Nc}&_W$Lyotk4`0AeL zHZ4?^FS=WtLeqGnN==R~KgS?mUGU)|dGK-QF1B`ZFUi%^GOS9Rh&|go78u`Xm2|6D!ygz|l_0xDz8F{0b%E1#}Jmj|?FaYB|9F*RjzAC#F(Rby)drn&Cr!l?cqM&K8A z&Yd2^sd^GDy1KI~_bss>D!S2KbIhcUT6Kz^bw9N(0l5RV3Zxt6KDf`I(^S?OV?ImX zxBR_}w6fIJ6`z6wcH1UpHYUaDcLs(`y!h?#^S}PNQ7yFVwy2xKB9zr~V}lL}oky+t zgS@C8wbSx~_Cw)J`a}*LsZI5EnqwS?XKVSjT;~`4FjILuKxb&;$LHE=332#)Q>XS6|0| zLA{YHo~QimYFRT@RGxWmN@NG7OBal+$!#I@8-R4XFIeff>Po$)2XnlVUQQkpN(rTAV*a{#8T+1+Kyc+o{S*wZM%!aF(U09V$I)CDnWN( z!p-TG@jAn_Y92R4??CrL=xfrIs~h8L=$9vtkp0M`YlD3X*)VFx5%~Q*dw{8E9RV9L z&}}@LeSkuahWc&{S=Y(3CAhR)zHG^P_qT#_|GBOUx>e)%8bY04{&i~r-+9AN@b{8S zqMu6ws22r^X6A}vpRJ7Y(CuZKqcNF9h3KfzadGTCY4G|3p=vI;Zf1fZ&&9*K)~`J5 zp=%SE<47pMExz&7LUxNdZm_4>Jx{#Vt0b(|WAx0S31$78Eed>{}j|^SJCgB(m96vk&Io-ELBru>rTx zoD5vNQ2hB7+Ng(k$S%v~k&o@vsYWAun7D#Xxljj=I;eBSLN_GxlaHALiqy>fwT6Vq}s{fz}fue zPZoZ^?`x{!tieS;mIQ)x_VC-?pqC53Ib)zq=ycbRx|2=t7RGTcMedrr_=~`)?XDp{Ze4oSw;)T*x z&z_m9f8>4dBu!W;*!V8Je*PVGi~nb2xp8T)1a3zv(YfJlU#0s(^fK7AcoDHIObZiO z_62KYda{!EyB=;FpWX8}st4Y#?}s^{&6lL-?H`P=PgHcc$A5H!64Dk|g2P;OPT3KM z*+B{MX#PB(Mwy6v;-M`!vwLzN6rJQQd0|lFyUEgrBQxa$E|WMeTfbkBscaLi$cKaH zu^=(*(&d2J^NrXE2x4Dm}&N$){yTl21r%qE? zKY1JmK`Wez$lw4bt__^o(AaD~8h0;zo{^3_YU2FfThd4yF zP{R_i>fg^R;ON_S&wzGRG13Pt7}Rf&ef=EpL?##qu0+=kx!EH^+W*8@F#AKD80fZd zGI5}BS$B6!78OLYqs**W60p8KYA(2k%b8JFi_);xgvTfkIjuxXeiEWi(EFXPh2D(u z`h{EH4LFai5V6cSI@AN+YsHPr&lJY)SoBszr~79wjEFB(I%JZ;0}FA&?XUGy3yQYe zdx)7k4UDwoP2p&x=635!r>@_JasD_=aJ}YOicX?}kbSscy5F|oV9}@ZK8uAVUZnT- z*z8R5W>@bMLz-zy?!3Yw@3F+S+1^b(oQ#e{=&yQGj{lyisb@2CY7Ns>q+h4aPLPt8*37Ht zvaRXrqItx+6dKQ%n`?&=fq^Fob(bGut%6@2@K=V?WS_Z@X_nacKd|jD74fTxS>5Bd z>?x7{ah!59J3Tcl=Gg3kUFUJv{q~g^k_I+9&3C8XX$f0Bx(;TTzFVNK*~LoLT-g8p z_zOV1Y&;l+%wMYLgCFK=m?*$q1G!wKTi-pois*3h%<85yV;jwv5(`*O6Wj zbQ!kALQ}}I-j)+7*Ua&%#r*d*9xe$Fq*&;#QQf3v+H$hK%RF}MaFd!JYsM!L!BFkS zA2Hr0lf|pN=~X3YfMt9tE8?2|EgzR^ErW}_6*DyJOyi@`buni zqr=MVhi-{_EDaV~whX>G_1Sq!&9R<#f=m8t^aaa=ztz6*-dj3+2@I4xae|@PnVMC# z#I3L$tKU~i4{_HEH7T}y%83g_qi_5Y>bOB5G9#uD)I=RnKlnXMSz$Sfs4~g>-Z^3W zw^ZY}Pfx7`z=>~*;iNwIyl4TU^W7l{BnNW5GlP87Y9nA7v}~uFs_wjVQF~th66Q}U z#Rxle$RF=!DX3zM7bi7UfQ3Hovip7gcgodpJvD9Ya=*eZ?c(L(@@`E}MA0N5;mRjb7J}`4p z*fRzy^X6O80>VtPOnd%jMQbM9LoTW^_c*~!V|H%kz>pN2xPJNK@~-n(4c{5`$iGft zGhm+TmDD>Cb*TQcF7;JQS*IahhJ~^@2u_PfpUnH?Ca>rownYZn(LeR0O5iD`(a3-I z7cMH#0~UZ9F2&KGN=SMRF)T2}IHbRQdsKeCPhUSk<}d_inFqzj9z4cz(w2VQLXYED zKKje|*(bS&Z-kLFG<|Tjr`C@<;P7_=4E&}$xz~y%8|#A99*z*YR~wn#^a2<=xFRb^wtK?ynG+<}`v5%I)##iE!jYLjIJ1+H0!7 zNs2Ugni&hQ%0pmGulw5{uUz{Dws#A+pP!&p4~rfjDRmhAAn!gO{k~at+*c*{!Kam^ zmtU8~OiF@|j1A%6^?(6p)dhUPro&N1a!K#Go-WA;e=`gk?S{dh>GTNkrWJ%|wM#i0 zYd<-a5LNeBuZ&PWZy%M05s*pDTmgZuqa+azstor)Qta+sDnM|p4g@!)#G<;4UwOqN z@odQGM(}8Ow+BECKCm-w5}kNY9iD#qh2V%Ie|qf$cCr#v6xRNo^^*_pmZc@WTQ2gO zBd#&m%72hD(Wh`HxE0l5e(PuY`}(}RopQHl;5})2v^<$xQEY00p3Gp-}`nESrB`&owC4;FDXy6Z^As*BMJ(9nx|TLK*& z(!hSBm}ayx{L*ZRL=1V?Uvovvu2hJq?H=jb%0W0fmtx&3LQyGS;%fOJWV#pYxs(A$ zm%70qW-<9F`QO3T_pm59IGyVg`{%npzS4b7*a1tYPvXwG$j`=E2Eo+-UMTu)Z#>Jr zT0ge;pPkSF)7$l23zdi4OWVV{-JxZKx4NLyGL189+#dsn#mP51y)RU?ZDwSw2w{RA z0+%dhdsGf1K3a_5h|EbukCz?lFO@Jf-XTrrKZH-Y2)Y|_k~Ce6of)Jn3P&V)-@X0v z_KZlDE?T)STR+p_e#B&dHozjbY+W+mTfANcOgS`M|tB%L! zm3Llr!Ljod`IU(!R@U7W-@BpZN(yw<>CwG6v{5l{Kb1xed3cJUJ);{Mj^7O{ynC0u zJV{8YUzP}G2L6^)^rN@g-TvnfkOm*u)3{MG@Mpp_=o>cPcj~{7*Z8e1H}dqRBhBxQ z`$qN42^3oP{rf^s9X{{gcYm!#q@XK1GwH6Xs_GGCgMa_+U;TnN=s61|LXv)bHm3b8 z_2TInGxI9r%LD}3HKsmRC*SgGEcv=oB0S;oiAa+bT=q`0*u_{ag7+s?Q3~Fh!{<*s z10e_efS_EbQA@re7iZ(V7j`j66J?;xLP6dr=b1gJswKR43CB=&Ul<6}k(-JBFUO+s z`&2_1n4M>vCtw_7l|KH;4u3faKK~MVn^$;*cxICZ&>B&8=Za`@LZl5Uf1#)@NZX|h zH1bGoU-QpfjS>wK9c6*puE&Ii9;C(YI12l_gairndYId>1X10&8PGV)7R_!3a8s-d&qOv2}fFVytdAtwV?c@EWhEJS5{P^~_)lNtzv+|GUYM~rA z@9>BPK2n2zWcf2s-8j5=#|?#qA>zTHh)O^}zy%ZD{eKyM`m^o{0(J7iuNR`uY~sRK zEGH_e2KlX6(iSS=QC`iZkfsJ@9gnIqD-i#jpzrN9=RJ~I92+&2z-{@kywS9dpZ?`H zFoJu0WBvju8pOv0OX%{jprkk|)TmKiuBlP-;_lc6vX)0;0~v}o?ji+u)qdhfMmpZ-l;o7d^} z$sn-41%%9nOXpao7ZRYA;wf(MUdim1NsQ~L1oe8bHWDgBCQ1o$u@}C^9HUv;LaF3(?O}mX3YjZ_vRsrP!EzL5pDIv%C-c06e@Zqb889@jBtcsd0yZ~+T_P1BeO(UTiFn=+B z=^3Yeb4UNK&2^vrLG-5+mr%{Gq0VU4*^5`%AH5xP>+p4hwhSlf7+bt@LF(>;RH;!= zYjmq1+)Np%J^5+{1Zuw`4n;z=4NtxY@b%6aRussY>i`Fzm+zXNpqcTT0t>&R~Z47pOwWa5ktn7Js9EP{0;+rxxWWMt*^ zGlGTdOt$@SrXhl?Rm(d?C=iw-jkv#CPyHX?9~QHl$faGGen!}@Z@15$#dJ#$ zG8XcSS_P+0qDAmB&;fX9VrxPP49Pe419wvyi}n)nyle=gJh(3s@<*{YX)RJ%rm4WM zvTbTJ*A5#kfG5{wxI$we0&sVR|oKhxj^CJpLxFKO&& z5elK!CtI5LGNA&kOVE$0mymN*X_3cU1$UPvy9o181xPjZPl%5!%C!ftWBm)nC!I5; z(68*!$drQqx4`bTwMu6J!dpF7T-$D6*z5a~EJJrk40^yrqI>%lPlM4S&X* zU;WtAI?yQj;onk4FJWL>wPjoVuPlH)R!BgRMTra73tnsqK~a=m%GZLV7I8#}mE!QM zaA25gY1olY5DV2X9h-xqaP&hiOT!V&@V3Sv{?h zZ*&6oXL;~nui&qO#xEM~emT4;6jxz|om39#RDDi&kB%8!Oc=H3wX#`S(MU+tr5ie2#ZCzN#S9Z?mdJ)5A1oF4hLet@uejAQNo?L>qc6?LW?5gvL@wc#Du+gms8?=RJD zdF1jo^y$W*y8w(r(Ew_b!pl{>UKcmzm!|{52}hr*PP=YM6Rx1?7ST@&-zWsaBMbR#< z|8lk8!PS-xd1SjLX&4Wa%*wLi@v+9`61#n6=i|t8N-uWFg_hRVYCI@@cT*plDGV_m z$NOhB_TMh<|CRBdUvygQzM~HSg{<=OK_4#n)2)(`HINA@0}eR9mg znJXGT&GFTFNfKpl;1z>LBk1PDi!W|i{;Vkhsmxb1I6qdc5YNoLi||?|NzESoM@jOV z$~OR?l=w3c!&TnJn8WrO8b_`By?DtBi_2(Mt1KuM@BHzh+ znx&8+sqs%dTV3P%x>eOBdsWo~>y%N>?V{+qlU-d$u7l2u9|IGYtQq9T0GuXNlR%cI zmT0%^q8TrD%a_Gp2$jeC!eI|A_b=x@{HJq=!T~;o2FRoLT{$hv+in^0R?Y3$%DUi7 zFoNs-Sp-viZrzCFn=_m7%6h2+pMeT=80#sqOHPz$*_Qa6W!?7=q7y)3K6^31`?fv; zMzRNNTzqFN^z^{qk;O<1F=#o(Z_y6D1;(o{%16!Q~l zvBc^~sli=izBW`0H@sfdu~ttF>eCMh40f#_EK9E3&=~6QPAJpHyBk{oQ3!V4z8F?1 zL0~Tv&s|wKv+3W-1!_!7f$wzcl70lYQWnrTgt@jMRvntUJ4Wg-M{pWU_ zA}GND|FvO=TqV!c@G}L!)oiqGoUa6@Q=##*)doqpZrFosY9+Y6qXNP*PVg&EjM~r~ zq6CtEYF@Zyc6uKk5j8Cf?SL?Re|l5m#b5Nm|54Ta&wqS(;Ki#$%spTokH)@3C)!fj zuO4`@tqWRBT`&vBv?W*AWY$tvKEB~<-=#SzpoVvkr|BVg11-Bfz0k4*<~#fZvzi++ z+AotQ5%tr7ZvJ$jo6e*kiw{A%oK}S~*Ff3ftw$FB^QHgyviY~YL#%NSf92!nu3n;sckMgeXSs_v z6`xHqcOGY(E^bnq6SzfB<{&iQF8P;pQ{TCi#PJUzIk<>LLuA^#1)c_K>2;a9*_K~6 zN7}Wy!-M((hw9U(dJ8Mt2*}FBz~v!$c|JUTARQ|1!m1z=+Lb^xEF3=#gfr@?Cj~<4VKf$aNWjvDQ4)r2X})tW}>nxtvZ|q_D=itMrE}FQP`C; z7+JK&w`>OT`Ki3}rNUZBSRDAD!@P(Vw*TarzvJ6`l0rPpUzv^H1(&6yn>yQD*%n)E zw=IYj>hS@jZ1eM-l06Yz5(qe`p=UX=HN|Cqg6o)G1VFipwcn3M49YRDSe?ow)U{lc zk2ouJ={1?}k~r5cW5iwAM^jsEvfcu-(I83$RB0c@#jn1anEsjeg~_ zQLzIcBZLfjQ)Jbv_UJ|hb8vtYy7>ag9=s!viyqQ~NB&7ZG-i431QGFlI&$Oi&m@7j z@XbF|efta8(M+_wTc%3@J$&6=rAy2Uz0Mv(hSn&4?g-e?6_U)ODL2$ZIxotw;(SH7%CIu=F0@HI(qL6D85&*qQ;Yjw!In06TN5S-C8bZb~!h45$li225*M` z5E9#ae*zJ2vsU3f^wJO8amY5`Tu}!rK@fCr7D!r1a0AU8sB;Q6C^kgE@XTgVP5g?RsisuTP$Kyo)T1}a>M@+gZMko<=kU|T%v z?1jB+`z^zTP5Ka%!9v_J%gQ0^5y~H|@@~TrTLLjiBx~{0;gZX{L{d0}?qv(+^=k9t zds9?Ho`Q*b^J7e#K5KImF>>!z>DnJY?`ONLzZ)MzY_NY+)m$ksS+$U?r1j*^6K}OS z%0!lg@uD_BMq=sI6yHcr@JmPwn;xD$kmc_d8V4=Aq8vP-n8nOR6b%_1Asw?hM!0h? zp_N#){H_Gr@;-9~J2@!m0n#{GMh`={-SIGz?jD-EDAa?olnaNQq^ypq*{%V@cU;4A zu*&<$}F=*6^X)21NFv18;r7S3HGz$cN18Dv+;cbC>yoGbypCKRR6Q%y;JWX|JhoU`Ek>VYYwf@*eOu z&@>>1^cGnwW-D+Uuc@2#Gmgh)WHhjTUp>BOrEjl|&!8Z2@Jd9Kdm)f!tyY0rC#_Wi zH{vt=oUckpdpAxD%@Jn>_WCp%8zjvO6e>D|mo8Ya;zrSc^h^_%+kAvf=Z>~Ri);E1 zH&`XQg%17~7x?mja{*1Wdz6(zZS$hz*$ZBvh^_b(v;;*!P@@^dVi+l5RtAdIcf z^ueqZFkVtO3wB^P-UAet#rhkAZ_GM~)9v7`LAQ>hAP*(5i&FD|Jl3mPr20};&46C( zGXuOms2k1LA*OAWAM^dgsaXKo1t`YF(UOU`FOL6BjPxf6Wwt-bha&e34D~|u`Aq@u zJ_kbYW?hFy$HB*5KqgF*@ZSoNofIjkdJmT2=?SHFBAw9eK}re1MrDwZVD$AbDLY^z z<-3ulFO4GOPirsw>Qvo@NL*|?r(|wCez>i={#B>^f~YP~o&6}j2Qweh8FsCx;a5f& zTW7J_9p3U%9%;SFEgJLFr`~lh$f6HDcvCl%@@2 zOgr2C^e<9O^}niU*DW&{?%Z9rip=~k0K=o7W^dm)eMat;>afcY}JWPZog*UDrmbjKv;lWQ#-w|=f!i&EbdUs_v05}_}Z=c&F_)5vAev5 z`&K-bpd}V(ZSO=N8nMz~;>qeUV zR6Y)LCxbcE+Eis?l#uSmY;I$d>_shH9^1xg zNzEbDV#1Kj?q~vAG}brUei0wsXd{Hwws`4#>g&I-g!}($g#af~yrAe%sKGrTxSVgc zD!&Si@2X?WWtIh12)J+Cl#YrCVKc)xKVxEoPA zx)9qdB2lg0D)ZpBib?n7eSuw`60{TRiziF`aNKa}&EZN1ChuZf4^el8biM7 zGqnO-P23o)IFGz0m_+p_Z? z_2VBy#LwTD@PvzfN}x%9z{Fz=wJbAz(F2Sp=fsdcaq`TWXf2N45!)RyT*+I^GpXbD zjr|-1k%0s0ZjI3_r&ru2m{MH`@+K84O2c|Aa{esWQawg>QhR!evoukkWe*NE4&R>V zF3VnOI+x3bq<;R;f`O-yv0F>mb+qROPYCJZ#p?}l%f$CLAJ4i|3(i5#^pr*|r6uhd zrp>pw2p8mJ2!0yYZ}brUyz$(){dea6543?X#j}@hezp`efL26#EK2W9&p6O`xlQ@g zL!C_}`Eix|SG^QRy;f{L$oP04Ygc8>>`IbUl46lX?Ml>9*#H!gHlSi|r46THBd ztb*y>@$JScDIx#y^bba(-}CZ+1SM^KT`e)L`TFfq{TRgdn51crGoBfzEXx)fo}q9j zy6#}?!UFDL5RFlcOn{>L*@bNp#}}Vnymc=OGUFNDU*g?=^x5XCu#)k-&n?+j zSO>QaIpV#}&k%JrnRDL@xFe3(xixBj>6>VI{~M#@zE1y$X4C_Nk-|jkX4t-%61c8m z6Z}lv(nv^DjVtpI$D`d&=iTjZphii@+>%rHAnT}uH*-CHoZ|}b<&?fKoB0IH(6l8iYNea$WJ z!s7{LyJLh>yF1`jZD-+QRqQv0STwxIGHFa^SFV9$dY0x^+98_qeK7HMF z`=sI|Mla~YtPWoA-#0HbV(nZ}b^T3L&{lntMh9(>T%wJX)4`{o7xb+EF*MkrQO2Gv zfQL$+Lbd#AaYE)4pEM<(EQ?6Kj_fQOa_7z&usv&7u;e|YtYh@V|Nve*s2_diUimi*dwNmm~ z{qbhNb`3K+)!9$2JEU-Kx;8q~sE3x?DF{2_-Tq+vtAA*!Gczt}{2ayf}B1$hJNbjLT5)}pM0@6$9 zMVj=UD82ViNTh{MfB;Dd34i>)|D20+u`gi^24n2K)?Ck=Q$rEhyF%S9a|XoSU!Ha3 zQKY{ou@Tv{ox^$iutVh$BM|2a4Nn=zbEYbe`Fjl@U3Ol(pj zMS1hRo<$#X+=)>=kIMCg`6|G+7K>uO&5k?yRnkojx2fRs2Y;FMsiP4bN|_V~FuZC> zdQW=?dT!3*uTe7eceDvG5!(siQoimsslvfMlx6UMJ* z#y$@5SNowDcwx^ntFE9R-f<@%I>$2MA4LPr)^(g3zK&pq2(u}F)sa%v7H8}m#pRvf z?DE}YjVHfEo-HX&zOO$loW6kOYXsA_+-Tk0#lSP;9Xsfv!hUB(j$O`| zspDtLRQ#u=y9*%M#41jf$y1-ZSl!W4yVJe#qQzV0=bJ6{?_$T2O$WaE?n^ShS|$4I z)G03Q;<~yE7M}|IF(A1heijAQ8stzWRAY6>(-K{HOzX(eCh#xQ&gYVjJIt?MzM1nv z8lA&U?Y|J3oL8W&+EV4a$}3;n^{J)@f+mL_Z!!IxqMECV-Pkpku_4Zihiaa94IO(r*IaADAb3W0)!_|d$P9056I zkT)_xf)oXM1RXOtB5D>WTPH63NxXXHZRYk@eupW-1+gXdf^l#HS)%Lv3c3FrZ!orRGU4QvkWIss#@;oIl z;V;?KE@W%^4L}N!>HAi12?AJhct7P2k?3zbAi5w0+#7oCxIX%rx`QI{kvEIziQzW#?t>o%XKA2Cf-{gcVcK-XEK4G_% zjxf&wb-XDE;@p|q4C6UdJ+RTb#7yOBOY5)a)42XeHM0?Ksj{gbwfuzk=#=?=;dwQG z?9o{Z=TvpIEN@J3f=K)n?7nsb$^zGN$g{YV;f{m23ykAJT~$qmY~^T=I=HBu9- zbpxzvVcRZCoqf);_Zemxr?#HZmGP($+>A@bq_>~OlinH11=rHLyV@!TR3){jybEtp z`8`GBU&0C&ONkORne2)m#dwTi8$}n~xJ#**t)90uaw!uj-HyNcIjiWSIxFEh=#dh& z$(mVFo7Iuv+D#*NOeW)K?t(7Y>N15L|J31uY+%6$8SEQ!3G-6BqBaGGc z7_|$Mzb3vr|E*wCUl$sue^AjDw7Ot=`ar;s_>;7Uz1WUoD>k zP4^tS;U3EWv-D&xEjS`9s+7@2u{@Uwg31}XQ;<|x(5+JRp`i1-CN98cf6W_sxUwtj zL5L27^%2~_uR`)6I6IsF5gaQoaO@|PRShDdC_pqe=l0SL$}` z*FD?&o#du)Pv}Y$kaY)Fl`bK8CDtl#Kvzf3xBp(RVTp0IpRLo*A9qwkF(Nzg^jiW= zMlHcV4b#vGM&Qed`S?^hxu@~DBR{|r5C=t=LhU5T4MC#b*y>Sxze4f#S@g;^i3sX{ zi@(B^ryfu=l+Z3Fk~sK*K{!HhC{?6{oCUB*?fB<}Tx!%QrMTxEd=T1orG%Uk5RC7@ zB6g|fI&^YKWd`IWsv7gT<*Co+bnORS&zT_F@{+KJNHQK@&Ot`JhXx0oHU^XJC4P2G zvrD)yPSYJ>T+W{^Zt`@7S|>x2=3A7vlX@;Jg~?VJ{cO33e}Zgf>zF^tJJS=mYhg_| zKQYkLyHj)KLl!3yzbNmrX^~IdEqyCq@l!Xkmpw7IVL?YTEkeCbyHCZMY~*^IlgLp6 zMWZ#ZXImO~#rm|Y{x6NH(Wf0#KcQ6fH8R1}B!mp@o4^)1O&z@d->r+xGZ^^5n2vU{ zhHQ84JN8BWwQd{$)o52#?Sl49kGvKB9TDUh4^- z^VSVEds%ZPD@xP{o-m^SDm9h<(?uA$3%1>d?^5CL_f^p&B^xcpi^DGG<^SG!iaTwD zmUtm=PDQYI6LxFj!pG@6NhwvV^GW7R6z9-v^u%ym?}U{>kNOTkS?T#))+E>LXKGH; z0p*VPQCZqPsYP)6OmMV#wm3elZEix`2%Pro{w2{fWy)Y|_g*xO@LoYG2a_f@x~6;0 znp=5=5Ob1twtw-RF;IZNN%f_G zcrX6}t7_8p9VT((gQCnaDdk&zuZ7RQ`K7!mT{vfx+?5h=Km(?32k(5E@O6mj&%RG+ z6fV)^&(=M%692-Ga!GS%|DAuk!J-24=0FN2{`Pf=)!BhJi*X{gu4T3Pi7uIGZ6BAK z4>}LGpBBm55R2i5v<$h>n6Vd!bjng(xL_-Z42>*{RYj@#Rv*@m(@DsE<5jfZDG!UE z2CL2N5$U7`#R~c&Uki_z`Jf>o$q$_bsW`T79p_DBx{d1tmNe@Rdw9KVIzwPewquEZ zY#~uBFm(L;2^E&3i|K7lJ11vwYfev{($& zaHk}ZwrO(fHC~_py}S=;1no##*_i(~MZu?WKxn}U@yOsjW9pI+-y7PFtNX-nb>(e+=mDJsSZ_U8xuyZ;1;$)x4twUn zi@)nc&=ic0jELkoynPqoqQ5+<5Vp8+DDRE+e@Es-o%XKfgdS^~larvOM|P`WIbkuQ}Qkbb6=7&Xdb(QWe_qC zEFX=2ZvAE7_T#!m^O)VcJUM0dkJrziPK$_$@LM0IUcX2T9A@JOe5XIdQ_`QYD+G?a zjzJop_A@FsIV!szq+Lywjl8^}jQeELr@Zn%wz1;t(T5H9AS=g1AEuP(?$fR8n%17m~T0X1s*S{|ZJ=Jt6tHfyc^59^@zzjx>He|P7W(0_zOdQ$4%h_BbjFl#INwTjG$Eo1xN@duDxt% zdSjTAWIlbD3_&i9?38;!M6TfzB(oNqJkiVVeg_=1Bw9YMH4tXlmx0p$J!nJofxgi4 zgZA`_8Ivq*&PDxLW#78Lzde$M$l=o`uWl`02%d`1evHC4Pn|L|xAr?=1r+9t2SIly zb(Nt%H1uP8V}mm8D#*$~<$xm^=S>bJuk8iZXjlwM>pX@~+CP^TPhvx5g0FsDj$rY7 zF>yj%n>2EExqwozVE+2LoSyJRZ7nQ!5`jY{hD!i+lwb1GK*vz)opRM^_+kvECI$0rU1vGy%fddg6>~SZiCG*3(hJ$19Gib%RK^ zI+mY%HckD!9kiQDa`KcdoCd9mKaU6(kNFghD?>hkPWK4K=FhwM^@}NbY9)eXM??)e z{&Ie#4zbb;h?7&zPy=+tPInS<{@>te=kky@tk)=rYdAY$68sK?COs#>j^Yn{NR|2>P1LW3I5}vtGB11{r_eVq?d*ko|P) zK2Cj(2J#O>ddNW6dt-P6X~pZ{UV}TKdH5VHKZCV>$`=ZagS_ZUN|E(wMn3_1eDS(` z#$n%r@MX{84~xsQG@vGadS1Zy{g;de)p8)(X{VGgG}nzoFSBm4?!o^GK#xVDV#A*Q zn}ZHb*0A`v*U|gj1|Mc8F9gVva5Wd~QTo}OJ~TF1LxMQEoaqJhPlL#8u|15r6ZR2L z_%JGg`LehbYpAfb3N4y;+t*o@^uSRjO`uGD6=kJBfa=Kf_wNripIlYFLUFHOoWj~H z$L|B#?^BbEomyTe2PcsWNS&?gTJN=&$Sc8cm$>-LTrwz>py2#*E$zmV=`SI`u`8sq zLx~C-Buw@pYj;Kw$dYSp&~3m@(~7$&OP|G5KgHL_FS1yMgEZ?*up=8F{s zS<*3G7XCte0APi(rkE^l{uud5Kobvc3DAGVrZLxVL}r#v^?`F8O5!o+`V0pq%!arc zQ9~S&dPD%H3N-$sjLV^|N!3u_18&W*3pxk(ZT;MNi=LqGOGzvdLSr881HrZUTU`nM zVCD`Y)B^6{dE(elDxhgR-nrtCi9j{?cl*bS%6Myod#s?&v~bbb=76^gG^KDa6s zvnQh#G3C|6nKj?^4;CU?HBEvirnH{Uy$)K4sP|YCmK(2NmULbGyhsmGD>>bJaRK!4 z`yjhN@5o^=TTkz|^LmfNai3zb(OD5#Tle{HhUn2*CPVgf-jdVf-r}Z!-1q$Zi(}<} z5_xp30Vj=lM2Bbx5BXv7+cJgUT76$aB|mSr0_H$nZL-;3iQB3YZ8dSjfwPr)cPx|& zs)w@z6)NM=8j53k+jaN9or@{);mV4l+&`Qg75kjS;q)U~@o0Eha5nAA{iPodrdad|rY8$Bt^WA5c`003zm{RWNX}^4H(r{zYdH=?)Q`>eF zWd4QFq9JxFSPgmOMk&1A6DEO9Fy5Cp^cGHa!S?=rpG#R16}ia;imoqQYs-Gwk&h0c z&#-*CM$CbymA=Plo=g<)ClE8dpk>AQ_?Nt%-jI)+_nXIX@l-t${)1{e!kd;DXi$Gv zL68C8rBkmEJ-3lA@1nIN_EE6+9c(e!UVM`h(?3W=U4z%>D*8RqS27ONMYIgdk9Ki% zk%)Y-i1my5uJ+3gBQ|ZiogX?6&em&E1VB1SY#{M zKrvNPDQI-%T;18kBiOEIZcf!Nkkc-T3izjPVxp6=%&myfaN{)M2>(S&pHaMcaLZUp zixM(3p*g-`ee8Tk0Ki^TJe&o_cgMO^&(9FF0gvN^>0mAr^ zwWm}l^ZrYKD87RiI1e#6s1fU0SGtQPB<(Dms)}*mSW7gn$It<+h9H?rbD-f2I?fXL zGxcij4VH0iuok9{(WLgnnkwn>ed~nwaj{3xw2kra)zocvCq}cpjbRz zPFTiBAtQc>m%Ha8N*#eur1Kq;&sauw8jE%ABWem+%TQafaO9hQ<$XI`$&1 zHg*-#S40cbOD=&rCqnG_L*FszN}Ek)TQIem-m%0AsX5Vt_v9m1uv5ytM|~72H1MEMt7ZW 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�BsA*f}9xe;PJP_acG((%30>ADaA-+~5A5)dc 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

    +&v~`R-F%^}(lX_xaz8&M!Wt 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%0D(Rd;eh+Q6&b?bLR*@X8*EJv!& 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 U;G<_pY=Gav17C$d*q3_w@BP#g-2eap literal 0 HcmV?d00001 diff --git a/doc/images/addons/icingaweb2_graphite.png b/doc/images/addons/icingaweb2_graphite.png new file mode 100644 index 0000000000000000000000000000000000000000..4147ba5f3d2c1d7aaf62eb3cb5e391bc1c320e9d GIT binary patch literal 252196 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

    t`^M7ZuUArvRJR40^Za+nKdUc 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

      U^8JVcW5>1+46 z#z|@}HVL+guFE2&8U{rVr3H89e&EfR;>_@P-`Ir=+AoOSD2%(!u87eh5QYpp5~gJfn+MJ9a$XJ@UcTNG4ug6V+mmNO=>?y+PTk zJjdk?h86p0K8_g(ghEcp6TKQ2@>EE%Zqn0znw{p|SU%nA5V7-!FjG_6L$nFCf{C>> zhJp07IOON=?q*ZMYlqjpb44xdz=ba6WpBYs>_JcO$arM=E%l#~PRx!b|H*tp*^Z>& zjhk1ptaZ&t7=3JUQJvFX<4ggLQL|#oXq=;t|BF` zxTLP8b(03y-X}#BUJ9g!7$xcr-!x0;KPNgu{=i`0v%=Ha@-#Toc5Vw1gc&v*vGK^_Q=u zJ=QR+^p;|$`J|j8q-z?V{I^p)2snAb;<-c$;44$o`}@cL>-KM6_jSQ8 zDF1J^>$jJfYsbzzAj5PO;(ci66sem7zLtp8S#O*xQehO7^!_@~b-DjO5$-d>*C#lc z=E6Ben@u9xxtEy>=^zpDv5jw;tj6~&(8>4-kruP<^*o!dOtrz4d?gX}MU+a99MKeG zL0rU@l)B8Osi$Zb6e|Z&>=HeikbRMn(7fG6#RWzL5DcVBlc!{hr|LP`i48wo{gR zk#n}ks)pcb-fYXRd)A8*@$B9!?rGV#vtVB(tEJ}v$oR{ZGFG`%*U`9<}G{0=x2&~K2t<8Gia*+<7fYqQ0qhA4I z*P5GK9}$zQ=Ul4gJ80(F*fF$sX9=5ncviUesf+YyhwSv!JG6z>R5<2K&Y~R z<(=j+O74mk={u_lXTPoHZ=+M>7Lj96hI$fyn+?kPJrogsTUAg!l7+`R;Cv~*HNj9R z2CyR4y!NcBol9}3YZfwo59uekN*tkvGXMDr3aCmqvIVn=3jrp>IjOMxBNoHU?tR@@@lLn zvbEG#R`W1(io78tPixm>*I8`pc=$#dDm*nSK1E=C^CZf+l*Ie|r-;LtTgVY^xVz5$ ziu>qI4UIl^8%&+F=#AVPK`+P}6U!TMRe6!x5#mb&{&2cyM@oMjh|7te8suekY@Vl1zt{jHkDEW5^M0%Ufi=@}iUE*eo@z#Sq zH8{uok&ly|cpDSJ4UHo76`?Bd_%9H@mN@3&T1*m~*)+=cFMky&Kzo~-3!kXoL-^R^ zWE611_WK3EN0=kmbS2*3oa`nN9#mFXP3vJ3ORTW{9l3?3o}evfzZzo2)`R;Pz`HZE z=+5UX)U^Ffy-taQ*|Eq9EJM;OG^n>;aofj52Ogg{jQSGe&J^2=2z$4$kk###6=W zejdxN&v8?&yA9n4LjW0^Yp>`6m^xvYPnyfZ+|+TW$-2dL!0=*^FD=!}STVUg+Rm-I z=v*f6*3)rMer~eHDAn2@wVkKXV?2-Dc2lG84kbJk~jjfLTCM~+KC{FP8`w%n9)y!4Bj~*)SRm39v?5}x&?wmYa z=MXDRiQ;{AJ2cz}8V-;(`2>et7yQx|hEZ^6Tyns2pgptlBRZ>UmbY?V32Czy_!{36 zn>S(^^}uU2rn4wCKa1i%oxJiYJ&7FX(#F6n`@<$ISMoFSCe}_i@uNnCL zH=hZINilIqLHxW|daT!yS0)DnUjwX=o`7WL+u4V#*il;-rN zIXfY?%C&RI(y>%LxfmB)Iu)X&Ug~k2Zz@l_wDUymM2Bc1A~=Fq10~xQPLe{<-h4WI6=#F4Ht}BH(Mv74B1PG}M^x$*5k|m6Xb8K)N2JBBzYx=`GFDng zyGmka8EiI}*hx2Y-5-0G!j7|m5l+Mp%a?BIflW?^(B|GS)4)l29#vMSU zyuy_i#pl!~BWyKN5ca@wqBn1LcYT0{WK%ZYQSoCVMt@17OT?N(%5(h<1CqgW1?%#z zWZ9$GGo+}#N<6WQj%CpOVe}cgbn;|``kOL-vWGBV;LSZ%-kRQ1OzrlL@A?2dZuS7= zoX+x%+$Eu3;@$aES|_a%-SFt$g52@s7ovC0z9zd;5YAFWdO@>YA^r36mkfUK%r!>l z*%g;}Y)UQoFe53I0}b$Eg76D_@lR%0tzdBx1$ebC8TpH=dfP zzg=037Z$gNTMoLQq(;CsAa>7YJ15^*yL_Q=fJei2`j;t!*tjspiRYP#E80WQ%4+qs2k=I{(RxM=yL=W3s{#zcpTs z@9RW~*2~UUZQ~=36~y!bWr1=7;Ah+A*cna|jH^u8Gly9K^oXhVKs zpU8}Sx;bOED1h=mnKaL%5mch+2)(rqnSex}z8VRY-W_`&K!TseN{e*x&vy_>km=K+ zH1DD>pqD~;mV4KHiwS<4Dg4|v!bD@gtopN}kGX3D6f-1ko9y`zc8b5a{1D=fOhopz z4(1SBQMLPSM5_(Jx*Zfns-Blo78s{eVn{J($M9c1;5Q4$5${A@jNeH{VT`V`p^xNM z5;^Fy7L($kte%BTosfES<-KvJ3Z~Cdl7-au9Ct>g&A&0_0rv%W2krz0`+G5k$Pe}h16L<}`gSY0s8n{V2@&)eYktwgjs zj455xBPU8NPp_5Ui4?uw=)!x7tmxU^0&-bSG|6{Y!R{;{4x> z7=-U;+yuJCksK{v(?bQxHk-REZ6HYm^kJD|)$mnlLCX0^iJ*^|e8aK^68r%lG zfF8;|@fH7n_p=_4r5fP1)z%>T#F!jY&$|yooCd6R^s{|&t{M1%Wzls{kNRSHJ#d+~ub=81-aW=SJu$z7M%W*aiC%osZ7mFC{ee6Jzvw>ShunN%aEekr;o z(76V0Y5)1-!@sxyQrBEaBS%W>y2_rV*iR?ZUuxSb0f0~+h1|82Hcde*_45<9R$E3Jrjx-dABoW8YM=wIPZlyPs*=W9Tmzp zSd?AL=9(z8_P)8fS7bg?&pYm^!d*lE$s)F>Ml-vf3;wT z6s7U4!4fuRtJjq*@y%NcA~gOl@YwVZW4|0*t+uUAczP~IE-_fFDu5}zyL!{}`|y4J zsRet_j>w9qr)386v}?zpy7nkysqJbykHr!vLEiM!tjVLgv}a!}p4L3CGcBUkqP+>a zKq)?G&1W5gm3Pjlz$oHcqhrf`9-j^vdH0dgH`xmXF^l`12b+A79(mBjAhM{5)~kz9 z4xg}`DelFa5BJ|rFug%tZx39(zkq%vahzPOC2#=WM3>)Jwq)|ID-sf3G z(b;!y@Qy0CzTi0uWHBVm)G_7Q<{q&17 zpN!J$_h2cr31u7%W2W|S&bED)o;@hURU@H7)|`B3R#|Vr?1`>TOcJqT_kJNo=C-Ts$`g3*&1$m(o zsl?%{!e=mGbWp#V+x?-+;>Q=SL&V2e7g4vGwb~0!;U;8Jm)snBXan?86Fq*seM$8u z7hHn+;A$&4jD@^nNFp4=#?yf3P;&PTdP)lp{_oDLH^WxL^fRT@7`Ivor~WT)){ zB5tb=zE#Vv^{pZAN=uZ8$6Wm~0+KnBxQ7%`nnda0wyT+DV?R68&QV}Fe@b#*s{RqL zwD*<{?a19P15w#=o#&rEROuf#?$>EC<>d%#{?xh5`h`v2H3@cG&Dmw~+NN*3+eid2 zQBKQKPad%s!)CAGtGVFw(#bORzh<~n6P#z;!{W+B(SD==&QU=d(^?`g zcdV0pBW5GvN41%grR``f+mNM@HRkvbgZ}dC4*tc5^4D&7i~3wroZFpFPk3c4e`c$v zG@NmOB`HR0Q-X(UR4j$kqVkS#GrUS8d#SljnTQWg6)>1RW}H+b4<|*0=u0lGqnv-8 zme+1Ps$DJ-xM5Ul*Zp1EBb`C!1NSF#2tJ^qts^{d>bQbTTcNFZXXBM|zIdnL*|)vT zFkX8u>ck)JGFt;memSeX=qMK)<&DZFb7{{LVR>)at%XX3rDnPC-4qqcl)(N4;owEV z*ZoNmv3b=g0Y6Y@=LL95%xuu;M^WO_tyc{+1Ed+Y-rIy4HP;B7fZ%sxAC#r#jPAO2 z!+-AE8;+fucCU@a)oSMi{<5ZfG;mYzG}DICsY%a`7#uXC@7Cg#jD;{!+!NB{~L5!(}mE33j133yX!+Pg|XW2GN|9rwo$iM3`r9% zsfr&n)+YwoF0U9Yl5saCHPWbVR_HKC*%;=;_8P{kWowTst4g)J|4Mh+NBXV`yddbL zdU>}nxAhdr+5UYREZh#t9?$yYRbEPz^l!Zc5FAMB|ArR-rx49gYU0{AKVr43UOx|HxZ>o~ua<%{ z+(m=DBvRG504kz*w;Ng?_rq-=Q?k;yB_OBMfzm>>y+WjCHgfw`ga|7)U5y(Kd=%5E zd)bz+zo-Urm%DA~9t*xP&BFbseB~1HXl%4Nj0xAN5YK)AFYu(S!yu_d*&eb)>nh_& zV~kqkE z@#{ssqVoFX63nNMfHgjj@$2g@Bn;!9^41G?Yra#}!HP`<;D~$}S2&lHa_lelY2|oJAtb6UXAo|=Hn;Imye^$XS7$} z&fMblMzBv3wCOJI-L!2Y)~pPck){&bAQ20mfnY@zGG|^VYg0z$?c|u5Roo&BVgNCXcfN| z-P!vfK%W6pgp<|@zCsS3e<@Ow`0nK2xpWIOpj-z%C?C;2f0QVi z$FcxbX?(RdM21@92BVjUJk=3;P{)ulx#8{&mkVZ%sey?@3M`?QU#~N~eqGui8_M9s z>DGT4XQSSnx-BQh{@`lmb;1wJQwCe_ zcj9~OuCIcV%*&*zGQo2QsI$=E`K>4}`&L5CQz{w%#;_f|)3}x3>8$qaF7}*)x4IhL z4WgS9A7p7%tTqlQ9SO)acZlwhY=ZSJrS~Ot2TyVKSI}n*@Od1F+>0VH;qXO8xs?(N zn)S8Cvf+ZQwpsOlfu~aJC)JY;tcJ)~fh$dulO|W+lKg%3)O}Iv=_-B2Ur+69P|kUd ztE$yem}9t~RNW*lmAo7OWZH2+G4Ozc;$0zGJYfsP`1EdQ?)2_^7;O)ESu+zhgW&3* zV&&Z*J3=9eY4rs6O~imh(RWzQcR8!Zn0DF6y10Pxp0tX|_0j3LqY9 zz4f;7v-xk8j3)T+m5frTmzq`Q3A)E)nBB?Fw^&*haR>S0uf<(CiL2tTBSt2q!aX54 zh6t>*%hD0%_q&mLZ3+SjDp&NKf$MYX|g!5%^vr2 zVGv0?V2rXPbF-HO&nk5U#~UTVhh3~t0mh74N`uEgn6N6e8)PB45=mE8B+o^pX7crr zzuy_5Fn7k(UJV8KWMdJEHv}UpmLdv-xG`fef0Xq96YfD1-hCvpdD8VC{Ugs9zCoP> zWix%oV7b~mkym;y)mahx#Xa`&I6X~NmgdN)ql6o@xY+4gKRRz@knKnEf2@f70n`VB z&ll#HwsBxOq6x%uqAt6|cf~`8m^2(U-NQuk7yr0reZULWa*@ND$`t zXx({w_itS>{{*F{NP`UM+!LBBZ@~!O~b9lZoo(0F9Oyz$rPRMYCocnB_IMr~d6QLwLeGF*|+R~gG>4bK7 z03Ep&APUdct8&Hz7V8lW19-&LQeaYYh{ULp_|8j;8PG5(wV!@uHC|aV0QAPLyq!8y zwZD=Tb|p59CBc*Inx&Q%Sp$fjM6_~N{wPfSe&}BDK6OBl>5lNSPuM- ztu}EfIiy;eALk${yqaB<4USw#ZD)UHl@x9yEWGHm^{7}?mnK^wl(WYu=bxXLIwg7V zoV-{3B%BygpnQ8eLBah*!P#BVUb~#-jx8C&9I|iJ5GK&{;@i)wc4q<(X-}PdWSRD` zE)%ZlA=y{?6Drx^+bUUFMQM|Qb`xT&qa|4`RED4PH4BUio>BpM^5hcBfuH)GB&XHB z^bi;Na$GGj&{!_yicRYk_w2hmrJc10n~GegsgzEhDZD==$Nb@gviMH8TCVO$ZVg_W zM=dkldzKG*@P=y~Xl^IkfqPSEJ6>t(ErR$rmb1*#LPW`o{%$zM9{&G zmcUa;yj2(@tD)Sk2lZc_&#nQ@z>2OU(pUwIv_+Dn9Ly@;H6eW!Fb@{rY~ykU??hkF z&<(}HriJK{(A{_kK$+TN+)+R{)M@HgSI>BH-5rQriBnj!bT9lfCMI=->-oKq9dln7 znuoFVh1r4dN2f@;aL51z`M5~gL@^(zB91CclIA8OZ>lr|EURU{+z91mRV}mCGk$IZ zWT^3gRoAWOuz6X|4KCyK(LKgFjfla zBi{ETe1w`@{BmImkG3Nq`EH7CbqeHwVN$X#XfK#0>;p|mETH>u6XPVwMxVMPeC!(Z z91RVk=$hz|Nvll99@~c=eOr0FJbIw=ZwK_}!C`0tusHhzSJW*bcmA1riv%Y2=cVUF zFvBf~_72~>bo4c7SJ*!KT&6?Fc5L`b6t4{+vETThlQMtpGR2!ofBm(vNG>2n_lefe zH+;x-+iyE^NY5pn?$W(F^8P9xl8%Pzqsxib6ZEW?tYY!>qDvf}7@%f{jdz*YSQcWY z$}&LK!ojmt%O}k6D^s8se`)BGu=5cZuD`ibulNWmRG}DUrt@dNM$fIHv*_6%bK63* z(C?pImp@GFDvkg;Ut3|E5zyG#iplkRj+}ab8WSjhT2B(8hC51f9wJy`6Fz}^-iV1Z8H;M<)JgUFMLga zZUj6StCOq055D~6arph}V*-yAs{e3lDN=G!^6#Bfj=opV{t!ql72p6N5bNDh>v*pM z%YjUr8xtBop4a0(?4qi-Qlez;m{XmGz<1ZD2a8{;va2G;R9Z~M-y;*}F?Km`{l2i(pDPRzJ1c>>p(Cqk4EQ%?l zS6K8U+51I8dAwYzaM|XOe5fq9+ND&{e+8USz9XDX4sYo~CxlUHR{lxdu83Am2|&$^ z2Ul*7AV%Pt+d32MjX#L(l&qf?3Wo!Gf{4KA_+k8(p5}Oe11x(n`8w9^xFcs44HK4= z<%oXEw7W7*T>Z0Dfez&DyAut2^*1f!SV;b(0^MS>lRmXCCc%Kft8SoK;UY&*^bu`z zkMv@O2bN9woi)fM{Bzq#zQEbf_UtYf{PX=UQwwg@8FwnOe}ql6;uM*EKBK0XAkf2c z1M6V-6a7H2)f35Z^fm3YYPwR%W!_Qm{{57iYkJpv4$eeF3Ow7dNA0=^Uu->+q~VwA zUk1iBiLPrQ&^2M{b>;K$#wmjw?Gg-dD!}RZ?ESJIcQgaPe0oL<%`AM)&F8w(v2Amp z2D9;Og`}kLZGN$gTPzDFIuVwy>;1n+o-Y6~{CbPk`u?#wjz})f^sopX<^Z5n&?@7O zV2=Z&&puR2FZThd!WXtuEfIM6e58&wuufa5uOZ7J94MUsItv%8)Fj}aTmH>Id^e^- zRn@wN7gKnHKHUh>3%LQnTM7GiHY;KL>o z{8^8bT1XxL-wSzI$PYRB`3q?w)(+qO6G%3MbTKHa^RU{?a&`2H4}3Obe;C`pNjocy zp7|V`Yk$bLg?p(O+o@szxTjC=+*qMO(%p-LoMWEvWDBuK9N$X9Wdzbv?vXBzG;5dH z+DQAH*+3mr@d5(|)~De^tOTvlUgv+p$-Uyeq~wI#QT8`nF|5&^p)Yq+@~wfcma@O{ z*Cz{ACim`L3dMGsc2f-kp)ANJERfX0!(R9pGtaF8O|y_s=G-emWd+8q`0nD?KvQ7Fq1*|Ei$ z3)m6Rd>W?w5qi||&})QZdTzv|-&d(r__zhOc;9HL&8myMJ%e1h5~ur&KX;%;KNuA< zt9~!OJM{q%PWy0zA*fz7jha^OGD5%JLSWSP=Fp43MV-!a)G{SB+&VHI{MJ`X(~W7# zfXIBKN>0}K)cZc0Xysb#kwOHrIe>|1vrIcbav@KeoxD5C5DUgHJ;{V1Gje?flXQ8= zsU;KKOf*o_-ot*sLb03FwEacPIA$G5L?3rBz+T)e%am{DH%K4y$q#>SCYDI6HAbP zbIYJlkhTfL+gm-Dr&l9_E!a8RV(_1exBRw27}#T$9wJReEsVA=zTODP;fpYU-gMF$ z8RyXlB%pb;i+^-uyagIS+aY{M_!`JLTIB*SO-}-8*pVlZcbL&Fr;s|sAukVr^aCD! zjs)1_9(CTjS_vP{e}xC)&qU6&*;Amin1+7;El9uesr%&Mgq}&cZA9xA z813-X!guuzFzdtZ+=wlU!)>0vQ9Cy+*1lenEYE0WHWTi#&KLc0^eXE1>hC+Jcl zUmtz+l?d`YO_0Pj*j`L*@dR$82&hp`+W9gqz5!}BI-uvxL#wjW@7E9|#uk^_r+?d4 zf8IuCb?R8TxG#yXlHh+1D|v%qC1LtMhn1K{d3oucS-@&8uyd zFW+?)f3wS8)z98JuDl}eV#ifwOj(f%P<9!@uYg7k3G`jbQ2L%K5L_V`Z!NQf6cZ^q zDI!ci7YUSnr{g6y;}a||Q@xlo-sWCO`J8Dd7IxNDdH=vTM11fxIZmi`*75U?gqNK! zN>Xk9=7Rp!Rzgvtw)OCG^xYb_Dsj*0_OMaNPq|Y)9OBe_$ER?K_#DNL5D%|-hR`_x z>vP8L`Acq@h523Kw_Gq6%#BH^6PIq5vwMl)pH~#eKquU*mmG+grs~3vScUk;f^X0!{ zSWNgaKkcYP+aOhYL+Yib-yHZ}4&G7_ErHDVNeX!=z0;Hh;#u6RTf!w5xK3R6U8)Ar7Mj^SZn_M) z(ZUkjg=0bAhj}lFyjUnS09mIovG>GIN~OBrL1!~@yHB~bP;m@F#3GcYcAdY}$R9fi zzkYoq(UZLFlDc*%V4rw&@iEIoLqi=vh-Cy@1mb-+wRUd*VaC0zfqZZft_Wy8?BU9; zO8Yd)xXT=@=2r2dofb-t3bz8SwOz;Ek*?mbA(Si$@>itf&$SoZ!^7s-_m!jPk3iZW z)WF{rKylT5fHiA&)p(*G;4mHCEQ&{x9z42FeRl?iM36Ax2`>ROoP*It5BOMA-uj_- zR)@+cB%CK%Y^{c%pICUMhnXwhUA=|1@=)0;9*!UJ;i5{~1A@hNGWcoQvoEG5JSn6@ zxP)&)8CcPPMIa&l<1o1w>Pc5-ui9IPwOQ^>#divH@1CzZ4160F9@lil)%Z>KR9K`d zC))B=ufK;h4*{mZkFESmA+vQL+_C|T?8U(MbwF>A**DUiB!uuC0Ly^|W^{9Fx)i8t z84!WyXm9!y1!Sf0aIQs_Y|Z<#anl`QRU{%o=mpWhX+TXv`wO|_4>Q8SeR4gnfzYuz z-(j<3Sy&N6QF{779=UrF_C#!1kr2}yAuG3dkgz^ILQ}N>Nr6C{X^KY<`WtsHmlDCs! z3txVUThh*6eeXfq-zgaLCp}UwXDL&TLor zfmhsqF9~&E?ZKM<3@-rjVb|&Ydt4Xzm}&iLTSdM-4!a@fN%lw_m7tyf4*B@z3`)f- z?xx3RqrKk}x-8FNk>Nc7ge2_l?0Vmorz>ST7<1U&F$EH$3AOC@bw?0Pare&7JZ=mD zfK0nQg($Sf0B;bvO1?asQdjVlu1@@1601mX_7Q+3l>oGjnf_?~Vceo#0(R8jCf@(= zOD|n+j%kS@NEY~$*BHk=rd$6mspqVy)^VNXa_;{6phMo3vE-TC?tzg^ zdRXL@9uXNoMiqn9Cl?gMUqr!V%au*A=rY2{iG|J>W4g<~YBbh;J4PnQz zol&T#4C>fj&$)QQWMw1S13*&eWryHGaL{k2EU9U>Y`&R5yY07- zSA+j5naEeW+mMSS11{N)Wqhok(~IUqjkWagL#b&Jz@+r+xW_#}@|FVv=fPxo1_McY zYQRvkk+J>yXb%zKrT1RU9PWFG2J(6%17Us{??v*nOrHR}fYuJ0erx7O=}#Y~>>(49 zz-VE-Xs)b7wscs-wa$uPZ2fpBZgd!xt}aj1R88_+US`mEu~Njo=riRx z2Wf?{Zql{C;XnWPj{kO}Z-AR#b}|bAZaORXyI(&^5rMRi&5ahWDNbwOieZSJ|4sSN zvOf?YX@XVrRj9oJ#xSUVClRrqk?0-|+wJxw&vLCL+nl?b5OE(Trm}A{TD(yOZ104A zogK*8JQ=z{h&f~i(ra|x!>Ml{=r_0OeJdfgd{r2J_MAgY1O*64V_LZ43VrFD`6s9I zo?naB?E3QW5am9HTXnNLfkf0x0OTfO<@P!$Zv5KQ;qTe5z;JZ(1AvF9V^?p`0|){e9g z4=*^wr%k*1%70esU-L94!t8JZUySq48kDqXCIz zj(K;2pzEdy-^WAuj?mv?8zEpygNB2IYs6*d)UwpCU&wy-wAd}_Db0v@`q+fz_Jw+h z6)~x*r*xk&tivbFIXC_&8|{Tq(R-MLhW>Nr0lGXqj*Y#gXsu;0R1H}Yv=jG6KO2Hl zS^@iN$}pWNn6i&E1t$!PJt*A;>+3Ce!=A&5``BCI_kNGA_WY#)2R|0D<`(7ZRgJzo za@1o;G2-_8;%oWh*0a`)qL6)=K(4i+Otp?~?=_d7G@gFKllpR_2PQtz@dn4RFX7K_ zjKU@|O0Ul*z4`yQ>99ILSj!^51%q&7_|>uKA`%E?3jr6W>q8O!DGA^t0yXlb8N~bF zw*MJ*%W$0Kcp^D*zJy&_2KP50{x3zLH?g1=G;-A0d zK%O&9c>A9n$zPqyAL}}LPL62=jh9BzKZd*i{7WhT7gaL+!vXwxB>%QBqyc3knFP%BO^qdXRmfDBuPT{qDhgmtDO2>=~eEMUb&foenPu9Zb zTMpa?(rxh|F#ZV&ZTTZ>uXKRn5aOYf)q0TtHM=b^`$c*#;{%t4Y^_1C)Onv(z#LT! z!~loMTZt6S`uCe$0q;p5NVlnfe;icZ#CZ&AJseddS7D2&omTss|rl9H1^Aw~;x)NI!pkBsA135wT?#65m z*n9v1?qjWBvN%mY|1+WpU?*v6i=aXUXMc5mcq3*VZHHurXKR;aE;3OnAW%roKit}X zMf8V%suKj*DUxp8@dpSZP>@|vufPC#;gZAJA+Y$82KO7#;H2z;rrZV&RLh=1H<}pB zGF6&7KuHY^4Bm8zd~~w7%+rqtz=*Z@FtD$c0WhNjlz0+Y9nKGDqU7iwUDGSIj#0~a z(H!vE`jKHu_8~r_+|-PukfC^qH@kv4oX?$skbRku&RV@H}2O?)4rQ+2Egc|Ea9#*>dw@DEl3GVUp1aUn?~tbuTRxq+`k6`9g3$v zjCzNTMX-|>RHuqR;!Ut{5OfLxq2Lq07)yJz$su-q*$_CiIF5Ihb}>cW+TR~} z8*%a)O@fNaYoO#?3Z!k&mCjhp!x9C+$E>ox#)&#*GHoOPIX?pffPEZ%`FR6qI!}61 zYIc@-8bPJ^0pApSvz=RKKuL+MX^*fn(1DcLU*f`PzWd?tzzgc6aZLRXEVyD0L=cU@ zGMBqn9*P~N*~UsoV{IJm&Wbza`w8ub+zh$IV#foTk>_QsjhAKa&1OqMfg);P9`C&S ze$>zDch>ZN`dX7D^gPCeP zEcXnh8U$xoKXw5Oc_{$Wc7Kflg#$r-0Vrw>KMBA23dktq(WMK@hgz}V87w=^TV9u2 zxpLd!IKlY#?7qH3^92N@gSV=4Qt_bsmEW#RIoF^nJ3&!>C)F}w^}|*Jg)~WV^(h;7 z)_M9-*_kyF>dWRF4eAOGh^Qsf+kO@Kk-KGMM!&(=j=w$>beL%>&Xp}J{WFjLXXC~} z-A;RRMuM675cRPZq6W}Iv02wwEl@lHb0Fjm?77!UZkA0QhiO!RyG(P`E!CDZkZ*;E zZTcBd=A#TSpazLw&d;Ff!TPY+<{xDcvo9it@v|J^O*uIUfCfPrbvcOKZ2(e3Xmwoa zZ%=y`yD)^@TVRpKw6-0Sa&%Bi!4NK_?S9Dj4{JCq-GcNws{8yp`0P>O+E&?E&zgx0 zf%B@jlYiU!OxiExGLA^V*&U`jd_H^)_pHx;a(GYcTz7G@OGZ!;uFQy&r1}@g4Z|UR zE^DSAm$TE3aioep;vZs7R+gFMT7u!y`IAOPxL0V00&4qioT-rCrJPDaWLEZ$$R!#o zo!WB@LQEUJ6QErcR@mncG2*wR=vP%#rwG#@=(zIlqW)jm2u z3R5<5q6=fo`^{tT3Nadvvav$;=o=hDaLa%&drtUV+>X7Y7=WQjE^mT`@)_0JijEBV z;-<3`9u&g%#fTqqD8~dsZ$_*+!^%AK7u+1?QgDD6*L2gRguTX%ispCwu7lGtzUK3e zp3){x3HIJco!&_N-?+^y-WRy-_(koNr!pJ{=cL}szck@>`Z#QO=Gz8mZ^VyRfquiF z0^Az#BV||uG#*rcCL<}N?sV$(;H$h31dRlPsZ_k~`oU6u%75cZB7-K1ogMx>=X)m_ z{MNZ&2$@j71tu!T2X_0n(&UdeU0j8Y{ll|#)V!#ZlL%r?h@6>{!wD+l&gx>-!_f__ zjmb@^YqBXmcOSulHWpml<-~PqHVQCIOB*>E`ND{YNA!Nv25r5jrU7ROn zbET$hj|yfv>5~ zF5Kd37BdnFoiy>{FiPAT_BUCSsK$?41-XY{7-)CKl1=0+Mha7zS{$By3&Ak0N#?3m z`V^h`&@(-3|39R?c|4S1`}c3ll64}+ZV-yBVeH%3vbRZOUqeV_-(!S9v|tQLNr^0p zl6@zWC3}s1?AzGa-#PdFy_es;Jm2T_dj6YKn7OX&JdfjZyg#4Q>Xx5(F&$kF03&K~ zlknm*y9~y>R^?zC6zmfHDb)SBl?<8!DmfP}e3RqARBZ_3enyG%rB75t2PtXzSKsD_ z2?M#@Sz{MdC5S_3)!S}g>}LiG$~@0|z;!!;(~ZD} ztA6mVxQZuS_(C)L`9x6Bh9Vea!{i+pHW?@?9}`?#7g#%Sh+YyfFp5~4AS$_P{hx%f zkcJWI?bNJF>GQt;|1*(uhTIpk`!ZJO_QOj>rq6$0z_t!B7lBd3pGj%%xaM~P;%zeL zS&Y9aC(KYp|16k)is!&+v5DQDNU$SJB}fEO#m|RrEEV>o;h)YA*l=~Rs3|Y~Q>FN~ zYR8`el$noEOYh2=B17~^O1D5^z8me0d`9P5n#d7#nO_1Toj<0NB77|&(x&+uDsNIH;Omhc9<=kxcpF8TGfF&DGI&o_=le|3{U z#9nVpWS3FC&i~8Xluz^Q#!F9V(J3g(_O>6Mcw3LiQpRQsVJcRS7<=WMpa%Sm84sdr zjWeWM3Z62Wt&Vsm9NX!{Mghv{uzF_ylrBT;>94j^u~RKW;d-kLI7E`3WS4}U#yjs7 z&eHefl@SUbHho9n6C0==U2N;69Nh75@CUuRs^;E14Uyz=uufu6bE--f(z9++kH00U z`p5@5lR>6iYzx0S+5DKmhO&1&ZrJmfD$kfEPUeI6CgWCsythk4tXQ*p1jCealq!-p z0-rcIyg!M-pC5%PJjnMFMW_(yG<05rT2$4%*%#MQr3N3~DALL45M;)_Q8MDrB1zW#9JQg zIG&()r^dr(|)9dBdzVv9Cz+o-`AdR%Z)h);(SR$ zXO8y%G#A=iCI%zf>^XZx#`_oOYP<}x6mNkLGOu$JN_i$Zs()Y!cp41%UhT9DRUBOP z5s^Y$^9TT?Vt}qBx|wOC!%$1`^7YRXMKRZ*C{tzg_3Tc(>=H5|B-vDc%nL+4o+|wL z>~4Ol;*Uu{GT>ep9*}FGI|9O9c>xuYuzk%qIK(TTpwfM!;29#(5>B;Yk>r{<-$md> zWg%0c{eLD99s9P*jP;S&(8M+6w?&h1%ybpQ0@Q5M%7plK9%M6Ry2*t6>E8jO?@9?T zHc5Gmf{Fpd>D~95VOaVz^Uw=1^$-a{2ouI>xOG>#Rfc@%OYEU)i}$tJ+DKAtW{q&P zSpci?pio<%ct(`>B0{p@M^U1fnzDHu{tt0bwo4ONXZrj-1K0WJpS;J#EoNs5M%Tw5 zzrH+D1nPwfBNRUpSMzBi=4nshgS!E!sldm0jh>9Phn-)ZX-KOoXH5=}7^W@1 zG{r0`Yuz1x4L4smZ28W5!luc6=ih^7W^BmL5WI%Im|!yustsO(Q4}jr$&#suni$oTf8U?!3`2(Z670F9s3B%TWFxQ$_|?oqEe3^Vz_m@csPRX} zN4b1T)==OdmgK+35I^s7!4nY<5ZP=5e-3NBqc@ie8~ZmD8K0y56C5iI3G< zt^;$ABJ1x#s=qD}GSUu0gQ1>MFWYIO$;p4yo%DNA8tfaYztgdGPLUVYBB7Rm$2QCt zp%QRC6MT&l(M`x%x+57VN8U&82WKyi#7DG3O`TKHmzwG?C&t&GB`?|VjM?qhee$xw zR(i_Y8XH3`1|4#bT4+X$?+dzFJe7vMcdPqDkWr3asI~S4LtpXXHfKtZBRk=Z3 zbKbf0Z&owdeM*nKkvAI8FYM&K70DP{dqyX_2zj&6SAP%&i<(ufd#Ab92V9AV=X)dFxnwCj z6j&+y@7}TIx;_#2uHl$mhX1(Ac}wYb*+JvZ-i1aLPw&v%C~#of5cf{Bu!X9o&SO(! zUfamhd>iPl4O1mlFwXMUZjqX4IB50!70Hk|-jMZ3>_gvXi0A|*imaRAuAHRL zkuI3?Ooa;$)>mrHktcD}K=WKFpXbXY6vb|cMauA9Y=o5UuSC8}f-Mrb6QU__(UaA^ zUWOY~tRZYE=Ocpxd-#0GuopvwH@J}HwvuIMeOA2B5?jq08R0x7Tp;`=BbbjZFSgux zYcU!8ml2Dm6i$EOhYYQ~I0IKm8(*t~M}g`p4I*rn7ZY0DbNiNO8Dq~wN9D6P%k($W zi*x8k8PdZC5}UssXvV z>QOrl$?3^SR5r|c2u_kY^u^tx>=>mp7IK`21BG=Z{kri+>PE*-vV@60CWLiDq){cI zNeZiQWYYfc?X*7+*%Ppv+>w3>5&O#1`SfzMdd#QC!pi)tkYG9n$j4GyoqUEVuBl$s zm1{f>)VJwGe5{d<)StQ^{oqSCr09b&@mn<2QWKCV)bmg>&QqEEz!tsIPX8U+UD&J{ zEa~+7yj-ONoGK;rye?Pb@yj-hhJDO!gq}4X?Tf-0v(TFP(osJ}u{z{tN6xO;fu3+P zwGoz?prK2t1My~0r_YgsZ}Lf(@%B*lZXGC$VCQo|X2g|xKU-UF2R_cq5MzF88PoWe zTrt!KZ4FdC+m^$@{5E4tLc8x7-? zbR060JaoFLfS?kp`E4Ihfbf&1rXU6AG6f#4@3-cPF6gl@&#LUwM=zsyGh8qW0z1&E zHrx78&Srng`sm^B+OK`iAf+m_DfsYRe$EH6^}MelBfVqRZ?NvPEl>#4BS;bt8qviy zCSO!{T9~A5Ik+76Y_ylDTS?$!Q9socJS7X5+nH?k;y@pHYa+b0xjb>T-%rKgTJKB-lHi?CuZ?;#(l^m+*hKiF zGtzE0mb!!D7T!djRAQuyB#}@$;DTP5yQLw@xM>$ztzGPCt^u zEyQCEr$6A~V(_mIP6xcP>G5KBDdSP}PLZ%viKAGTMIrdQ5@lOTk=RIJqb!;h+oYVf zF2)_EbpzL50N9MvB**2(3A$AcO zB7IVuT0CYs{!Dc7T+MqvJ>vt=!c7PxI|<(<3J4{H0un#X)W+298m;(_d74TkS{Eru zErd*iB?%JlN&jr(J4Y@?mm>A4G2$F~n8uBb^V%npbyA+T0mm}!F}6d6*M-%1B~#Pr zu9YU~u~RZcze7&w=9A-%Z8}VuC{2c6w6h~5`ENr6nn+j*i-;T$P6)!Bf6=Kvs(~}l zo+)TV9->BBSNT>I_wvMpjg0!a*|atOL@OWhb4InT$~-FfNAR^MN{4m1ub0z(bG)%W zHojicBAk>=8F-Zut2Ko8<3LBP!&g1y*5}Nkp+-6T%hb^kjsmvcO1Iyi#D!M+v8(CA zmzf0TIdlB1a%}Sv7syf@9A0jmcBqC}`y>@6Xbe82FddzQ#su`_I6%i4-J;ymBG=x* z4cOaYWaSdkU$+D*+FT@dHET99x*`YW6SoI`S)EI56f-W5*{&BP0)+TqHCp@b!3sLyFh69IL1COKB*d?ETsatLoU^ zrJjxPth>J-84b85uPGkXt1#6D567LFtM*TJ?`l`+Oa>h2@b<6pdivDGbYJPMe3!QQ z>2gKtJFFci?!^&fqxgXuw9*|gzUynSdc69r)?Iq+UPu^Wr0XGfwUfnmoJ$zj+r9hK z!SQU^!2&>7$@#^*1oYJr4#}s>xnKEP#srsD@IBWNDBJJW-kKrgEKt9U1FImmh6S;? z{=0S8@N4X}P@_y+?An$oW6mj&Ju`lyEWfGTP)Mqi^b=Ad z!+HRLE$7j?gG%a~Cca*u_|83U14=S!*v7Y@9<+iR&2C3e+QpVVdX&t?T`q$`QI)vLL*jibCem%s zKG{61mNl%Vg0`DD7M=*l3r+i~b+2X3?;)HzdgOa+EuPIf-nIDrW(9PLfiFmmtKjE0 zf+Gq)OeNv1G3HF7K7uXrDfoUq>hka#xk+lOA9gh;7!I9&@nUe0rx5vQSlLqr!P`f> zz9J@{1Fksx_fuEI>Y%F zq!uT~nH=`BW0{P|sz5Bfm2Bl8G+tXeW^aMP9)hs@hnc zj=S$oXA$9D%YbK83R|*+TYKL>x<$`A`lctK;QJ?&_ZN=5!}z+4Z&aByM-X10j+<0G zCg(3C_}rhAe>894Dsh+6?iA5AVawsCL*rz3`t$xJ$_>2!ElRY?p4FskLq?jp2%{hI z5&s*V_CGID!a>h%;=KY@z6VYc^Qe#BioJ~#v{R3|@)EFumQk6GR7P;9bMJ#8-7FCWUv4& z!dUnC9qk5-z!Rtx`pWWAth$(sS{1*ZfbqE%tQTh(=Z0kj?i@K4Lxlhe-gwFi>r=|U zF*7L-HEudm6&PcS_2wz-Pbte0vp%Xldp+A{Wk0kHy(^ZH_ZX*+tarR@;B<6<@{Tu; zRoj<8L0t(YXwJ|%rHn*XM;(WgJ#Uo7XBw(Sr%V!bWrzRs9^bQd*;Q0-A3pdd&S551 zofPwJ*C)ORu`|7lrDUyOJHFp)#<>C2@rb_cG#)oz=lIa!4)^HU*6rEdi$icj{qvO< zEMsx`1HcXl#R_Ns;%6t{>lH35N!5pXO_uke{+<=l=GAyRt z+vZ39UQDrN|hMu4(!|4CAWbbrDiBYn!u!NEKyjiJ$UTLJg z#IWcS`e2EilTz5uS^v^J5xM0vqV^i44(3dyj}T{Q-y!KWZXmSP5p{u#Xep)c?w-}2 z9@a2?U|ENtyuAFHk#zZfwy!v6fK&sm$zK1Uo>o#lkq-LSq#+l!tgCeCjtyG3!o(L0 z2NlvtqGIz(@ZGgT7R2g~ghDULI9=4OP=J|DQ>e)f_BD1s>9vT~yOc(bNfhn_GTjb| zUVd@$Q<=Ei5i9#dP zydkifrSn$0IAe}L*|rT#XXdOq}eMjO$_nvBvFs{P625mwex&pt~iwO&o=O2y|& z#T8rvBL@b=Wd8)!4JhLiC@U`{y||eeo@Wr%cFaaj}+kpSQIVYqSKLbU#QUQ$v}PW3MGD3iQ@n%b&f{K zzF}skNMG`m$qTkMrulR$f=^U?&fp_}dsgYgYN0Db;s!$?X{(D+)zdO22djH|#z;ZF z^Fn5jn)WHKL7VW<(PlIe_7L8X^d!5<8y^!;)2YUVeF9wjKCJb}Np}4oY|# zkov;?iF9=_)~cX%gSI^R&}igKD$!NTDVhDyCCm5Ekwk17 z*>$Nz#r-;#F1eZWrythq_ z=rODJ4M}1WT0!MPJ*x8!;KrdQoKH-{Th5yY2tr0k;Bx?i^{{$Ro49mU`t~XQ6W2pr!Zf{9?dk?@+_Mb66nui#6`zF5TvE6$ zQsSY5c2wcYDKu@O$tuiiJvFy0Rnzo;A%53tW;PsgQa2U;6B-M%P~D05yP56VBPD2c zbLq)(p-h%7@0ice*7&T`!%OxzJHpaUl(B6Qr)jzXIMgy)KMmDRT&k4z=u$G_8vP&G z?4KX!?KCi$O$;+Sk-=D@>^uBAW`}uvn*+oU;m`GjO%xIQi~8m`04?yYC9}x}bjPJ? zrd~;gRT9b~TzwMD^kFI&=i8(%J_4{|@TfBXj#MWksmFk-Z*9_0okdyBu8~3@C`XS` znugCq#z%~Q%$J4$hdIjZ7*w7SCd*@i7XS{S?-A_k1mFSIomw9Vw(zz&=lucHc5@ru z3h;&%unAreq10;46%-)LfOyC9eHYZZ6#>AB;pFTj-j#QTq1M$W|BCpi%Q8)zUTuwX znU~;ts^qsgqa`+T7+%hiX;ya0=Z>&;=v_&)5*S9_WXpUn_wSnY06E#?s>FX<+^kBu zeEWX8h_@-uNtwkuY4X|M?RL2Ppy$DxYqKC7KZA!mVlVNf(Ix-B4hQ54piwsGeXR2& zfB2Oi&zpC$8IW1RlJe8*2WKj? zVLifMTE5QI^fjs^rN^s#3h+(VR&FCl1^!k~n{t9Ox+Lj)p4@*17S(;I2OdrGkXrqp zlSluhI5*XzxY8O*A30>Fohx@Pz|Ki5@muo)Y4kp1%e!Gh^h+KQ(w`mC| z{J#r|W{HltHp>>BxA=Fw?tgy~c@`->+UAQ(YPw zr@j*eK;birg5UrC?f&ama-qOJ@c;CN?q$~7gdaPl2^p0EtHqbmtW5ytkAlOVKdjs) zdOU!I`fDQ|LI>O@U(T*s_Hwr-ak?-I8;b>ek#cAq2E4Pi_r7Dp`{k@6;p!u>+TMJ3 z+!6X&>~FWvzg+jf|Ize2_|45FY<~S^SgI`?VR{PkDDHsNft6294CSYXb*JU>xRCPs zHvLhG_9NtXd;<`hGGOh?Af;n%@Tn)8sJTX6tj zNX}H;4^w=Nc;*44<=whW9u2|*{tTBWzYcw29aNYEmCCEhEB7qvtS!GO=YGa-XL+O_ zkc72X+7*9Ex1YOB2L5A}ld-QDU3S&~&;Iz28(BRG0`4k@c|U-{kwV^aks{nEhCxQb z*a1M8z(Vl_;Fo@Kev1R0H*eQlgHVLzAF@MMa=YV?!#zX55Zxc_WMjm`vJSQu6p}Xq z6vffI3_Lg=UhD%_%JcKDTjlO0-v^0^_1L`+AD4lsv*Vj|^-ictp-x-Pq9EBbB9fxHU`@d{raB0f0u9axRV zfTzKwORPLG;pkH!cpS26r%r)4zUG*?a(^L(Vf^j7N4~iAzdcbn0cV&AaNkUB(uAUD z0jBz0i3u^FI(0hH5DgC4h`6kCMJ@F>y~&%E@9SxriRuP+pqU#}+*C3?IPm-PSF<F(HPcNez14^s=mbO*qJ z&P^(07(xK}+*HbfCm*x*1l>V+2`DCW$aZS~9CU|aM48{MhtBb4^@Bz>n%F_UNXrjs4ckf{t|i3H+@;;-)umfIGh z{6NTwSC4~R^#6LF|A4rf`o;~W5*hd0O$sI$Rsqjt>5wG545*QZQqQDXAlATha0#NK z&ztP3;@HllRVDnO8aR=jsd>lm2ySxszVsP`SV9&7g%+q*0zU5XyH<`i%p^8M7k z8Vvu$%P$ut*C?Z@5IbRz8L$H@%Vs%34k30WswSeu<$y6Lh`=6sNQ8;GD7<+BKo*J0 zlOwRk`s$MKH%Tp80>ZSP--mj-R;rD6)C{Ao(ygGzbxu0z#yVOi)-?%0g7pRx-yJRQ zSHJmK(RWpclB9>(KY!4K!+}eNg4CE9PU~oJ8T(l`|4@_m^31|;64rcGQ|~AX>uP z+7?bSsu${W{BULTmnvAbYqVIKrDXrnMg3Eu^Uu4fhzi(5-?$VDfKrbolEkbZ`2}Xk zFC;LN_J>=8qnFh|B}!KFBBWik=#wS{Wqo`zWTS;`5Cl*>yaMl`8uKVO${=T6F}|}K z&8Rv&c*p%RE>TdRC+Y>zJp`y}-WCw0q(6KVOM^OdmzeC#xss zCZ(zOF-2t9#z!RgVgPI{mwo>f;J#95ddZk=@Da9XJKC7VsP$65x6cqei~NHq7fvGJ zxg=veMh#BWHggEgZqZAz-K5AdxU68(v3{wEP9zZtE-C5uS@fZ{YqZte-=wo{<9>wJ zZCR@vyYGfi^{P7_Ea@5!2VdM;hHPXklc7bULZEovN{T^WUMs-OmUiIbq~45zCA@M2 zXX2ho3+FNZb7SxyUQ1Ge{Yj0=uhRG?#UgWL?`z%QgFVMZuV$mXXYu(uRk~u@Q0;M{ zs35Q{70FN|U0uW;HCx0u$JoaluwK3szye=5A^K>L^@euTzrczf9%6_sOxE+vBg78~ zT}2P94zn4Wqv^m^g2f)LqJ`o-%<0f+^nD1_O;=sg;3`b0rJ6W z-@_k7mQE5`uSZe!`>;fRpC7XK21IV1R}LqJ+bk2qSVCL3JDEs{X=WLU@VZY-V?NRm zvXtS{r1goag7j)A%HdR9o&{gH54Ye_W3R^l&D!glcsM#Daqk(h8t{-IQ;`)Jy@Sh* za(%B|I12mH_?^M=2RrPMJa#+8)Fc8s(4~m}e(_p?DGVTq#sA#TxY~eXCTH%Qs-}CD zp%ipALPJ>B6>MN3V6xJTVvA?n5~ zWVl{BsvyzqhNb~q86#VX+aVy#y%N_L*!nus?qlrEG0hJF@595JU=OX8@G9#NT17^z zqo&DP*GZ}ON9cSo=?Ay_6k@Jy=@*cpsgU^vCY$U%fvR{yK9vd5hC+ z@1lvCqz7q~vSuh9yLz4EBoon{5hycnP_?x*gyk0J30{`MB2zqqYj^&a%v(?-sJqdK zOx0G@_+0^7AU~6Oh@i?otwfD2z|LIn=v{cMXg2FPR=NF}Z-BU2eSNgHI<*Mw0~SK` zfso8=o;Uf7W$vrEtw9`1iE^{RsxAn7WPQRutxWeS5FF>5lDz8&qUt!ljS6)e0*k04u(=j9k~hc&NDYt{c^6F_K?n-rXg-nBD3JJ%5x`v(;;d^KAiAU?-d4gtH2d${MguUnyu%@os*BA!H#!r z(nRA`ot1<8ng#d-Mwx$fE9`>sjx*h$tQiK?&w|6Zv~xVL8Zbqv>^D~W<=8J8;*nR~ zA)dnWOw>yMjDN(1-a}*?bz6qc71iekiC8h4KQ5@pG9<=lsaMWRUE5D1B~e9;nHNm5 zL=l?l<;N!&V7~&3Jp7n7lAWA0bL)^*SSyo}kg;KL;zTp@KqtaQw#VS#(e=OXDUk=d zd~YncQWQUI6uMo#mnr3bAl!xalQKg&wH7A%bzn;|fpZUv3_LeIGjbeMd=ppfI%Y$b z?6WRTsU~UCg2mJ?p2Q(s##o_u3&G-mxCi_wqTGIo^IVX2#5~b3EWXN|QPX+p!$3y= zg*TxWlUz4L+QgpQ^5UBVR<`IDc116Z_t*8dnc4XLzy+_Vi~$MD9Z`Wtm(dW43hMaD zNpjMjds&vDpZ_=K+~51fd(Z2aU!|9S5w^^j`RdVCiV8Fw;OdeRzNhM|FsO|P-Sh>? z8^rz}?W8@fWpzt}X!;13e_H!pxl|#Xe)Q7c+Bj2Q@He%pTX{Vi|G5n=V>WFL^%uV* zO2%)hK}LA9X~|XDqdZu9liacja&qa}7u@MlTWlic{&yV4{<^dC<&qGmZCjJp=)a^a z{Jk;wZ!gsEUQnO;3S9KLnKXQ(Hs!}Pm0kA;w=60O3Tfpt$NViFRF}SwY0A}6*1Vhh zbA9_CTbij1McDDSIj2fcg;BQRXJ?Mw*Z(d9{k1VmPmB<(d-`fHa?X(qF)A?>1L1n& z{xMVT(`)%V^~FJc4}3&#{Zk-@B-Ob+0HJ^M!qv)o3`?pV-Z+pQ1J%w)uwV>=#DS;G z>{nbB@bjgQ;`2Wch6+;$uONV}ITJ zy!em9$RZVD>p{cn2JFiE2|MUL;3;!2Qk#rn4za!mrRVH9%8nzC{BKDExnazp<5WMD zbL(r~Dk~x}z4SCq{bpMQ*23pr6F)7h+EX>$M#Vpg9E+Thz)0LdY$4S?QqptW1_3V1 zD5cf)ePB*oTLQbl9Ra^kInW5T@0(vc?o?X`MkSq04@*r2}~ zbDb@-&_-o=hJXBbs^G5$+&cxbUu=|CzW5vI0?fb5K)RkK2=F?(Fiu7*Hen_QsvLi_ zwwE9*A=CpzZB}sJuWG0TU0Ghm_e;;bG2qLUNu2UMV>h0Ct?*Kycs|lzG#TY=Q+wOE z!6NITnwLO%uhv=7l579`@t=VNfL{9hxH6&JVaUoiiI`ieRsu$hgCEQ#lz>%c1?U@< zzy~ry$?0MH``e>0plcewJ`db-T{=&W^<0vxlH1in_SUybeJE5{D*8PhpTFhpqq-yf z^pt3V1rP2}7ynP9W4Lm&Q?y{$$qtmee;7LLGiJRxsz6TJ@|zddn=3~a;9snOj^Ikq zf2}P{4?#PJ?b9{NlKV{T;`$vo$r9O|z_$1)VUK83N)EQbw1@q=X}(V@&;Q6eMCyy= zw;yt2!^DP`s0}_)GUA2 zVb$=c1HAo(Jadq90TQO17x=+L^ew>>j`|EL3XvhQwy36a24a)Amd92$U;?}@*C;X! z894y$AEzgA=YVK>zy-f%oAcQ0N5h7>*9w&kXdSe00oUpkiurX^Ts`$f^ysCs!++5B|9V${&Qgya{auskb~l0b zauEo?5f|eN;~ST;0ijTLb8iPNyy;3pF{bim!CxwW`13t@43N@Zeb<_{z-0WZQD~?X?ry$OR;yEQ1FA* z)uVE%*xCKW>#a9#Qo6iV^zBc6b zFF>Y1$pj>(wUl#@5u+`5`_H7LWO#m5Te)3h3{A`X(WO^E2IAXchspI|?OE%6fm9*p zz;K7GH=L+!*u;+;5P9YBoMq5JRIYwqQnb9L0UUe~3v>s{wJ* zB>b$~v)|;yPWD}vhDvgHbKEiW10rgm#XkhW634qF%k3%Upx&8<1y;6Oc;;-Mnt0^S<0I@c$>r=SDcK^}vTxxfE_U^RQnf_??^h^C$5C%}gFUF~#V zEqZzqp`Ks&Uv~_Duw&%B4rlr^1RCKS@U|EaiFvF*(b3n%&J252{;Dx;LLy-wh4M%m z+dv=X07TVq2_)2FH9xiLUD!9sgh`tju6clZDZ^TqINw4{x4;UQQ21+L4AOHUy`kCDprFZ<9TH#7>P7l31PXWA1qGChykvQ1R?^OJ>xzzVNKJM7CfdR1xZ zacJ6ApH7y+Aoucp*6e*Z!%Ip{`2#65MOp5*C?1rBL=Qked|1uy+jeRGvu)pF;Im3o zyu##@;rrX8a>SV^x&|wbRwX~TaLzcJBfssN1N#Ys`qB$L*o;!eRi5R2r>Eq7g22MY z(>zIDMYulVCnaX?FeU1 znbdCc_JADvm8M<_Qbmkk=|_IwVl#@2Xa>c0ZC1pQFead}Wv1J~d9Z7^ofwT=GH2Zg zmmdx3(-+>Csd>+C0{;T~@S!E0+h2hn_c*8-BJ`r+Jd9@gE8mm!t-g>id{fMmC|@#s z*!C~;;85i1Gbt{Xs*;Y(w8TZMIopuPE(6Z@6KW|U)c;SQOU~`qQlR6jmT~(J+f|;p zd?S`@tLG-zdt~Sn@WNflec;%ICAc-cO2S>Rv-JG@>=cE>b@AEj4_g?Ar$E81hzoxvlZ^Zd`oaBqi=|2^G8Z|LoTx3eQ1VD z-uYNH^+Y_xg?ZJDZ^|4>M%?`u56e-<`gQTWLPFMD{EY%d-l`RB4LnlG57ED`qi7PT zuIBTPA))-C(oG~>peqRb1G#K?)`5%RolC!wypeB%S(NKNG(*%Gd^2qaGHO%jSAm-6 zHBI;E8=X6)Yd@4fU~}Z%rCW<`Uai7bT<(!`FD)KXyV!ejteRoDwCu7f(5zNW#dT%s zf~-W5zDW`@Rg}~e&w^thsnHGgLK};@J7e|oTqS$_qW36ng z3aqfVYdx)Y5se!U(7|awEAv@Pg~%6HL2hF3_!hTP{lopQ(mSQ>US7m{N%WZ;vA77pM0- ze8EG->t{!y^J(JF)YpmI%4!{s=dkL{DMU@W3-)trx!yN@$5uJ`)?L4wkFGSblfBMS z5WYS3yffUiSS{VmbNHl~`XW&WMiL)M65I z7`sNldUN!}QE}HVohoUdc9>T`*$XYtQAGSo%7c8#E?y6eBA z$ypeZL)ua=#L-M2rX*^?mfONI{~c@pYnw8lO4bq>Y;)N2q4DyR6KkrNA$2U$5!iD} z6M}2##(dhiJptlL@QH$C65~b@`2w+g7`#jjH^tf34}y!78?H+qzZe%xIpG4NbQSVE zAeBthkX$&A1d|(;CcA^hQ&gI30G-B0S(iA0Egmt&zqQ^c5yLByj%Umh(LBE$*Nc*T zu5WI9<4SKFHHHh=YLTz58!NOVYd14V$aS2n57>dTr1UXwFP4 z;9EnjYkiDGTZ4#!xb-V7PJa` zmfgGbJ?zp=LKS1#iw_R&)o&p~RblOoOtJOt4~OmI-mH~^q2q6X)WD0zPgcko;Pw3v zed*7+bp6QwJ1KO;tlz^bXs?6KyPmP zBUXzn%5}UAE?fih_`=pES+vGn8C$Ld9t3eAot*A|pidF?YaSj4VzQ5;EK^f?H zFa5SIV(Au}_BDaVX{tuEUenzEaFb}z&uPi85&nvCA+0+s^+s$nTAWPeK5s`y^Xqh0nq-RxBO`o z5cU#n6WY7{w7+^%1m=x-yK0EdW=?bH7~&PDt!MwVJ6m$0F06Gl0X+6=;wCKDjjxzO{}m>ch_As!h`T zlU-wK)!941!W;}v(WWF4GL5cEsYkGUzAFSn z&7<7=D7MtefrfJETdOW$=;_u}cIKp95UkB`SztjYLsx(xz`0!)=@s8f#cCIy2rX0lq5w2?)ovAKyIzDA+e&fw ze%r=y&QemXj%{0NA{`yv`G&t$&_S}?rd1$_+!>FI#?clL<)Z;!vhn_qoXy`2yP}Xq z$Fa!_tS?KPI);!=8~4@91?vlK>OkRnatPWuLZZ-bRrVt9(FDD~S{vHX!S%7&B18yw z65h5;id6}d@4f%ulB3jr^MR14TWXLb-5VEDXQ|KD?D7ASGxM+cr1j3Z=4u`slBBm} ztY~zt4=>Z~9>bNVF|Ex*c6Qo96;#gq{+G+?UC8q0wYW6eHLDO-niN_wuux%pMKT)5 z+P>IDq|Bf^o<;L!?J>V1YiaC@OzL$mpxNTdC{T`$0#h_cNRlVi*Q}9!gNEV=Su@Ip z5^Kw)9cNCioO4Upr#9mrWqw9y2#wYnCVADhUvs9F%L+Uo6vPC2{5bArwfy6;MJV*4 z%Y6IXGRw&Ld(6k_JQaSs8vvWj?WwdT9%Y=G8|Jha$(b@_H+Z*;oG zR-4-sUj$OU9I8cM>L1`u-+Y2 zYj9_8RinJG=x^!`n*DhIRvzUv+E8?n09vkW1-ngaz(r*nIT;W;(JV`$1vlfxPQAEh z_A(^y!V>nDSFxY>M9}Mxa5BD!Esw4jht7*OiwkkV_b{`6rZIEho*kyG*&ZmOH6HwW z=C0C~tBNLf6~M=7S>DtZErtnkk$US)X3hnr6YoF?GWh)ZQCl^#`OlSzz zrpFKG4eqwJdt6O>Kh7C{9O)#~fKhaChSAZM7Fn|l&Qqaft!Wn>VEPcCuji;T?R+j9iXx$&_L!Erh|!nNF-e&`!*fwx-^Qdu zl1>15Vq$@v&urZ zepXLRL*(?7cm45?W5n5qG509u+FMiCZX>R?QM7eFNnW2|S8rCcSHMyJjP$UvMA9Y%oqJv`9cxPo+pO~+B& z4oZnJ*y!%|Q;y-_%3(?meBL4@g8kefgPKm0U8@aC}mKF~L1>;mr%cGP1BgiWt_v3_1%6I1Vgn4O1%khJMCh!yLh)V;JA30s+A?^b+X z>anf;ePnLne1;2C%)1wIaX#NSe{1pz)5me{JZ^Y-<6g+B&)(#xrfqVWSoK`&)50TP za5$w>b)q*`YMyrvo?-R~stiu&QOJ7D;TdtJ742_l74FfrCmv@RI8?+o2-cfOMcs(Q ztcty(${$Cy6Ebx+#5P<_qO-O9LVxL5syFQwjlPU77f!z9GVDwT!`C85nUOXb4i{-@DuiVy)qe>W1_ab+3XXx%=g+F_ zHX2nK3@8Mm;E?SMi3Lb|K&r_VgSoKMaOx}6T!`}m@Xv1jtt~9p@1%@{+}`Ln-9-Wr z|EEnYq@mM50b$5bBE@eB(bp^0|LPsXGWyJ@KGFa4Rc%@+J498Qb((8`fCBU|_UF`@ z>*2^5*soK-wc!`kERy-6MOx%2E;SDWO7*FcI4Xsbdn5V)!V%x;lF@#(St~}i&(Bw^ zS^rvrz|4?k@F^;N9g|r$k}Fg8QC7g{M4I!>m7{^nAa!V@YoOtC$5PIT%aLy}g#WP= zgE6=MHr85%tMzgC2T+Ue|0H-*-@wsPMVcpwHJ@fFErlrQDFj$+fNv(UR!= zhUb4W@#EZ;No{mIQxB)Q_E2Er0k)4d(Srn;m@W{kqs4n;wjI=FkxWPSxmM`&#unRAq^e-*vNpNFp&@*(5nB=0ej{}b>!T<6MUU}xZT zRkN>DA7@j`R1&L;H$H+dCI%cAw{fZ;sMiJ z``}mGEv0+bF>WEce5Q{l5bRvPhgliCil(6QZh^81XRxR}Mw0SRq8jsz8B z`8KRgM~)ejrEDO*78=`a-{}l5ot(k^3bj|Qm?RHLCgk8wT9V}U&rwk^tuYk_a` z&1`a1L!W*)Iwj*O*!%HgjcgH#yY6&$@xK8+>K`wx<1Al|8+HF2Kt4 z`up2#gxfFB<=wf9Kd!lbJbW|fWF4`g&>v8$eb%G3V$KO_50~f(hzF77Q6`BnlN)@R z)KSb1;<^Yo=j@D}c+(4=l)ac2_s&bjc=mZd@SuQFT*?~_EQBtUKwdDdAj>X3hQ;zl zNe=qGogI5_!3sPN)5D(X*^Zjtn`V!>eKpu% zQqr`SkdVlm;b9wVtC3SmM_^JJruzQ~`wFNi(>Gp92^9$uLAsF!L7G8Iq`N`s8U+TB z8bT2%2`Q0Al#q~=E~SwXL|T#V96Im&xohm+{oi}e?l~j7GBe-zz3=-xzvmZop?k*d ze8lv^emi$Xw1(PsaILC>Y!x!v9(fu&6eo-07AkyjC`tP6L)40nviMM6T+fd--xV7a znrmEVQIrm@pillxJJGLc>V3DfszlAYVQwVB;`3RYd}aEOr2uq`0Yhn|N2&?%w_Rlm zB2~#~Eq>c=L00WoV*K_^!S0=s0z(k%#*4yl|m>rP1K|(Elx0xa2H#?hMZ?0FR}w zUbj^jwYt$85&hZ=GDEiJonm5?k2aUo6w0=XFNHDLSUueu%bJ_sQ@+A;Z0b1^=Nc!= z%^%mvP72S^FKJ}Io8vWUm=({-s@VuU=ex@n=~A^5vNAl|!Aa0D<7gGL#AXz|xtugj z-6d84D7S_lSPv9dVVlm|JAU8KQ2lJ+`Q>u z8mCy;RYA4%ybY&7KSD$Uo%mzo9DA37jBTJre1Lh5QxD9Sb?Q~Gu!~R>J)4)+)Ii~9 zK1i8=?m{VI)+smpVr8y;=7p2pWmK#3-e?5PdeZU!VE3)VgDcKv;)Z#OIC=6IxIBH| z1hQ^%6Ia_SeERm+UDaXcb)J-!c=?7v6BrjW7_S+vfaP5<*9Z! zn!kkpyzWaQP}eY>w#oSRz>&04;w`L{dBndwQ{Q2&qV_pd85 zD~okIPKtG>x~EDWkM7&}*6R7RYaMf3|L+$} zV@s6(4bJ}8XCexqWcrkTHnKnl+{}J{to!iMm+|GdKK^$!0jM7EvA|R&8yZ0GfQjwp z?RCUQ!32oUOetuu-S4II$7SqygVY0F7xRw)yf7dPdUBB)>?|DEb=@lWz=g>$T0#1#<1n@$Ww5}(Xu;dYN zLEizBl93M~q;N3eV}HlLEnO9SO*=gkd>*o9qkDHZc*r%%FXyoNQNHv}uQbu@l_WZS zF_X45-=Z3swj%sWSiWM)KIQj=+^>s;7#s-7HTm~7RsV_;ye*V5CAm#Q-}S_`Nipp9F3G}751tQOSwMbqFU4n8q2byA{ZN;N~;H8kCDT0HPb zeq^L5qM~Wa_l@J1kw212XKlgrJU72O*zu2zuQ6H0-`OJsj}s+%dV~=B?vLH645-n1 zo;5RL5xnkT!Y~Zxn?Dp4JuWlw=loWob%3JK>e(M#2N2L5U>|8IA@11aU__7P1%|+4 z(@`?Zfc?ORNQP)zfb?N%{WWztOT=VgO9e5by!L`?YXr3eSl_-Q&Y9fX3OWbrL??hv@KoRg%&|X*@6$*CgQDfU zH-)#0lC;S4nj84LQz^wddJa7DkBj!3C5y+VVw?xyd-_IpO+oG_n@ak-8l=msMQE{A zo!OxgpsoLDHn|98!EM()ar6Dx9oJ#u_1SYW0^7?~sS#Ss1 zxKU7yJ0MUd`+i;ELBOqnBJDtoS=>D(9rt8OWOdjMxG3ckAQeO>H*X9{YGrxE28B*W=KLNesvoRsgnK2y<96>(yL`d_v*i-QIz0 zzE_wa2&sP!w-vXok{l!!k{VgX=^P=fPOjU2YJ4!YudSDV=_rOX)nhV*A4Qca1*I2| zclby$?{Zk~gBw`^MhAQ*QpdeO%y12eFmb0{*zhWZjsv*!D^!40v{m6)Yt;18eudtk2k3ls(uJu(yy@ zgjj)Uf`ZJ{ci#%ouLtvi-8%O}`kk%SucO@cd*+OJ+dw9<;qJFHY?FFs0(|0%R0;19 zkZcAIVUB;Rr6%zu-o$-)QMBON7o$)~e}Tcz1RVL_cQGzNj=9NSfW7mCIprWR+;cHE z`^X2F#Lj62V=+QU~#~{gU zx&R4aWJmDPc3juQ)pU)W<;;LEVEoYSW9dVOy|T}$O5;gYsl*+hv(rHQEq{aAP(m+dY#)#8|aQHEyeJi6b9?l#3BUvE}cBk_Ng&Qwujz zd7vRLHKf#mT+4yC-}0CBL>pmw-8e887zIp_c~nV^s%Xc6flZ3NXX+s)$42%gB!)ue zIu(^tgRQaM^eZ^;J4CIUv-gQjEPGUj|mwu3S6u55So zLr>r$kosz&wM@_5B z1rbv+Vh@Nn97ZKHZl8#=I#n{D33{~df-)&n${P}0p~zGDEVby7k|>`b;Yu)nuT2|z zVnd8lIamc;f*l+FL=q=2!~1pH;mZWVS0=WA=i2fk1hEy-iJcO>>cQ<{+%V3P;ENY~ z0cYyL*@tSD_0p~=w~upPLd8-jmQ{SJ38&CT&sD(oDFsB#o}&Gt`h!jy(8Yxg+~#0D z<;S@E0wup%75{ax{;3*gTJ3;l{pw1J-n-PRoJ(Cwf<~3y_YQtlhTw&|B#3`ZK;2^g zbzc1S0uVRx_+)b!a)`K4;(cSJBH{jt*Kte($#Jd+`r`0thLdtdwEOc$+2Qd)jC%#M zlBaApTi+69h)@{N9BPhJI^<7mlT?L&LIdT#hc@H~zot&`5jNC%xcEUb?;{bVPk<>~{@{ z=mfkIUSn!A-vC9pg8`AdyTa9=mV?N?WT8iy6Lb8y>%zo+yPV%7VD3658$zhVjs{g|HW7BG0*bE2huSg}r(e!u-g^!3#w9~55a zWY*0J9L-9`5sPY8sz*{F9DX7ZV-29YL!QyY7}7Lhb3z8Un!oovkQ0w-UnOp>cA5>H zlRy=C&}ayyPKaj{trv@Ie+xKgaQ@1YWYA-Og?b0c@lyQRjA&e`CB4YVt2ODYjFc9JNzty z4{?@4>|jA@qo@Fl18lSpq3{k;#8{cXi>x*p2l8PJ z;_Z~LB6|PODE6^pU+^c(o9Y(b?hH|iX;j-xT?5lDxrcO>h#q4bS>kt~a1kK=5!83w zdx{qxzVY-<2r+ffwzAj#AWu3OoK`o3ZihY&u8A~FG;0#hAj7dg0)G$zG#W_pd#e{# zrNTu9e^7_U*dyO6H_$oFddUN-F;6`$@wfA&0k@v|M}BGb&g?&$XmnGajRj#K<4*?f zc#!TjUkck8@Lb(gZYCO!>5;DI-*_Tg+&!mW=$2o^wX3SKg*hIQ7{Bx)o0HJY=Z3Yn zkk!C@2{%xbdsk4E7)7~FLcDHzNB*vXAe3O!I7*DnZrrNn^-d2e=6EVdiE|z?prRad zfQm@6q)vc4?nb6)U**mHV@0TE;{m~w=ob_Fe2}w}e4DNn>!VMHaf-Mw%hYi+x7JU^ z6hai!Gy=Uzd-r)+f4G4%jwyd$$xt}M!L#B53Jxmb#7o@}YcI@!DsqZ3f+V184X1CG zBw7s6>(z$GK+Ln+lyV|2jYlIRZb&do9#Jv-0*-p`4uUh&H-zbF$gM?9L*AQ?cYSPe zF6&1LC6*m<6qG$v&>~3;xuY!A_eAz{%vq_V-UhrIyb6Jj$SyOuRv_)|P1q0pmmXjL z259@+8#N%b#^(@(SAbeZShg|1A=F_V5KOim!rg?$=`a{q-@!+Ps3#1U9iCal_1*4B zLr;3WroCeApCQZ}RM!a7AVnf^Y&<~->(&xk8^OU8V1jMh`jlu+d&|G&!4lXdiNM?< zN17U~g=lU@p1voVr?{9hxAC0MqA%jY+xJ8Z9nCJFsPVW=lqwP)T@RGcmGe@i+QSVS zR1TmvK3x+8$&wFnf-T~?B+y!aoqmZ_%?1y*_Y3!jct%UvD_V{K(7!z=B_p>^tyZVA zpBnD<#=+F$C>!w-yny}awjr(XAalT#mu zBp>zLIXwzEc`$!JAJ3|;E(+7;dmwAX%6=+sP!f5N^^*4)`%LGh{Apa%piP&D^HI}X z4Yzgm?z_JuJ+rGHb*BYY6If?f_Mi3h$!bJ=s<_!X^7Uv#Nm?J^vtw|Z93WACpGt$=Dmm{ht z!MO!6UZuzjM9wmdi_9fYq2U$7t&FLPhY|GY)+gW47s&P=sjC^TKw^d~jKZ?31lk%I znZ(YtV$7cWv)Ap=B4*)u%B|T?$P!72gy#jq**3D+;w{x;mn9FEr!1}t)bpLc8<}o! zwcrwxXz;2GDev8^C>F!irHi9LVh@?@Y;Dw3$%hQ6Qs&lm7)y^Fy)0a*mmhKta z+2TMxSw{)5Ml6W2p7g)=&eldo2_J9mTI6?u%Gqz)TWEv&nPqqk`S?@dn1Ifks*#M) zx;h6I{A@~FgkgqaV(_8e>Cw_saOHiz)f=OJ!!0X?Yh=!5SBogh6@PZe>F%V@-}uk| z;V2^0;?f3LhAo^K(0 zXDxsO$V7E^rf9Vps@%t%6==n{4KSCW;3dCACtzut{ZjmyRbB~DpI&JM zH?LnOZReF4Q2pJ5N(9BnhnlpdlG}+raz8#{x-}k=BDF@&;|hP*w%UH4{$TMIq6aaP zN*RZGuc&epLS{LqD`oNcN6Kj<;!AFxbZn{XmGT^eC?QDKy3WrDS25^ee#{Q!cYCa zDsod7DNmDDYPKc^R=0b1*1fuhLP0oTt#nC!=!v`1>Km({bxeRrBy2II9W%F-Chf)R zES6Rqi@#KDaugpb^xMQGS?3bFe5{+zMfODoyaNoZO1S2X$Vc;~y%Zru8$%QW(dqN} z-J8Or?wVPfk^IDXRbauF#FD2Uy;o*Z?KAKGWSl#%j~WWE_3zQ~E0HwKM@TxWI=)2a zXCKSvTZ%n2(eka6?xc5Nq?^(HnfWjfM3a*W_= zJSg<6N58?78PSQ}tQye@-PT!nv^X2N=LSm4tL!-)#?dR)-Ger-zUzIl=w~_UKy*B~ zFy}4Lv~-Jm?hTJYVSks-gql$p^5Td6gvn~|7QRWJ&5v*Ta9gI+)+h_`-h{?}Y=H zS2M}&@(}o;Gukn32tbM#X9zBf$Ft`r&Uu4#MP?fu_dEzcqAGby9XtSUbXL9%Po$Bj ztcJ40+aefmhI#R7+Dh(@AyT~%5G~maB6V-Cj1DI3e=fFAxXNc92%^*#+yS&O3OqAX zB5vD^cJVYgX6;0FW7hIAsZ0Z8DWUL@-=ZRW4M6%1tJ~RNhA4=1uQkl_@+%`LhJ_q| zAy=BGJQ2OWb0Js^WziKx7G@(5WKd1lC>nvE08uWxrar(ZObG;5@2+P$dg|gm=xYHg zh;ktyhjMkxYGXP!=SSMHi~~w$y7IO0tscX_@&5oX`E<}N>;RbMU@h9q-JV&3TJxNZ zz)-VrTJFWoUUnZNtHbo_{kHp-nwkj@xGwotlowgTXUq<7>8OQW>q;BY-jz_7urWTg zFK`6dxbs0t$q@%)%ScOO>z%H(!pfh;p*lBa-^VTz9K$l(yO6`F-x$cSou2#(NV0R2 zG|kh6HLHf|Sv*)X&}@9FS#CS4+)}&|C@8*u=DG(iZv{YjhJY@LRIa24B|LRr3|x3* zTK<_bO`N=F3=K`?;7`C}FJ9-9NWg(*BSeQCw=K(<|Iq1+1U ziZS3rHRCo#6;n370R(m0@@3hCI3BXzz+B7XYNo{Ho5GoX!8>DN{Y{?EM*tv|sH#zD zvl&nfm=@0Q@tq7|H3rIuw-=|R>OpR+1WKL1?R>HS!9Z0{ zQ4|;t7;oj(*At!SNQK(}Ip|?y0ll)#Cnm4>_OB2o^-_g+&|_FO4?ge!q~Nu@1N*MC zP%*CoSuc)$VQjSQkQtbj)~6KbxKLnC$zO#}+qHQ15}R8VZW{7nwJ@xMsOKwMk}^>W zIjzB|Hp;G=ofGMspj@LI+<~YZ=8_D2=KBDOog#)qNnm2dZ+Uj#pCLE?e)x7=RcvLN z@VcW6XJqgWaLoA@*@To9iHP|q+yk&DD_{i@N=usY0?*eG82j;NcI@NE=Nte}fKR|< zXKL4=q>yMTW~qdW)}@`k0%)YJEG&vVfe<0a!y98xGN`^LNyzjo`Ytv|ee0u=%EGLxUCTee%=!JdK}+H)KO{4eDpppR7xQN)pH!M$bow`!NL{ zFt-Rkguo(eNZA=tcWOjUTyR>je?Md%$>5}T_o-H+G%j^4jrWV#ufgfT$pD#dSaSuZ z^i|U6BiSwpU!+k{&e{ZmZadj!ervjg8VWUU(CU^#maVr0dnzX_31M^+GqGCYq!=?H zq46OwD|{!37Qy<{lf&$`XRH^*d*>Zx+99;#nCJ+tdNu^q&Lc(p;5SxvUrFcy!V;CN zXOXr(tI=0%VzrNqcb$*eP|1#$JFYteMP}H!?b^V|OWVLCXx;S?Z+DCbNc+4?LLbHh z9~+Ga{4m!!-}j0Ec)q6EQ%*!v4}d$(8*aSsfii}^$+*ps%VW*L>m>0Qg^Xro#+au@ z1UB}_$Mn7%^J`==dAz`-s5^ZH=)$LIS9nsJ2I z7n!r7lfuRYg>SC=Y16-!WDC@su(~z^=1{_;H*bgf(Z}W$Da-ADCi#lpvJx4(6Rr$5tte0tHKt zWcZFlln9QT{xaJhsc)9)^QkUu_!iWIo?|@4sUoB15$Fz(qrTX?FC5LADoT2pc)dUR z7oR;rcypX?A0{ib~dvx9&}u;w#Zed8W1QI3iYur+v?t2dJcq53i|FUHayO zRw2iP6kf_#c70H(5)#cRC}KC13;ku~&Z!7AMxw+waEc{=VOhE@O4xXIf|gk3SBHre zpvxYRsHls;>BkjpOJxje02eplg;e!wzzZ;j0~5vJh@L~zhwOQupRL*Ep@s8|ey9y3aGe8%j-5Z+4e_XGIV{tl2j>^oD`P|}x!p3)sa;?@3Y)%U{r${6c}o5z5zV#)jz?C&d+ zb9!dT8FO<__~#vw1X!u{N8?yk`6h*(C+W@QT@sC#22EYAcEvUU?b+4HGFlLgCHC|@ zV7oCkg}fLC!?Uj7O+{&mh^FMNO)!Zn8&tR?89n{@ih%$xj@wQc;&y~VT5Uo{MN?gb zg^DEOZK*2SUCtohhEF%oRlV#1%Hu`C8^JqZ3#+hcN~e}Br3IR;{XA3^*YnsmY8zTv z?^H}njz&A&%a)>eN&|A%Sf=rJ-geAhnz*|C$E@r(2%2t68XW$lRzb1;kgZh_txDD_ z8KDs_s`KQJK`}0vR(37OX-<(A)8tmON3bdMJJCxShFoKrVF6ZS&cK@rjfe~92#0?&PgjaYQTeveP_!tHiX+KtO%}`*860gc$w!pJ& zqe3VTe1(EWp-8r;c*s7q0L?TQ^_YVqFZJBYa-hCiAYZ2VBr^k*yf@JlMUiL{{flS( zen8;<7PO;P*iA~gu}A#G?ecV)pG)CNg;NK!)l)C(K@_5oK5mc?UO;lm`Gv-95x~nK zZzk^PAZ*%mJ1^a26X+}Jz^U2K7%$KYsjBavS8)dA>QxGsU~Oo4T<2IJRW;IcTmm5< zGMKy9Cy{*{XPc6}eF13)(MA=47`95V68qq|1bNvhD~xTi0^t=zYwT<36$hC`t8Ds%Som(j$3V(I z1Qj82GWt``uV}R3y-=WX4$S_<`j9rd*n4-?9rXUypMvl@Ja(&=!N3?nUkt{WG}7Hs z7|ZfYOS>GsOHkMT+zik z*Gm&{0KDePfm1;DAR-M?d@msGGOM1=+HB)b{7wYBe2!E6QA|efM!-(uI@?bPa^biUrCtOew5GIv9ECsr-zR_DZP5{!Q56&W>Mw5?X zG$*GgrKgSF0Eg%1{G=@-9ApZNN-UoCh^=iQg5fU)eX;1T3q<1MJ~P&e1zYul+g>il zqhnICy#iJO{PLe9SJ{J7*idXrvEqlsNLu0r*$vW=$adxHzQNryUlcqUCUVL7!~@r- zeH|HV&P)|pIWQ6*g61RgB6ee)sy#B9VzTy`TX8oZBOF;_!5@D1&;}vgp3gBlw^@ns z83{(f>MhoNre0htGOiG^{Ylm7KZ|uFiPu&(@`EZ%7&1i>=7{@~ zVD!6v380`8}!8q)Zc)p2O&FWG_*2CWbc5z zQ^@oK;+XKN5a-wHK}GX@uap$!ya`pOrQkp^ZdD?`oP9Ot&*9Sl-fr0ZF?v^L3@Z3L z+=k;VsL{`bRXN+lGZ*%$x;i{%2ikUm^CGt)Yhu&bU~fue+VFf#;9yY>Ikm;QAceC< zR;XsTf)D4{z{aw#PU^$b=L>3+rz(HSO2rP?b?Uiseu6~*{4hCbIE&sNB%0slr;=U~ zbH7cbx=J@wo|3$swga~aFOZ`s&{8#~+B=cicr6z7)biiD+ z!2oi>L?sRY#xJez9H0`QMbaRy=70aAPJ{W>*^GuBP97iT_50n^D~NL7c56lz zjs|Bx0*ZpktN<-&&Mm>XIsW1T0?6ctS&|$zUw1?74A2Q$4J`Z*R(L-vmL)^1PBM@$ zh6;S9VNk!1-(Qh1wSBov^=F$co32Vy2{D2IDe5h#FsgWgr7a5OP6IjG3OWpQ4+^C5 z-o2T~4;fTI{+U1DEmpzbMhTeoc5=L4fxe=8kbf$*mD4=5p0$s7SjnvP&tVx z?o;QLkXD;-WpASTo%UG`kEB)gR&+=k{%o%d>1gy#5xozJT? z$ADGi#Ux3*3yGt@f{wwQ^?y7dbXYTx%`-Ox+3(f=_i`wOz^-iN%N=Y-z}avJFoO8Q z=1c$mF@7~_)6C$K^U%Qmy`uy$kUn289bWT$&c)j>JcfQQXhPG+<+6c=NCN1cB`%@4|2ZV*X%;~9Ejgv9Df&d!RDS38}p_XONHlt ze+3)q(lG54f1tEW(}@%#>`tkn9%1+&mqDE$RF6tQhPZzaU4JaYfJ*_bVTt7i1CE{A zrG6)ha^t6VfNEmOvJ0sXMA)H!~G3O%iw=IVCVQ>U%UM_08Di`4MD1p`gts9aU6qb_CT#C+FV<2 zZE+8P4=do`cTgi64=i$?C65E65F5bDN$0BHn`9O-Equg#d7a$M=Wc<~yNa_HI(^B2 zaneVqu^hF1`Bd|T^liMHvt194LTR{%BOxpU3Bq>=3Qfe4022~o&7z#S@yWrw$a_kbg~SRY>8rPrzY?;t=%n`Jf~{v#Q}+ zJn{a?C}hWKZoB`=;eNvDlxoora8lt< z1qa>&fA6^h+Tt2OS#t+I0X@3z-Ou^l!APJ@JlD zM3ON|VxPJQQ(1}hTus7A$!?4p zecEAMpH!zybW8qJ+qb{G5smndh1jnIp5i5|cZ*rF=`J`#H;O?=g&F{2ZwCOU`K9t% z$Y1-;v5i&nP`>OsgLiTG&NkrXJ)Qu}stWxt1GglAgU?F=xqfD>dToe0NTD(D<*u;r z81T<>2M-Af3{Pn8r)qbO0iqu&yBiLL*M0?Uh}_c(l%rAoluZTe_*}Q|wCOOISRK_0 zpN-y8PHaQzWmkY58rmmd9r%HjPhU1p=3YPfVyDO&(Cvsd!PfW*Gf@>QRpgFttA7r* zLVy$tYL%&RCpXs-%P%{KKKM8fot(M)y}dSE2DUi9s;q#CA|i^wDow^=BaOgRR0tR@ z!SAN@rHgn|^&i(H7*+@5%k`$NFI8{igsS=9nt3M5yP0T8WB}j?)_{fd z3JF^GlYP)g@AgmCd2RCt_JQTstJST=B7ofpjIT|`vinYt*ZfTH0eE#C?-(Ne0V5rX ztDv?}@SaMJD!9-OxpR6Bw~G@EV-t$6!z>axaUg##sD}pQQ+sk_rvNVCi0#W=7I4c& zb__HtZ32W$E&IUeeMD7c<`R#0JN=WPVVks-85d_OiLrb2`_>NvVK}qK!KrN`58?2U zvSI*$3nNNc96`ZudJ4?I>;V1Jck%1CwweS)fgFXHmZQ)7f?XQGjMhj05rhDbmI5Bp zD6sZgHoz46=3yblax7yIp(1pqZ%pAdM%o|2B8J_4SI(%YYL?O)Km>L0 zOQz_@zfX$vd!%^IHIi1OjUsf38tK{+mpEf0u*f=Cz(aE`n@T8$G5Kt)3ix@>)UU(q z_X`*W1k`;0gbTK#)+~kVwSYM%-m(i!3}+u&L?w!QmYmCl{IEejiHMNXcNlpAxCaNr zttG$~sqg-Dd-MPpMv2X*KRQ2g46cN024!)4>?B?p2#a;;z0yk_5Ss%Jv|f~5XNHUB zwh>P{W5C9;Oz`p*52s_)jLYUcvh)>(6z0dlX?|V-lL`x1{auCVzK*ZrbX}T+jjmR^ zE|~u?Ugubxt0i9K>wDP%`0IAgl+mZ)H@KTZ_P0V#roaj=R*Y*5WE)80NcTU+#$I{C z*LKqt)kb!iDh7Yb7(`u9BjQC^CV891EZ#%rWI}*i_rM-jmR$tuOeycp4%TDgEv47J zYkXiP#vhl29>8xxTIP4pq~`!9t^utGz3u*t_oq()?o5Gk}|pX5hm z)1&~vumjkSBVcHuJ-bD8T2=TA9)>j>q1MoQFCvT-YmjV^WbpnQ0|T}pDI+PD2xAMy zF88DP`#t2QP%e>K0&lx}0n5_olAoIa>%idcEJW||vwV$us8s3VzFaH8@`w-U zUjs?^sBfN)3Od%OheUK44{*qcmvi(D-tJcHeDgjY_0u)>me%GR(p$E28~kQ+xR^I& zwGv#%SQisTbh5T<`EA3RUy+5LiQcnk4l(!5^ANd8^lU#B@oh-epvW4?yUaI^Rc=O3tlVJ^kDtl+{kzaTGlpkR%gUn&Q?iWcLW)dM=8Lb z-l|BJQFQ!e$_H{vq;~7qC>}Y}dxe6>xvWHx3Sb4_SOs245oR6sNp6I)B`CHJh=(?+ zTC=LVHpseuz2Emi#k_jtw(IIp@k=pb?N+x>>C)dMK5NiNhTKk+Gd2Wkj zLeSJjIb;x+7Fvy9((OdrYzzqWRevzHa0DJSJt~BRFBFtr)k^yMG$E%ZaqK2wSeRVb z8pSpa+$kT_N7?ca*MioTd*{LGn8?cajB<8EGdHi-F0)bV1@q`E9XCIFR#tquldcXJ zA%=b0b?47>3<$W+$0D~SfvPc=uKfcj+{_!Orn-=;B@%7Z=tzflp$2}Tc|^u}oX%Fd zw#y>K?TRp?GxIc)Hi8lFDgM460rILahO&qt@F2aTeop<4;#TnKDiIMCM(F#sEEk;M z2&`gwpJL;vrSQdeXIO(-?s)9NHkyb*DMf(#jA$VIb!XhGO7FCAIBs4S%O@d6dNSXJ zmY=uz_Z@#4fYFS!@F2*?#CjU;&rnOI!L^|~nIY>XccH8PsW-*`(2#gM^i%u-O^aIZuwocu-q%WS z;sq6}Y1?6+hnJ9xe-vI}|4N4qS(@~6g7^~66w+RNBkZ+z{DKcSNNUbZb`?*#!CR)5PBsw>YNwu5pL@>Y2k?qnQ(Nlv^x_zF?hIXhUrO`#-eK?twCbSV)Br7kmVXh?WyT#(k;FU@V zzN|t(+o2c05;-|04Rm9#0egupydE87ZMT8}NIP zL0A8+Fv<6#)|QRjVr#s9QcSs62oF!4H74%omy_q%_P*qzGmxv5?ZQyhnJITyYt4cd z|LdXv$SN7){Aw2c8M2QAs}H$)ejU)$y}aCB)vuBF#d1(eC8e`Z=pS})97v5Miy%ru zkMfG{T?p+_?TK-{{K=T)K@3ZiPIKwvrQ)Jn_A9J@pcWX;(RewA$uKO5uD(|2Os%LP z#=dSHLAF%#l%1tY-$yqQ?xq$Rt{0CfR~+_;;p-R4o~wfta-MQiVNaEh%LQ+Og7p|# zfqJ5+y+Jb9d)yHMTYKrjGZz9%<@%dzL#%~dLg0xXC~&|1ln3|1*Q8XxWX7F>4iSWJ zfkp%|_!93T-|Wx!q%0X=nzx3$2v;-uwJW{7h0pYOQBG9j%2)6o1}#ks}HAhUhEp zNzeKU#>nkY3G=k|@phzC*6-II4M-kEB$HQQ#|Q-RW3n;A_6~1tQ_npvf6{HcO7}ei zE5q36-1K8#xXkJ03}j8ocrh}0{Xxhs>&wQ>lMnoozxK@^3o1aA(cj6;hK&LbOC{1D zX9|j%*)5Bl-1rgK(M+QJU=)5sZLOee9GVRDU@+agNFzRU#uNV~iF0{EW#&wr&{0;5 zY6%1sWYEKFWPK6?)wZ>~KW5{dvYl-UiOW0&_`z0P-9y#nl9D`)yKR!Yv{p4oLmuOHQ73WdSpr_Z&8rn`Q=bjF&$_tIe*1X`y1EI;S{lcO zVahWkncJM(K3km3pBz>Iq_Gvd7sINyqfF37>*wPY7T7u4@ydAkJd+3Hi&_DWi^RU+ zFt?+8mbP|dqY`ek;nILRF_<5`N%30D6@rgkKYifTjL$j*g3F!{kBzs@JSd;*kt8Z?!!rR=)@Pyw{KHO2b{`EDNpZwF!&o-V{A}9oV3`dg9U3r{Y{Xd? z-cKH@cZjIZXd(sU518h(%+CMgTm{dE3j@)~W;66rV~L~ouF-32to1UVa~U&>n*#n2mYJw$fzm9YO43D9Vk=uMf=QFo;4$^9MqE_-9oC* zrXpmc>O&avs-xcPG}7BAV3hofbL|jIyo-avtCbOOA z35HaeAgnSqiGGun8cUnD1UptajmCGJkfD*(1Gk1%zWn6&YyOl5dZx`{t&=`1m)5Iu$vD0&#f- zsa=t0!HuN$qOw&INe``Q zT+)E>hREi@lWD`3ncXqlFS7IaIE)lHi^3h?ZQ9fCGHXitA`k;x`Q^9vdbWpyV@BlZ zYhI(R9C%bmG^K}eCco`?vA7)NaPmuz3hTsu*%HwIqCdR2D_A0g2TR`|eh&15Vx9wDRxX#KNMU0SVK#oWUGEJHuq`_( z77EVw-{>8nCeXC{rZDxm;GB8V^8lC;HQQ&HjM3Pt^ipslZYBcO&7z(mJ|q4e`H0b< zv*Ic8oF;tITk1(guYojj@jbgN`VLY1%{v)>?v@lW4B$-{NWa@CeD-S{qsO@{h-pf|l`fori9TxVg!?qiRAfcfDGwK+(486HZfBaEIlDx% z8M=ggA9-h@J52e8vb4nQ!)9mYfV;AY-h7VIn+3ybQ)RpkeUwlr93Tq19(XPZyq$gF zz}@|J=72lYjg|EiqGN|bsbYfi&pqdy3LU}V1!e{XX{pc7up9A(=OQpP)+1HV>WC2L z+;?1yz%!u2jm@AFy=0pjRJM2inlN4#KZ#|$LqRWnNTJzn%#0B)-akFPJeN#bMcD!~j0 zV_8nY-n{`QXY#*zg*W}?&Lex=Ow50rpl@yQWqYeLsBv8r5__<#Lg7EZ4(<`h_hjdjA{|6E<^x3Tbc zbtW@Nu!!`>@Yo)D0{3>4tgb@4vV8^<{r*$lpI!jxA3?AL#+iSu%{bEF%yPr)WoTGo z1h%1rXbh~Kis3#u4Q258*_Q%W15&>++ zH{9DWqoZPA+@oZ&a~NweL-8=Ag~{Cv1H~c9>!LKAUVXzh!ACk*Q*ist{RAVhi`87Q z))CjPO1nj1FOC)#Jnna@{&95uY!}s;F#`{AQXwJKYTd4B63|>HxPuN!n3)I4uVXTt z@%4mIB2b*tPzAr|L9_pGwFZSyE&|gJU@gT~@dmAsXEnj(5zuqkK?N=F_E-HOng_m~ zD#Y(WK8wzoXsN;&fqy(Ce|M_>Fj9J=$4jlV!gRHE3IT!N&ElqDC2Fojw`^E%iBNyo z%nXzXn6B#K6l3Ee^%IxdHs?#%q(zD`0z-JOGHo(jm|N%88%~0AP)Skf!Go$09@xTgYci1d#tL- zwvh5%VTeP(f3^m|O33hi^xP=eBkc5yogZg+K;$cADkQLL8+dpxGqfI+y_*#OHVeo_P{*c;Q&pzfN{xq1mGsoY8hZnW2^%$ zyqDD1_fQ>-$WdiKjLS3IrGuiTBuE=UqjisR7wjMJGBX*Vk+5+ksE*&)QSWt3C4K%0U5m^pm7_+Afu8n0AK~xWnL==!51EZwShiz6-wQDOtlQl5CeRT zxz}`%WC}`5C1_|UFM~2C0B;U=6tGR;V2JWy!gL$_>=l&eRb2+2sR5tx7M&X{=pm;rnbo+EeD)?45Xr9vh*4~7cqu?l2{t5j+Udn&5$4RXcq!lsL` zm(TzG7i|Y{GVegwlFTEU8Yfmdor!9KO76tfglOmG_eeC1fl+#|P6MSriz=x|#C4)! zd(_VH*Uppf49)_S2lwq8MQnSHuO%j4DjMs(IPA<^{i3?UoTt>N_n~$tZ4I#MpdG2j z^CL68ROl(m&P6a|HnPusHFX?XI3%5)k&8>=U$%(_ABRaWx@7;$^f!(E7 ze*QKx{B;O7;9s?YaT*}VG0u`LLecbkxsUjl_R^QNA)r>E7S2s>B(?6XRqxrdNP z#bCY&kPlcv@3-OKLV?Mfe^YC*dQ|_dukklWgkQKi7yeF(Jbc5>JX9Fua zfvyM&5#<-*(|Xq%WRC|{x_aQv<(Y?M9pl_tJ#y11Og5FDC$lX-&Wk#*!5o(|`S4Ju zT%_D=YPHD_{4V|}O6_44J#@&W6BENK&4QmqE6b#b04kce1#}!iv&o9(lCF_Jd{W1$ zr#FON4bci%hi896Eo&v;zVIs8Z^aD|ev)j2iXk2tcjb31T7}+2k}-!DJ*K$_WZQlq zeY1)&fMHi~0GKK)Bw~UAr&!u9c>F(B_Yj0-{u2<+5ebN=*RebNW~Ja(7sJqS?l4Bn z+%KqIiZynS>6ui6iNUmQec&-C=&*f5jzbp}ri)hDH7@?Ta(S#oXO>#a-~qZO35mFU zQ+7&$-QCz98$DsWMVx2722!2rQb`kWW0C2Co8jtre{5Lmte7V@dohpA*hx+R(D9M2 z;HV&TP~da#n{CLL0g4C$#vLs|=P91i+yMj8`ggSim!#8{p{d3QM6L(vI=dDi1c>`> zLTsR!lO{_q60+0RC<@*my;t+mfxj(uMF7=#b{*O*0P$op0;ie=XnInBox*}!XcHK{ z1=^y1cuC>y$(3sL9#SwgFzk_a6tSInB03|CS2=8=r7ZCsG~#DC z67Jez|GENn>L?t_7_|RA6IE<9)8>=XhohN8MF@>aq@z)?{Z#>6ro#_AGb2HK&qgm_ zvP+HC3TU;p4MWMy-QQ3QC?>#PD*X8=X-ksCA>%Q;L_jmv2=sdjl zYdl}i=kq1AS*r4S4kPC)y=M^Bp6hWU(iGK_blZyp0aGN7kgXJ^9e8Kak0bkX3_b9W zNvKr!V}cfKz;F#+?nhlFGVG!B=rZF!a>n`p)B2|DzU1X{ejze1%#g1l9&4KLZPjP(xknC0_|B^E zj#!-6{Tt70dbDEegwMjpx*CMM9_;4gwgc`WJr?hf;z|k|5Do+n(R%1G2wu! zw8{OyHgI1b`E6D7M1@Xrt+kLD-|A+0GNQS8@V4>%XO6W;<+N+F^*@8j4?sDRRPTU; z@I4*M77C#|VHKQy_TkPMw;ahL51%t9aU+v6Badw49To4>_SrD9)neqQev^ELMB&=d zLTA}*$xDMxnI-|s=f|CM9L(Arn3I|nJOYuY=zoC8&whlc)tdjcw2RE*2}#4#o*Tbo z*|dogw$gh-%&e%FsTlJ>r!s9))O)$T2aV$6J#XWm(otpAUAl8(hjpt|QySI4ggd*Y zb0k{tXGMh^;sR4f=ZpYl%VyOZrAK~DyQ+-h!@_Qd(VC_|K0vi)sK@8&Jr*x`1N31% zl92T4cL^6i7b-#BdzD*%^YLruCvPn7%3V7ZZo@(_2*!`vkBSH30y~<+tz`CAGVb|e z`Cg)hql`DJ@9TFdzNY>4ek+Gd&`$e%crcqJb9*KZrcFJBbE~^gRD&N|eSVYmXF~ex z*#7CVOnEN7$GD`M=HG-h@~Vqp-{{evushk^D!eeyZhoI_%~~|1Uq_ekiSgt=$?Vtj zzDWvKMMr$&;e+2AYdEIxd9@Q!DBs>vP4(T+a(fCgdz5wJ;tg_pY-<%C7^S^sHqB4$ z3^?R@J-@QQHwt~v+MQmJLKgl9_ z!n@Vm;*H2Y-eF&?tv(9>!^f%6sLGR7&t8|8RBvjU;WML*ugp>lxvT>vt}qzK!I`w4 z(I~$8=&jvrjwrM(m*b0 zuq{ay;ke|OHOJAE?=9M)3K1k6+>C61(ez~?!LrAx#Jc0dNa>4>IU*9|I$LQ37_V6Up`q1-#OC6lm5_^UM{?vTQMM0mUlJoG3mcDJ5*@`w@Hv`3-`@;Og@je z_2fvn?O@w)F_JF7K@}-JFM7aVn3Xbh8_d88(#rigArRse2jf?gsdvmD9X>AnmS1KK zBBE@t=f5K2-$#%LBV!uuA)^cX{h>}N+ya;z+M!2%V4h%#H0#i1Hml2hhzO|eN7QEw z4(MUe`944@1`He=M#B6hY-N1uwk~9_?9QuA=uku95?dn9{{(H=sM3}yRY0hhh`RI> z+WCpEKv)fg*>KgZyHvlO*)4|)DWdbq&~zOtJuc&=#RXg;#CA-};u}`0gcJ=%|S)K zrzs>^3a~-@exR;p;y;gaUWrLOXhzsE--ZPpikBQrrh9;bGK8)Dz`utOT1@~HLuc=s z_EB0KC7o(XwzI2TeK*L^EpJi!ePB87XO9jd<`*HQl_fz4J43+55xo254`bivIBr`IpccX&h=%@R z3amZ@wE0Mn=;5DQguj*;|+kkeEzU~xIGUe(^K z+SH!!zvMj{{A)^qr`KAKw``a2u^mxn(LX&Vni=JSF)VJAZ!VHKNJz zBa^a(1}w2C5BBK*qL-F(*FTy$HkBIe!JB0~|~=^j^I=5EYB zw>m4SJD>M0#>mKtb6vvmTcZRfx%o=h*R zaWWlE?HhCt3!7qc(SMR*ed(JN4mr{7=uaJ#6vy3z>c(fugg*3shpqYu-%Ii9yQN2u zcIC|Tp4Ch9GU6ip{R@#e0b}ryS_Zb#eg1*WO#YjI7OpcR+tKF-E_+|3Uf@OTgvw{5 zVCR!95Y5*3svbkVm$nW?M~lD{kR4PZPKG=sbhNbn>az5cHA{ddniF<=(70VY6!sb7 zDJmIQe6Q^!g_Puc!qTT2nW^q8K?#NSmO;$9Pp0Xt#L$p&z>L11-2pJp34i_ zh2QwPY~Ou6umw34d$V-VF*L)YrT!K$D2hQn-B;%m+=);;efD;yT|e%p>;2%r&&Stx zUy6f^-6=)Pd2OmPRdKv?1xT1|kp;Dgk7+4F5!mlcBiE`kbswQr&2O@_87v5tDq*%j z3DxUIyzhA$-PB6z=2VT&JQ}n$3z!jLG&Mli#o+s7?-CfXDqk!f!v! z?I_i#J&+xgSI~&eTf+y?imd{~E67>;8FYf7lNa^$eOPhgAhHs4no^?6HPsJp11_hr z_k2wbsWbVGb+9p^GWlEXk( z)z&qmK~$xS;OBu6Jf*lOP>&cjuG@g|D9;RM+J}X{!VXjU5Ahbfp_oa#n$Wp({jwcp zCQSZD>&>293$rE_C8w_dZ`2mrGcn_ZXrc5b{m1*tg+i4Oq0XFvrRt%;B z-nL^*84rzY@OO_3Y=uETbsDc zw_^jAnFeO+GpbifU(M;QT=kJjiTSrA|3(z@VSi!T1=7Sb#KAehuPh85r+Umf+?sDj;X0uRbc%6skGjoipShK~nPk0Ck z7dUi(B=faF`CD}~IvYYUbrLMzmCJ})x$uBel86v@za2fi4hsE;Ir|N^Rb`eHzpKjbWRMcrcIOS4WQl_JM)mYbZvA_0qZSTj zoY0v{$cofj;3-1wkvrp-kUGQ~GOt$dCgTC60>&s~#`Cp}&NH?m#RVamQM)=I&3SL=a znQqxp!?FAacCWw3r*K7I$*CG(&2FAJ$HZ)WK7&+pLUKlfZO>**$@S~NSQAGKG0;cLcY630`K$bRiD(7(BJ;E=%( z|5mRK+cbkvj z@^!cpvxHu-%Q~f;M2&ahW){~OMcelLsTF!kS=RK|$O|7E%*G#J>qgo0uakB16TfbV zXUitD46aj9X6)$ToYS+MO>^h^XwWvCa9&c>GGUqZkRABpFbokO;ds_!A#=@0EyI{M z+OVUC3S|a(g4Ldd!ahdLkB}V8zh?_C<}hG%B5Yl{^#ssL-}bHQEvMbeomWyU(KIwr z<;y`goqhIYE8%db;Ild}^%wQ6rzQvCMY(u&`}_SNe<{o^1UKx<62};|`h8z{KZ?w< zz1*GS8de3fL{UyDn`DF1?z0CE1us+W7AEx9=67C(v5$eyX}EErbW98F;z+vU_Svk3<)#DYTQ>gf#pIx5%gfe!lMWS^g$n7pP67r^ zZ~=C4KIyICdLSBq)XH3>(aN(}XRG8mQqIywGs_dD9gzP(UnX7gW^U8oT0GkQ4qD>_ zXQDB-Leab1ppWZY<{OW%bo=kgU^&Bl7w9lyJxL28zCDStNyhW-r&yI5@KdoRhU3>? z>UtGVTRDg}@k9zZ#MHUe3X?B~G{&>mE!<>mX)>WyHm$YTqS3zjF*Np&u_d8cTc(C{ z+@Fuh8zkNgv*>Ta^R-Ktgd4Exos~~z4w5b^Gb+zR?9wqPqH93hZ+AE6&HK-f!rhJd z+MaxDlV<*DuCXrVhEei~-;t46vF$LZL6>A zKNipDqW`tN3QHnFISA~^){-!*p-8FaMXfs7lGQT%iXTJFB4%fSG^n477A^c*3Al%g%1+ zJ!mkis6c!M4Xv1r>%oT#n0F*OIn5=x$IaC-gGY*)3E6y7sl|AnL zf)d!FhMXe;OP~X}b;>-axO+`7_G>Jc>Y5Ko13J70LnD;*kI(GLX55#&e_$sGL$z*t z{oxg(K@Eu(1(gGidy%*DF8wt;_}RWn@LzcMXDYh2ORx^5ZvW)^hTRmS*geMIZe=_K z#&I9P?879RDiYXloXXXtcgcIf5h5tG?K9g3Vo4sjB8nO8NSlaNAixqfhbVZY=&egY z2JcII$NI$l`il#83S*^PB@t4ksiUUSo&|=LOQ2{+$e3FTg)O_gh-xh2aQqc6fC;{e zI2vIqIA0JDudp=Ph%Gr>Sp%L{-)8hUCea+;pDnpna2>31zEj9nZk{y&rUdN?Br0M% zcT`96l!*8)_S%0s@}lcU_S^61d<7N`a2$^PEH`lM4A_xP_RscZgAai(%27(K+aCrx zLxCPL1B!!mszPcOm53BcbG|uB;v0owg%xAtTkg*~BIkxL^tggKMMVdqJM&?BJ&S^w z*PWKugpLU9(?qrH)QIqSAG>NUfh(icJ!+V&z_6W=)r>7atmlY1XPE3m<=D*t2vjq?>2Av!YCNA z`_5R_szJB68bjGJe4Q{{>>HMBa9`&kUGOLZmzBovyGFeTKN&_x^2(C-flL0PcM-jx z(m1{QcmE_}iQ^j=1BN(1g|f^{io7KA%#j?Ru~_!pj7A6w2%Y6Uzr>dZDbp{x4uXOD zs-Q_qCypbcZP_TwJ$Svo@a<9Ml`!#TfxHs>)~9?!Ezm5@2UI5cYfK^JV1RMB-Hck- zsd+cm1s@`N=9jOHH!@51(Ztj-udPaY{GP0s)EG%=&D)Ggs>5+xqhtZTBBkNW*L1C8 zAEhzH6faqHYpV?Q5g7804SxB3&^@8T6hAUp_^&}yR!Gn4^LVzI&S$ z&ERJms(w!CX-}gmn^gTbd7bA(V7Gy9H@NlFJwK-;4^jy{hEw|G-P6(m=^BQdr?gn~ z+m|ZWRpw!AEt|r@@yC4$7t&O}w@xC|rM)^VYIRM^5CW$T{)JG+;kQ-`pIaK1Gd!!md+MCC?z1hDKP zE=q1nkt@$bEtA-?t#fV8-!}GY;GFb!1@g=KWL=_u48tS)l#B^^* z*s~RA&OUXCxhs^##gP9sKssS=3_BsTuD9&cI0o!cF3f>U!M@xqj!>8DwLYinlIi*x z^|2QtjBDe5higxO~{9p3Nz zNy38sYE6QB-rp2#yAtn9(Q%#N`xa|rWKyWnZO$M3HN-Dog8QY>>;jAj%@wZlYC8Mo zrdIV&*GM?cHQv>e#U)U6eA7AK+ptG9>2l+4>{l&a?49?%54GG>sm5Gxm{Syn&(){@ zJ^}FiU?Q24%YtVei~qu}Ikz`vKeNzNsM&LJy5{?rT(R|xgAuFtot;pA(K#P_dD(mM zrsiPLFKDvGFzNOY;pX)ohG7LPeOfHol^;X*8j^n=5~oGCjE z28e32Q595pWJYpY%-j9_jt9(nLI1D53$ecB^u4l=m`6R`M0~;cM`s*^2m?*SPHiy? zgWBaD_|vj8Mgosd()^l$0J$@fzXgGF$lf*$A9`0Xa)wa@Hyy}D{M*DR@gzbzI_3?; z#bSgmL!J9JwtW-;j?$d6v5=Aum8%}dUVrTI{idb+IAsX>B!jXZqmH@wB4nOZC;WO7 zv9}hrodR;vy$G@0H?jpBFG{4bh*@F_V#tTkvH+fm=mRFwq-AmJNeM62AJjHT`tIp| z6K4#r5s~zfXTP6HbOq1`i*}Q#m>*^s16cHl~CA2)V9_ zGtY*KI?a-C37PnNLKli?4K^t6QRNnpen5-n5H9ZS{z*&o<`Y>7LubEE* zPYHyc?;?P6aB_1Om$l%PFAq&%2cR?F@DeD_QYwnDjiE9Q*ae`-7V?YBM;~xd;VF_G zHNsjkI@BHqb?5dtli4X9>&RI>%N?_h3{?!7*J2+YY7kFhR4~qwEfVR`84|?ZmJCoW z6#sGBe}S2&9!OjZ+N*QYh}x?&D>b-MHC4*fhIXk~GeJ=kvZ(PDq;2APQ|oQ}etkFD zNl+YZOb#SYQ(y9tzP6*CH@}w3wN>(9Uzx+WNT3f@6w7QDKRL$gGGKA4W_er4@|xI~ zm{%1Xo7K`-gk+vuy=zqgOl6TVF+sH(RT>M;2#AX~sCNApX~r2n&?x$z`59^7A(-JICKpw4t4iC|5(jgxr0`?t*f- z;=DC~qp$L@)9B-e@~g(J?03k%TlY_4B&Wmw88=9Hkl?Q0OnQXw7~bsHF)FD!#JRl+ zrBWaG70r@Vr%sG`EsN&mEy=KBWFLvnfI7)7A_<|cDdE%V-uMJ#5R8#x^=hRifDsp*q=3mNGX5JykN9x1Gq&I z;$)hzRk7Tar6a6WeJFPSEr3Z>dLm$Wb+;wS78z{i$p@fqfMb*X{+Cnur?mU=nWWH? z0^C}n|5fF-Skc0 zGCTJSr%MH%wWe`xqT30jR;P0Zp3ywGHmyB(qRF}Cmk=m%|Aa--kV<=j5uDY{rXf@mzt zp6ID~-ogqd(*hNNi*TuXX4-_69*=Cz)<;;K58atwMLmKhUjzT_}8;XMK&NJ1&ns`qcjKY2@#_)_Q|XZsT57 zn*QQ48~a|%u>fCrN_^Trzi;xZBlIL1sVHaCR^2wj+*MS$?(Hj9)(K-MYJA#R2@Rav zNAW8ZjmJT2oOAV|Q^t4F4?5Gub*kb&VJ9nDzY#I3hA^Z5{&ar)mXf?Pc6+(ThY}we zTP;pAxjajtnS>F~or5by1jhq%cZh@fh(qpnzS!nH=vNu@hEay#9=Dz6rTy#+@;Dr6 z)%2~8lRNy2KA{DSiae@gvHy=_s_~K5q-oa8!$1J#McKafAYmv&@Y>y@#OJXQW{4=$2$MwL zzY%3}6St?LzEJ&nfo8|JA(IfDisIXaXD=0len9AEm-S=YYba00eR+TRuO};Ug6W;T z)wL5uAGqNoLs3OqxKBjM_CxT$3quF5aw(EYfH?00>hNrGa`JWa={2bu*#Bo}jtrt< zR8usKh2=?7Mk*pfN4}~2V z!4>KZ>1FBpkz%1X{n}6oqufOpk>w-#s9VpP8|uwz8<3xFp$Hh1_6b3)ud?+2rFIdb z3K~O&f9142-)5ZZdv}iD90Q+hqY{4EMRFzHNkYAs??Wls(`x%Df?kR=p?gu|_};~K z@#m&7sJk0zQg~NQqUg?$^gENc5yHkRJ}P)<{#|wg?8Y?6TYoI#^|h2-a=9}xqAMTv zl>n@F6M7{a9=Ee@$b`8ZHX)Ob&ivE%Tu#9>igF{Y93A za_Q0IjZoO#F;DWiTU=9ByBiP?kbU&@55pQLA6!n^5@3+D(~o%L%y(u+Q!FMLH`MgP z==~m;rI*0J4e=k$ephp-1YC`=Wlgk{ud- zJio^D{s?S~AeP~e0P~EP10wvXy0h&x^w}1GznVXHcql7xo_o9g@kwM*`m9zy%mLBo zBH+{4VHClq0(`fXRES|cN68DvCU(Tu2`MZVfWRXtBQW2KOlKcaO8S7Mx+fZ>?EUf= zUfe+@W?>AX{Q?bO-7$asGh*H<3R;EXdjOPd25sPQ-m2oh2tn-;qwmbT8tFO!ZprTr z7{{Ua%13I-0eXPCwtx=pey6lOZaxVOuQH1i{{t&Bh>q? z>=E@6vgzb--3`bOIJm0ehezq>NXn9Wbj@E(S}(P}yuVIqC)1*MM*9WnH~}{;E*4S1 zV*^|ZF#-e=Ys5!~hL+ZIZU;=$x*E2cYD1ISkSf!12nJ84#w`F|+y>L=O!NIWVJ3|` zIq#J6W*6iyeLb1f1gg2%CF7H%8y;$|2SwfT+ke<(Al1m8?p2sKa$j$oUw1&JP-p_) z4rO#owx(SAo=mKhT}GJEq$UDx4Fo|_0-Aw zcyKd|I`Q6gdLeE0npfx03NrYU>AH3;#BFh2)Nw*i{MEm~#k zST){`n}}&s$5@fHFM0b|j-wEd#l6iaqO8tU^=xedvehs-G%0H8$qbJy(Pkffa!M@k z>tpWUukYj!!ldjqWv6(x=|1X}JJY>ee7UlA<%nSKhaLH%p2A^xvI}q`TbGLO(eGI_ z{poXW!yq=e^`pUh zX#R8Iheu9N)s&?7h=Ma_%No%0+%onL*;R_?$Xn+u>kgkcs3$LyIuK1=I1@6| zMWxrSz@RXyf~Qz7B1UeFu*^n@i!vb1}PU znqRvsiThOc%pyUf1?3@oyodCOLOEX zEg74zj`|?gX_~<2N@2Nd#=#vS_u|OdZxevo;q*~I3N-#n3Wwt|(e0?^cb|^(j3M6( zgAbSgjhf2(NDHoux~bzZNH!?bG4A3tEF*Obt_d;dx%rukC{fV_gDe9GpV8?ok@m^C zJy_;&{||<<8;?L@%jhYdKR5(!~%wlwCtFoPuxD&@}AQ0^%!y`Ap{!|1`%%&N=SH zeU^<&>7=d+4@hLbA+B{x4^j%;8Ov1?mt@rMhiu2oar+yQ6eKyV=_-mKi-GYcS+Nb) zqUJ)T7KWbPr>>o(6{tRQ#yQSOw(>$%{5v1$D|emZ?g!Mj`f&28TdRJ{!?y9?pe0MV zVxcT-Z6qo#B-{A$tfkgaa{p&`3Dc&}5+s%V7nCt+msmZTPfA&9mXQ0TBO6rRCe##s zx;|S%X~#3uf}M)kA;Ap!HX!bBm4K7|NpADn z#(E}?@EEwQ2)j|g+5fPjb%+y8)QA z8hUF9RDo9yz6mLLRnbY*e-!!4wa(# zLA!qo5mO@c8CA(#iacL zu{(YJij7^ntZ(k>Eo3+rtDnMKm~gJ@Vt#Dnh0HY@@NO=4&6phFtC>v zM)!}(eCbkkYPjY?l@Yz3^%a3$hbE{~9v_Gbt=)aQRQMLFD16gG%%QpH-15x~UwH<{ zlvdA;9c?e6Q|FX1ahAI_O|=&anr+fBQHp2M%7vaJciD`q|J5cIpJmDr!~3QY@;LeN zC&2j-iV+472zS z`jN;Grp@RRrG8ZQ7Gg*@(^5F4!mMUW5<=GFI}tJ*ZY;rBu$@f6nd=30rG%VO2`O?& zMJNmy7cJ@{jR0$7cbPMsQo2&Ft8sC19Qm4-qcrT#zfy1JHQrqm<^6b-J??E4seY{d zmoS7y&Zs$g%6PW3OJ`kyOF5+Y^Til-iMB32k3d#s6CZ)Enb`2mT`h)_Y@YfxmeiqI zbo=!T6;qURwalpQu;LURYnKq29a7sU&sgoAHaf4UdUFZ}sJ-sU_=XkV(t5TSs`wY|pQ|07~gqc*V{jqlBo{snc8Y%<&Ew8D%`WVfh$YqI(VmRr$EfuA=$Qnx7f$rhHUOu2xWP*s4bqWslooJXt#;Kk+o3unhag zPG;e};W9CVe!gdcWkt3;^F}(~w$E}t=Vy5djFHgdXsHM_kGGngj z5NZxQN5t4D{Blj_2mvZDZAMuceO+(3KcI#LcIg}?x+VAa<-~&|6a>vPkKydWx8|eH zSov0a_*kB_W^gQ($Pcd|;@rj=U?--ZIp`Cd(>dNhz6sOKOTpWG_z&6w=&chy4Ed|O z;F!39?`=Nv#Iq2vY;62+|5+SVdD)Z+*}Pv59%HcSUpEX$XPGR%Cqy=r-APbr$mQ*0 zCCyrRa6;uBNH6{reNo>F!)b4{%TU$>9Umdaj)IKS={#f49j`}T^JA%IEmM@}p|eu3 z%`Ms+uq}OIN4$bmk%9v@<5idT06P~6_0xFW;A6*nLmc|3Z#PVlRar74uV#|phqKX2 zhxex$S@tZe1do=}I*~Uj^yGGKIxxBqUDG;$+wdr>FXLgs>p0u zqp(l=jlQ_#v_xO2Z%ItT!gwaubr1CRr`x4G&DJM0cqC;~cY&NXHZBfjnV?xy%!awB z(DmtWFML#j$2?2463S*rg2cxA4@tCm0@-dUJCc3)#wC>ko@iw)r*qi4dBk&4+`P$E zE#bbBP4i#AYaACMai25^8Fhq5(V`_law5FXvk~9j$;12}9$Mwd<%sOE&c4Fu<;dgQ zM#X~m9EsQzf_LlKN1?8L_Qxb|{>TfG8X;j)xfP6S$Ne5{W>S_- z1HGH`sJfJ!K&)&>Z-|wq9x9>MH+bEO9~OU(G#IdB%@o8LG5MH)&So&0n8Szxvn1mC z2-MMwQ0=Lr*puJ$n4MFr^?9y|&70SAx>wY8eG8FXB743ttoZ`(jj9L@;(Mbexl8)G zN6yX6H{%gbE2gEZpxemHmW~iT-|6D~DyT&v;qcKTN2wqO6<^lcL3X4pI&%~60ECV? zdp-L?!(;0XA>RWND}OrAsG(FmyG=M;9lqT`8D7|_T{U^O?TdH{y+2MDYdK;ZJjxeV zA=Ary^CbOw*har=AiqI*T1c{S<8ZOB5cRp~^(GFZF&t2JI{3?AwS%Y&S`5`>#Uv^6 zEbT$+1+XA&d6Jax-oS>xV*C8s;KZ5KmOaqQjCFYm_DOpUUAueEw~{w_v#lUM(+KaURiMrj(39n{O_GtGBn^dKC#WILruV)VfXEK>L^J1KZZ>KtGi4;(bGKOKR z01J6hS8qx5BvP9tW$T>Ik2R|}miJ~tCdw~li+1_T#VkE@)=wS|XA0A;Gp)X`RhsAK z7l@6$+2I$z7F*o%+Q7OD{5(aTNem7cwMZYm@Y&|@`^T|4VP)*aH>cKHx=TvTHZRKB z_FVq~b{>(GIO^haW0=uQK{w%iZujZ_eV>b2-?f+~?c5v!D+i4M zb&f?kfxvxIueX$sihtm87u``$oXjq8fAbvI0#8++ZZr!=RgZ>n`*o9iz& zWOCS^XF#m~!5E?+P1;3wYWFZ(Vl|J_AZ=ZFv~^a5(35qCf7u!SibuBwkry2u`80Pk z=+=(>3ExtN7X$G^L;_>_W|l}CN@O9{n7mw<(Ig6YwU{NPs=0W27x1iU_B!n5{51Qz z^`)CMFOaeEAn0+8PoA=1Ug>E%GsW zIcz0+3)z|gW=&myK}NgyW#v`(AApxC_a1J0mFFn|m|K%gbeqp!UVEhH>syU1tq|)% zI1bQSxHjB}B^|tTvnPLJ{Qchtd~xCoi%;QIygnZB$HkhM5EQ`8C7l|IeE?4{ zf><`f5SI82gX2X@F`UH+vV9Xl`vExV2Y0`trv)q`Gw%VTpu5;whfyeG%Ep zY_D^NvMtbCib0Ul86)^(-xLUnJQ=@kBC30~6cBict zFIOrp_7_{5Bc4Kts%rl(_y@MT!uXx8|1wxNKNIyT$(Yr-gKlyIADHIm=0ccECa}y; zlBHM>0PpRekVqK^EWH?zW<5zs|EpAQ@}{1=%bSNCL^TZvtK0^_X)wz$wk_^5=& zitaS~*5qMilKOvN$3KryVu+Gytopzi)|;?WlbQabk)e)ECStsW%uT$kJcGx9B=H{T z5AK~+EaS3ar_4ZF>iSJ+x=bz40(?AOWm-_+J6;0IKn4Jiwm`-Mq4>9&O+Ms%`S*~W z00_8^4L`|W->`mpbP@m==X`{qC}`P!4k3b8Dzt6#WL<-TqN3=SVcSMXf3lEMx?8A=!bjc?14pu;bkU_W%W5S} zFJ0KO9#9ecKnG_A=(L^L zSB@A?W%N`zs8~e8s-OOc*yBF~K9XtGN=cif^5Zm#gj(QCLJFqZUMr1WnX)G;fdp<^LgOz>R;W1}_Q!%8!k2 zR5At4AQpY=oS-q#Y+_iR8b>GpQS9i;87zb{T}esF*Xy-xyS?V>&trX2z$)SsqMV8R z96Sommoat6#qshdBKaDgre0%K;03_}c*~OZmMkvfgP3 z{P93*X9wp|=`z#$(g0smogj{?h9tDT&8=5-vv+i^65T7Zw>>`V024-SFHjgDNPiKm zM(zjR_C5Nmu1Y;UJ#}DKH(|X!Z%nWPhbieQrPI^kT+h7-wS7*!Py*@yPkt28f+|sY z^RuHd z%QjMN&htjCZJxBwM`dNLN8TRs{y%Q)MPSn2#jU(|A-i*yGO%|}`n%00oakkluWoal zpY@8H_QuV=Jr~lxabrRqK&(>U(g(2p42w;?vL80|eA4VLwH@dl>u)}CYPfM!;!*dj zVl6X00!$kI7 z=)t@nuIPS?)vWikX;GQ)C?V2I4!3C$@43`=^sn39I!G>p9gy8x*p6tv&DKbP&M3Nf zLK>%1;yjSs&5usoB-_w^W)h%7ybf`}_{5hDG3c#QGhDcP-M6k#9< zwdYX*dB+BL$YEcbU!Zm-=@8#W9ztY;-s@ktKqgUlo`D%Ddh|!C zeX15fwO0f}>K5Rda6h(szR2x!G;0XZe6fM zw$8IXr4vxn!~;GP8~w0|$`WGR;zIbQ(FmzPULc|bB*(j=(!?mBE5bUB z<(=I)J*&*#?0zR6Os=Gn&!!f#h`UL&0@CtFWHXy_TE908It0NI(D}3wN3GJne+;6( z27Z7cx!DgrH)KRO=d3>HL?(}Vf5!GKi!`0t0I=#=2}AqxN$>$s0I#+3Es9LXFXyRM zN;*Z(% zHZuB7SAI5idT3z{?5Qlb%TXNjmY0`*tJNp3zCg8A zTyK$>QB>4ra&Djzmq3(o zze`fw=1sMe2OIc`o-WaIdbE{0zQ=&(v6ud|z~k;r3oMw0m!(O8yQWVwN$@csR7k#0 z*u#zx;=Ec;|CP4@_O}O0dc~(_C0{+jS7A{8;;b~=QG|qK^ZkSWkKPK|D6|ZlW4<{C zx$1dF&dTYjTjneCBw9w-Tx4}g60p1O4zBJk?~JEZT>McAt7kec-s@)kyhM{rQ#F!d zTY6){_fce=I2lfOt(j$;b%`^C(H~7BeCX%*^=lZHxDT9fJIV#6L;m%u-``Is@zZN1 zJeUKL#`3Uq+j@vZ$ME!S>Mm^WE`a{Df{0u4rb$`t5=`{F&n{e0O|sct(?5S(uWfTK z%@nSy6x@3T=L@PtK;k-Ew1oJgQVbE`4v28zAfLD#B$la>R|4vR#sKG-vdIoo*{q9# zxO3?SWrNODnJ=7SY>MT}u!Bc<%m8y-*%WaQ;OPfX z$Q@*fA3`&M3UPX;++?6vH4__4BQZP6`ik?3>hW!=kvffl^6kdY5~foofY;qq!HAhP zQ6pQ<@V)Tf`OH8`JHh~ULd3bwQyW}no~}(H??8YsfRwsp;eS_qiKmJ2;`GY8js>=l z*1vux zPiZ%Owmx`6(Kwd~dYBEIG&4T_8b&WZ$fP&UE=P;e>Eb~Epqvq#xmgj#B~p@2d9Vc9 zlz;Y~sa1e{W;!T9BtP*4a2Q7}&Tga(Cu&WNN~ zqdWZcWghzcJmF%^^F)2fmMr7i3!1&wFVwHJlpL&dJIsrS0Gh>oc6+a%ww>tdKXeN! z(-IIrTo!a&@w{R~QwkN2HNP*LYug zQ|}8RImAX!L#iIK|CQWDHhSq-p>HIpW%kQ>FyCO8Vq>Y2KXNJT+^a!>>UE_huIYQO zn5847Bj#&Yq4P^N$9zlTC-7;GZ?DZx#8Pw(U&SE}==MqGTgcel9r_p3LZA#^pSZtY zY;--D;7#3s!W>I9xNlr)go&73PJ)DLCWut6X#fz#Pw;_O_AaKeJvA72s^6z>`cTZ! z>p*y{7q?bP-wp-c1Iu;uzz9%BQO~tJI~j=6q+Br%@FgXX?U-}DAz$uP3YCSGSdY(r zH?E%k@F&}e8CgkGsc(WkTJ?_@a?GPU4e!1fqNY_|a9%P^B0cx_(Ifr-^&`yo4=r(i zxTr`%pYQ>Y9|qr*`;62Ey`~Oftisxx?2!-uOxTxI;LQ~A;Us1qgyJ`gzR6zkhEZ7E zeH_R``OnyYAa;4s^-AYZ+2V!o>4J<%dM#5rMEvQ|G2U0lKL)&rq^r%Ce;S2vcnaTe z9V?a6h0$H;WHqLfo&-qF?Q7nI^ml0xd`{Yg_l}{quYFJPU89uHt$$Yke6HIqcWXEq ztg>fbGub{;8{{#S&yEK*rqR5@+q5C_DdF3$zf-sCG?rqRABg8Kk{V!hW*HsjYWNuoTo&z zCS(@t+ACz=*Zn`!QMiTQu}oU)sD1toJhM%UiW&k%z1|~+&TTF@5H4ZLW<4z>49005r-XHIn(u^#Ori{fZ3DtKJ_JiTu5r(j%KP=2=BET-6+JJ(pj3 zk^Nn>;vK&Ja`o{ofRI+8b(X!ngS4PUj%b(=l7yVdy!TdfQ7G(XdlkRn;Mn?33em?a z-ydEMfFOi!)iU{7vXA}4k%;|p&G05hO30qI2hQOGV5@R-42*K1Z}h^crm>1mzH6K= zFMi07K!Ka|JQ6PZ`l7Fho$J$}V&AWi|IEDW`BY=wK_q(X+d}4TlQ=>4!il_YQNlY0 ze2s?a?p;~Jp8`&8EgtrZn~_|03114(I`K=f5AXcfm(aqElzOnVBBJy36Nz!kTPVyf zN!)j`^|qQ?J#RR*#{qjN+&E*P=wiM>gV_R&j=^z^O+(^y$Ayz9D7)epNaz;GVxqfz zt0_sA0f`Vhw21Jo-oX{^&;FSCsd{4qK$EVvrZCSk&xRx3{o{M!!lP(&G;~#CaT=@l zWP4f+^Zw=$iVEmp4wM{`2uj`xQMDBVZxsLhY;cGgO}T&c5F`hOo8Zv*2@Jg{L(jbq zILP46WS?vdQv5Wp-5coklb7)ic9%qTr#?}RiYD*C-8Qy373Y3PLXt#=f|T0*kUOAd z#U;FId@MhL0DbU>;0vL6X7#OS3RPIUp*zrL4WgMojEw8Tdr{oSH7S)_^n5(V#a z^EhcU^2x;K-lWw)Z%1zg3jdikhTHB11tWkb*6=lR{eO&ocRben`+r1klPR6w$sUQ4kjlPovQ=iuNLJZoln~v>4pGR;%-);d_3m@d_l(Zx@%#Mebhz*LYrJ2t z>v~?#=kuc6v_%43s~v#!XvO+%(`_v@Bzbopw=|x8N-TJP5-N!9xJ;LjuW&(qd61KH?Zqzx7qQ!`L3YaB0}bDUW8 zG;XgJQOQrl=+?oTNAse9jsKaxe84+#`LPyyFfjS0~c6eEg33is0>m zpz}g$bBd6)>IjSZ=i~*Pj35BXehYJvhBik$UT?#gR^7IWsYCJ(jd zjihcx0q*4XXU;dcljSKp%v^HbY0M<)8Xl-uUAfN-IQukxiL+v~${>qx*?E?$PEHyG zamy2tde@=4(&qkZ&N-@+)>l|1M-Wu&uB52M-L)CrmlyoIY)MH_1ug3#oykI6)N6~w zHH!1%rGojBMWrg0M>aPuCSU+v!Y?B;pFI*ovZA#00WZxh$0Gqye+sA<50N*lKFe8i zi`JA}$m*e`Z~nOQpRxF6vIs(Zvn~2TDtmGLr?5!ZXeIAlvl8t~8%Qj7#3YD0=wDvg zeub0aad4CCYGwv1HCN{DbZ6X;Aq+cPaS>?lt1z|UO}2=3ChFR zx7pWN-n=MJ{FqA8^aB&kSW;r8IA2uwA+hwXR^%3EW$E5M)hS~J%^O$sTY0KsmI%kQ zqNA>;s<|nK?cx%#QAF3;unU^k`nW%}z4hKrbe=tI&7GhRh4087MeiMhN7iHY3}HbA z_nCRimO()HwvW93vB9vc9z}Ma`1s9*XJ`9pw3@bfzh@VCt+M~IZVKlJ@3!#HIJFJa zE^H4!70z28T-|IRTy;^78vNsT{(N!Zet*fCI#TVf9~T4vss)`0mMX? zmLlvt%Z~o>QX_jxgxU8z>=t3+HPe6Lx%m2=Af7$P9>gE@}t=2pxT;^o`k|NEPOui-_i&`uDT%_g8N|u=Y{Klx7|1=*j2U##3m&r?kn+ z*X_SgH22P#>y-8O*bZ`I{>wA`{IQdXkgLLBBvXN8WVboPyei(?)eY-D#d*WWl;ldnuqLzF~e+t}TW{w^5HilcS?~T8$x>Pts zi}U{Sd?7x5yT>q3fVHca0Ill{pzv1@03K5^6re)+ZULU21}!`+fQmjE!kL_H(5p^Z zDuP4PXtYCF=>6Bh_ONR;%6cD8{J1`ue-qtK{FwZQO=Ha51@xZUSaOZWRKA5md2%B0 z!GVRXOYZvab^h&Lo2diV$|>eJ?C#z9M0#KCzkb~B(n&G~ga;QnkbK&^sbTRtFbUp8ItM$RrHa`R< zc!2E27d9lvO;d~Kw}7IW1vtzQL2ynAZY!3E2W=h5n@)0QCL4GCH~<{fovOc^ByPj# zR*`b92iT)D?kIoLzgG!faKV6xhPDT@Dc7yEUVBl)~np=rb%YKw_ z%YLR)2V9A)7C8%E>C}hjygR}z2O7_$CW3Do{}P3CrlIs!^^ISu%jN0GWWbSZt}F9Q zda6rD#+xI#W0Y91!JGk{;Ge{=Pral$f*{RYF$}M}4w2KpcBi~poZs8xze0rM* z?$*UR(4<>!gV{g;u%U#Kz&sR(RW=L_zQjaOK~^hW8V1OMXmc5WrC^|*NHN@LV)b1E z8C)=+)d8UI;xq=YBnxQtLkNQDn+am}hHGTCwIF#Z0#a9}pyh`LO8^K4Ah)3J*^`Fy zIC28GQ+Jo1@w&Vaf*!yQ`{GlmKMzVa#7F+7?Yz;U4DbmofX)|jw^5AEH;z4eaFw%s z54FSjS)J5vb8oRV5sk(a7Y_Nx-RY?D3tpy@vmqK;YSj zRhzMy3vQ?Z9lEKz&*W(uD<@fAxE@GlG~&LtR>ksUWK^YMy>OH>aiXvGB2J;&j#1Jc zgP#Q6t##p893a}_!09Ar@Qo=1f<*9>Cr^y$HPb8FQ$%j)lvdOLxLOCxL6ZzE5gl94 zHhxe-%}YY7^u0vxp-uyR`bW%^r%imm_<)q}E;0kHyJiY@SD-`gm!If2@6 z>WC6#dcO~L)^*@GND0Jt8USRL3&CD30F3^*dzG)If)Y~OR`YNiycw@sEDTnDT9?n? zgQaaju$spCBXW%I&i-?AM=R{((Tyd`6K-<0nVcR>Ng~|hwD!XU>`_{IUccX-Uy`mf z{i)K9HjZ#P{w4Laz_6Xx^~z!Sw+r!v+ZQ|V_GAfy_@8yI{+#%~ocZu$KM5Qll^r($ z%OF90A~dLE+rxmw@OdXa@dh~3a=xil5lq>5*KxUk@*VVBsskw*75*V=T9QO+I+ZIM zIdu?Y8fQ&Dq-Ha*+nlKt-XOP zS`TLrGv9pCpyJ0P@dx40mY{oJ00eNqW%#!4DjSKL`9Yt z1?GDs$*cRkV@?;NGGrH)fJBz~%0xW$^&Tic&?ZAxU!fB7G#FZKad^(CnT4w2Al_YH z+-LLZ!RmwBr0=^JuJ|V6N~+$dbPz7w{s7ktZymMlv1Tw%Q3$PoiiGhF1FpSi7AQWX zmB+cVyE@eo<r)yg9LZmSNJD}tHb@5mhMCn#yvQpy8oUEZ3)?Nv z&z}3|unc{WVciXwnLF7ow+cJj48VfRa(<4+<7O`3?tQw$$hr#@l6ojG&_N5W5M$!7 z=cx6s(io`Hi~@oAL7nSH@sxQ-Tdckz_aNjB+O~&S0nAxAi=+#oDG<#r0fVE$7cfPs zgWf?jfm;<7jTFpR4)9`7s5w#p&ocUJ&}hwE?@Vp~0f_TL^mmG)|7BeLguV@TJ5r2S zXOnB5c}iBD_{S!&PeQI7Qb!=wM8wU^aYn_;c+|0}FZLCfRb3z6g1R3K9&+~H9CVf& zKCVBn#`ju}R>INTJZcwF4qCuwCxJMddrm$|^bn+vw2<&seqrw22+-A#WG9*}syghe zIiNO~OGo)&W%en^#ulLujP{KqX$NqolIP7j#YT-BK+z*&Vb#jw@bTZmMkLC)D~QWC zpX^;}>VMN@&F1#b+s!uP^-WTLVVC`LcRPmPSBDJc|NV;f{Q=>PfF(lRZ`_}C^7n>n z40a2cM$CL)U}gHIl@7rsGSu&`@kmMEK9B`M4GArv^fC%QX(37*r4F(a;GO$K=_{0< zIo@c@fdUE;zqNuBmJk*#NsVu3irgakdHgC@Ng{;>nDKYFp#7I$hu6 z;#rqT^|1WyS?7*nwgHM%@A6~|TaG3(Im!jn`Jn=q9+iqHbMKktqe_eXVP(y;4^qN5 z{}F+urc+GoVI$)I%&e~bHM9E8BbSlktlE+ive_J&0kTUktNW4YnIw9O!sx~^IjF!a zlvl6k6+#gSyFXa~o;?WKrFZKNm{x|yZJ_2Cfl8rtHFw&3r#t2Rd&HuM9I19GF+Bt! zAB*8!NsU*3e6@z}Ab$R)N;oY!tn<4i$Tz0$gqP9aav73IWF5tZ-BCGHzuEX_j4nmw z3uLJC9R_*Zn6IaZHLoHFpBH&TjiX{h65)z`xZnOs3rnhL0g4}*tpPiaCov2Vv0KO}VJaG2|ar#@ONCf^kK^=nb;My*bw>w&rqBR8pq zk?QxP{MD&3i9Ut^st&WPHG|YL^&HoX(ioa2+k`cp4o@GL-!o%?hQ-*W@|t}<1i1Qy zTP;zuwF4Kx84V)TJb=;-NGMu6c4~PHF^Mjh$e9z>-(dJ13jEuP^CU%~uiZpQZQFM_ zyJvS!-SNEt;ZXf6G{h(7R^;xmt7~mlgisK>}#esobG&xTAS_tEHr-pW>tSxvaL&iG91 zdS6D_w=WfcJ+r7#@ZzRs^ZO0BOZy01=utI@) z?dv-!Y0F&VFIzhd6CPci)@%#dVLsK=(e7}`OTKmH4U4-u&y@n>oxxW6+N8kMW^3`Q zQbxx`Tt?*Vig)eXJGocG#k~%aCg+4UL~RuB7o@a03}J-dK975IWud&Xz6ZTUBEBhG zcGvq|iDZ#onVf2^|8FY^pZK!KI$vL?Om#4=WYI+#=t+OzJO8Gq?6dHykRJgFuKjxU zW&Y{@99;{ZN3Dhex`teN#+}l-{L@Jjlv?W3rnB=eJoHXENy_^Dc|AV~@X@5Zb5jr~9o%PN(0iI_%;TOj>{{J@K|B-Z+q zeAg7`D<-eme`2yQjnmhCi{DhGi9Xg${-y402WcQ_%p(-D%|2giGlk`L!`p9Pt~>7s zD=8HC(fDh=J0Tc6Ro*ep{O$xV-Q}TyBSr~@v4p;P0&iTdma0do1Pr}SCe~t_ex}Qx znn$H2rLgToM$K|Fme~Ebf)imfdL!@BuH?A{@HEFUF9g|JRX-_9FJRn1-?Va- zoYsCN7`^GLz_5rLz~m~QO?}|pCPsMioc_d+}rcAw;Nei5<+zz&~pl>K&RDAWpqIck$u>X{D&;UuBAXyGeA zKD;}$+1$?4>VQNYHLdT2x0>{xf1dj*$XoYq?3))N`<4Vh%%D{U2*D^p#wn z5DAI*=>h_AJ+K+5`Ao?N>5=!q6OD@+An&I{^0Ou2n+0R`cd)Z#hi_auO4r`rkJ!fc zZp6%gb$+<}9-6jLU0FB$XB>B0izWJsj4h8U!L7@JJd`6@f?fx6R1q`8CF=@xx%i?M znEA3}ZW*{``3WYo5$1|z>vePe^XM;ztToDYjfpmXrOI`=xvhKsc{G#PjLy8^V_h*N zx$xBF?KfPjgd+3y=T6r37Hy7<2pj7CCKG^vPp(;MBArRbl`THW}jvs z+s^%6y~GTMvItxwF0wB=X==CM;#Y^^l{rm+veq^-DK7T9S#D~+@6U(UnQpvK{8e6Q zF}J4Yc1P|)Yq(2+TM9-%hwFm!!g25<6#3%a}mwzep5sL@+duS7~tCLsA#Fo?mW&)|SX6Q3vi zA5sL<_=(>DDdlq^kWzv`JS#bggaH;QUK=4+3bZcZ&lLcIBNgJW1&}2Ftf49pjsWL9 zs<#B7@LOv{g1}pG9CT_7gpy4VFoeY-XMxZ`43HTK7vtU-O$`dT6s`s4TtWXbmKN?9%B~s=A=o|$H;NwuwtNCv1r_>GPOzNp}2u$D34VE{bd8OCN zbNA-&rO7|zlGB~P;YqptU|3O#^{fhcbF1e%`I*&xjf6yQ8eTZ&vp<%}D&+Xo>JxF{ zlTF$*<2%FQhQ8K(RM_tOxK|RThIbM-QEHDuLM%5KZ}vAL)|%J218hA#XJ}G;1WUx) zU02`~q3h8$%(i#YD8oM*tO$Em!GmL|NyDmtbzXG)9XBxfKHLY``_hs3Qn-Rl3PoD% z$)rf|RmTiw^IRfkASJLmAmmIU0~UPq60n$6So@He6|$z+j=)1ck0YI*BM)_$FURLC zxx+?gfv0gCC?*$-WTeqe)489ec%4VcA!d;y(wMh&%uRZ5@M5?46k?VBE3o zjdRL#OHKk(!sTP>Jq^S`0p5~Up;73^K#Vj7c&^1$+1=Re1^$UAQ03t0#0*4m>O4JC z>A6DN40kXAZQOX=N%VdIKt8m|44a-e)J5yy9i?rTKiuQ0Knzpr0qm*=xdBDqV$t}N z1qBut?~cp^%&gIHsFDZoY*CEt%!|jCi9m7VF|~TwG4vTakcPV%^q=a{vh9C6`IE z$y1Y$MWQmEUUH^PmOLND#5hG;6+}iNw>44-9O+JT(yqs|y8v#ZMZ{^Y8)jS-45Fw7D`<^R z*{Iq?k=&W01TQdhx^U*C7Q-~qQc~>$wm!Cb-+Ze2u?|h#5AATCcanISdligS`+RtS z*MA(R%7cuom(BAKsQqK>U^KZ zk1|&dRogzTRcCUyUyV)?Z2|m302kh0p$IR4KB+h@TS$G8=o6AVR1C}bd2Yn05FW8O zIiWicd+dIP?B;K2vVMo}Hu`xME=N$je{^gkO%C4R^sqh1?HirUu?`4~g~kb30r=a7 zL4-)|aJ$3%c{BzTKBM5~Pm+E8O;6=L0hVzxS;S2H$m|{*@WEhc9te02doTAv zL60$3rq0ukU3Q-2q|oWxecHDdUWo{Fl_N*k-!hZm3m3@0N^!s|!?^0ana|$If{Xg{ zxb}>|be$9mi|-wIp?Ru@)w797b2kZkvZ>%m@Mk!Qf%eok-eb=vscEBil@UMa;k?WxkO64%m+)spI*kw&N<0OSj+5Q zWV;{_8k2Ojvlg&RUdeZi`r=#2opncnScnFXyA+eEf zBgax$AgjN`wQeq}$%N~XU(}AcPL7q)wvz9C^PZ9(4q;MSV)8phVXBC_LBcI6ZeP+S z=0xHF;7hvAL!_8I2Xu~4=PqVc7U-DH_54{h{&i+j&rukZ)|qVgs>OcHiVe*YX`e}r zr_!{cA_)D?9pNm+b&jECkelxrQVM1u9O?QhR{~{(I!iexf4qJ=-)ooJB^eET;-qyF zf#ohfkT=Hh1VcW}IePU+m5%8d-TBJQOb(*%(B14ZOf|#pBJwS0=+2pP3mI`1VzEMx zzkV?>YfCKt8Yb44rEX1?=K6ci{~am_90??blCBS4T+9(A9=wqZJTNVx>o<#H zl2zUK)Onw47*v0O8)~@iQWUo7c!j9~==>=M>x+{#{nz-pKi~ej1Q_)Oc)Bu`BLYgd zvOX1<)wo_aV)+%D`pCK2%{M1ph-62mw650C9h|$095O{AYVEt|}q1j~AXCXaEq@V<$9G z0IFrFBvAE`lBj|?czJqcP@A1A44_tvQ3A^DFdqWjGpj!g>? z(na2rD3QM=cMAaWZ8Zof;e$>Uf;RE;<#r|HzgF;)q*p}3;c)&8#IfwSmB zlCsY$gM?^f$*Y~X(SLr|rAy{;&e;9nzh(BXg9C)l4}fj`<+BnfP>bX8N0vu+yx0DHp8xv; zL&5t^^P)jYxeL#~59FW!niuYa-aN6T0GbaPeZw0W2o+=ru1$RtXQ*2LqzLc(%w@Z-stB?E?91Wl7ah9bHT~z8{bRL} zVTcIf@GZQ;3nfOppk+NF^dmwDKhtm&yc4b2pLYm`u#S(xx%KQQQ0-4ZNaB1eeJFID z>I*a^ss{rM8l-_-At(@npin243n7I?yvhBXtn1&e1Np0W6zJ!~W{{Lw)$@r)HoW68 z`YS|Vn}vrIvJl|Ybr6bIf#IG~+uK!2Y5h$|IS?Y+%UP|EVlcQSFLY;hSlVZSm~c6& z9(ps@0}~B>0HH?axEB9AtyDrbFh@V{+X!_*<7w^`k|i0R;=YF4h^e7E?STNq>m zj+2QtK>!+v-i2zRhUv>=_4j(Oa$>xr$c+`{f%et6&sP zB(t)Zxqa7ld^MEdHIO8>Fi!>i$M(dlmm>R0R?B~2Y#0lrgBZmmm_=* zIQRHWNPDWZEKjM;$3H(o25$Q_qw?E7Kj9E8bUx?A2|RX?PBAsBxkq>F1+g6c&O{S^ z(0F&)YUo?2kiVMk5y&4v7z^MSE%kW;?%s;H4-Oqr?lv=*ghI^{IM_)Zrxj$O3)us0 z%q!gjZUOKg(K3I(DHiA{#k=B`qkiBC%mJEas=f@l2961(j5q7+M)_^*mkwLZ4s=G| z+dNW|d$#*=Dnn?db+HM$(CcvdpZyetSxZL}`_8v6i-nNw1cMW!G_^p|A|yP8@L<6p zJr4jO;#t80islTOGh!CwpqV+dBms@)h-4@Jn6oAE2H6auJ(D^3^X2k8AhB_J<^modVNJ3>I3-7O0P9PAh1-~>&;CM9;CVXk6$lNf400i^4%AOU2@?W0{EjMGn)WB6JlA8?%yNA>E^I-k zXrmFQ>9k<9ds9|DTgnwKJ^J@YC{1&YJ99gKM?i@~{T1hPFP}Qde`XUv7Ck4gLB@OY z?J(cc7A)jdTd9=xiWRp&rPmJ;23PyjoL0C?8GzZD;#0)4_-cD9S8o&H6hcJpy?20^ zP&koXs^LS@djrtMk8RFIdGA@h?Bbn*VsTY1+dGv{PI8P)+f`$}%b51JhG*)HrEd0Q zZ($l7mH>3oHO_D}F)nA_N7J3{%7+B4VC?$@HjqFH{qQzm1+_2g)GlTGtmu1=5}Q4s zJR%SYOJp|kK2cuD6eXvIv;q45!V#+F=aq3ydoe(w2o`Ra_+BD1F!H8qe3_+Q(Kg3P z#C1d;uHyeYr4?fF@}c53EgPnsJr=!U@PRv4(`^WcY^5aiVI2TaCu!u7tQkl*%rUo8 zuwTGppkoxV7xnDTngfC3_fvK`Yd!aMQ=k)LhJ-14BkWwWze7}tSfy@@yNe5yau`tWnAMr1Z>}&2x-Fgv*R8Au|p>3yOE;godKc-oe8ahm8 zZ!uoz+jj3k=<(mDQdT6>tDK<6RO9O~gtb!Ep=4RP=J_o%d>8_$hmG;oYZ=%#7u^PR zb3D%!x<-;Ko04;wk*2|IFpmyw-zL#X)S1t$Qr({%xY;V<%)0+PL7PFxw9>P=1_&Ob zfX9U?ebJLQTZASR5yKIC4x|%g42W}|cFvR^F+U0^PWv#<8l&d7l2dzpSn?}ziMI#s zxE1d-^Tek#Jouz;Y93vnVuI&DI~GHPy~q8y!0e`RM*of6QaF>OS4PUKC0@uZl82?mV*q8QTs-rv3vDxUFhh&JJ)m+ z>koTjMEgw2%DC6+)8TNxA9^Y4YItFSmKaZ{N~3rAH0X`-e?ZW=qC|kS`1@HuJr0a-QrnXv1Ea*13 zwxMNR9B~L)G|-vjiZ{*v52O=N{@eK+~%tT?gUQX$6)jHBwB3NL1;5so*$b1_LpN6sc@fPA3_+#GNw z6tCIIc#kSRS?mI?6vePdq}qRwzLiOMy+Rn4{cKWL?$;dBv~)3f37d{p^xKR+cw_r;MW^+gbRPpE z4O8IuE#~4N1AfrcN8f8#{IRWi@gHd;N>w*$=-2*6f+@wpHQ*|A^`&MeKEy-wuJ&%q zZ-3N$9-rF*P*R}u*vZ6r_vD-+V^vl&no-V0V${8*TUcTF-pq+EU3xyZNm&9lwjtdv zKLPaeN2O#JR`im=oN{&&uF?xi4GC7Ei;E`X6SJAc8SNQ6e3$bjyA4VM@R=y9H(nP6 zf)G-W#j%5!@#+`r_rZ(jlbsy8X%#(=YBe}L@l4EN-SCph!dtzXJl{qE%yL-M zQDrJQ2i)0XZnGXkEmwK3vzF+Y%hlFBycgnW;yMrav-bPs8rFb9lyh@N{LQzO-3F-Z z&yGa-%}BRYtoj-BavGGIKTFdak@mwEvJ=JLQ;X%y)2o?i7PFD^BR^>0{&pdhH+SlE z%U-D~a3l_^+LInJv-u5_ZY39lu~_(@5PP7UD7|%H?$+W!JalR%zVhg(3Af_q>Zr*F zC7n?Uw~@50CIp2hCmWwSdZ1yzVDqp_&xb~dFre#mFW+Z}oU*6V^N6d#*x-AyWRy{* zIPWs76_;dDP(nH0g!psdggIS$G;E1G9Oh|)r|pQnLqD`!Z{e-^x?oi+lM?j4C)nfiDD)hTW}Aueg22%#;7KgHvK$#r1dSC?X)RSVLS+Fh;f| zvl_R(m$y_EqHRDFLeRJ5!|i;on!njeCaUhyB89V9hh!@w7q)PyWw52nZ%oS$wfAgE zx)M~1zgcrOd`Ng~E!+G$_%eQyOwSLS#*Oi&!)*Gljisz@oRC%UA5nL6K(og z;vOfHn#x<;j!@J(5k-|?C9xtyRy8@hBGckPJ-?FFvPTJmyetBst@>gifx zs?A0R)NnABR{n$orvn!uG42EADSCvM0 zCJQOw&9-Y-J4BPq+)V3uREXS|JmnF5XbIRHmoLYQsjffm-xyp*@fzY!yKa6HOVFa?g=B|>4pnoB5CY)FhAZhp; z{?yq_$Z|{Br}ix_E(JQENQhPT>hS7wZ?m##|7d<@*SJYHM8b3&3R97b=&He~*;5Z{ zGwg{z6y4>HPi}tQlW22rTI;>Cbl8hQ%9)R-xHW*hoyU{HVN5kB_Xy`Yi6MRhfT+@Ydd;|i{=yNke#r8N;Pu~kWscDZf5r0gbp z_-@J}aPfGZ-2!nM&M-}XZo%zJjL{Qkub_#Px&s=Q+>;tKA?kAg|#BHS#DG2xz@iQe6i#v;u7xC}AjGFRE`C9?PV@j{pwRHlDW}$u%ua>tkZk2%<#~mVxUvnj zv<8LA0qZo*$9&i6Cgb)zsfC|x%TsxgCqLc?{5A!l#{vvNFLd+H8ASYAxv8%S>bx#{852X zaW`*~F&t^)SEPsxTNyn~x#m+_ahSUv-;-0#%oYBg$HrXI5FNIDD~1JZQ8dSAb(j?8 z1`TQ^ck72$?e;NC?|cY`abl>tJTJPtYbZU8nfiP!AuhrEbYoSWag#9Luz-^2J(#rq z+aba!+#T_)jC&DF9xcPfGasc=wyDG1hOVyoT{t+u)PzgWyS}_pXOmpeBHFAtk|7 z?dk&0D&v}MAwF`IqKILSNn$zgfCaAZN6A!2+>U)ujIrSxlGhno3|K@vEB0gXn6}@< zWL&CdzI8Ong*17}Xm;@ZFv^*r<9YD)PzIT>l_VII%`Q?RTnu&-WEM=oD#R_ynnt)T zjL5ypG0GqI+-;CXLkzI)ImFAbT~6%UQAmohud;O$1EOT?@^9ABZ`5e~_>hC|G|i z@aq8FdY1PiUCLRO zaMiH+jD`&%PT&}}~WY`Q#5wAuEC&RZpSnA)gk z)x|IMb<9-g&W}6Z6Fc_p9s&ztuN4nAv{5{hz6vQe#0QaE9;)c|+%^mHo%5MnA9haR za$=-c(gqo{`DM+@*}v1WS}+7U26}W51gPgu6-S1Qk$USUZSN~{;tbHV7Y&W;VzJI_FS0j4RPWYI^;vK@L{SV5ZSojzT}9md<>)OSWVXIL+jz1>ql zkd8N5+Lgc2ieL3OSHvXWk3_o!Be#5;OWv;6N8(963AUtFiv#zh)p8*HiVI)mZ!rEi zWzyjEuQ5wC0|xlK=vCM%!j;9$CK;95`Q zqbz|pAB!vBB{LpRRN5AWp_nVtsy|8*CQ>Cx9?Hz6Bdz`-Kt~|s;!%40WGdI~vEYm+ zwFxT%f$F`yRHJ?ogu(GD9EJ`0HyA4HudOsk`7_^UBI%}W`DP~iy)^vKq}>P4@F)&% z;MHt}X@gty!AlWSb|mP1m}=aMU8tGX5@$JczSdLZi^LVY=cBPo9!T;U7jAXAZHy#L z$IWFcJVd$n!%-amF!7{SnYg=iu{$PRV)W@u#2%QV55*gpPdqBm4pxz)@)mb> z`K{7-@tA#d$C!}sB0+COjD>IVY%diV-SR%yq%Xeim@m8R_sP~xE7vjwbyFg&49wGn zWc;kSS!U(;D$)|J@PQsnCX_Y>Y3|Z0dOds-cxNV~ z-!?>~x*l~x>-rh}3$+hemK7x8%d>45@i+4_sEl7$Myc-W>(=Bnvlv@59@9LHdc1;T zff;+hL*%SzXk%fj>>9G7nNw>iO+4G9=}cgAFlnHEUGBLVURv&OX`Igz!If`VZ=OLH zOPqMiFn4tCSNGJOeq*nDm790=%S335AF{>pPx|VpjrnHS7H8W$6UcDp81Fl%xK4~O zBbzFL)yFCA7}Vx}CY8rpC>Ev=B5G8|-%OCp-0fu*n8N#G8>|sz+OaY#^D&`Uew6EN zPpYb^N}`5V#Vv zCfr-=r6A+7Jlig#C6je_n4L)`ewlG3sjFMI^Vq}+Yb>j*nRskYkHeX63Y&v6H#vBN zv@$R87S?qb^$2TFiIJ5Fkuu-w(Y_bd?m%TKyTz1x+&?<5GTqqySu>yO`~8)tA9wZ7 zlE&mw!g7T1{m@QQzCnha9lw#+Zv-Fv+FnFiQqC$|+3ld+Aw$tjhWRuT*Drg7=SSzDJzVMZ^!EDa;WTmh1CUvg)RJBm^uq_RxxS9v1 z!1C=4Qi3Hp-sQdH(3DekzYHxFneK+t<7~4}E-HO#`lyrXk}@tO(ZW|paV#^NK=1^v z+nxg3mq|q~{Eb-!VnQBDCR-G5Cs}8vV)xS!=9V?~6Bk?P^4M|h#};^Ryvw-Xee?!J zb=KNm;+v{L;hg6Yp=JD}92W^$WS0bsXo5vZ7I^SQjNP);3tcDn@FQ>%=&&aySJd%bF-RV}wA8(pd z)6i;VL3-??Wwk_PpkOY9TSL*gKX@W=6e;2u4T4MLdEyv&??B35I;^@cs?S9HZP2?o zK_Jq(?YU&#>1yVff(Ae8_tJ6ERq{n&T9s_8`4^*kqsOo(-c$NGQ(j(5bv zV0KR4gmP8v$8!%pxSv$T|M?xYJCw(`Tz%Ekp1iqn9J`+>_GBk~LfnfpYTr6 zcTZ4ERewFU0Xx_-j7#LR*SkU=>8DlA-=Mg+|A|9MW0F>eC|0eY$INQ-tOo6A`m72}EWjYF}b(ewNMTNj}7+Y<$Z+pbV{-_u3Ft* z5`R?wQb0VYhhvdN=B-6j)8_LEex+LytRo+`9xf848M{{=&5N?S)N7La<;B zb+16=J9M7zollRBh<-Y3)1~`OFKAY0c?`n?NR^w6!+!>}9bP0j_07NLMl-0^qx;8Y zBQ_bS1eYUY3R(u=zdg~x2&uYJfDOU;HCN9e%P_vNUFPN^7n46HY?|crVa{3n+y&wB zXVdT+7uAbj3iL6}K~V%V5GoiSX&q$ILS-0V+C#MsPxzH84HfY}ft96@#%SnK%*|R{Cro3BMmT#Ix5H@o=24 zKZhn(3a1V{TI#V?G@iy_&&Y9!Lk$z%R8LJMu%fQ6e!41kSxbWmsOzCcCLgg zpn=*-4l!LoQyE%U$>=cgEsBs}5)kEKV=&IfwGUxO&=*kiC%q3ap^F8E4U9Pq!)!`j zlVjmR=PTJ_UoEPnv7KEr{iBR%dx%%KVy^h<->Zs1#=0idcC`4dWeO*6F8SacUS1~- zKE|Bmb!9OPk|t9fSf_kR6nAos#!QideWK2?D$Ev9Ju%IBCFALHJjc@{ls>VO_t%r> zO(O+IB17^o>DmE4Ph{_Pl5vnm$cxB0Sp;dRs@E_P;U2d~c#kUBWy9Cf5UXtXFPij3LCB zX-;gnB;iD*#`2yd;j}J>qCM+wJ2#&dneOC|N zi}h@HqhvP>?pm2~ehL#i2le@<+u01+f80HM7vNur>&or^#t!(M#@G1)um9~xwH@WE z-Q%_z;7R$W=LI2(Tg1Th6QkVbQje}CR(5*e$G*hvfBS%6cHw*?)a&o>%tSIumpvOw zENA~8ir0EfQ+&!_(Jhraoz{#xcjwy19dE5eMv{H=5PQ~FUA6~bcf!;3AMGW5>Bj)^f4 zzAkd*qDRW#zE7cqY-`)d`N#ZJzOPCBp1YdpZC_Ar2ZAxh3nzMeb36Irl{|O5LD4kt z;A^W*G&`SLu200<{ow2Vf^S&AnOU^>apTu7%X!ST1%Os%J|)llU2%7~`< zF@;o5GgkPVZgY#}g(ylc@L@Awdx|$Zoi+J|qtU4k1QrLLl$h^-ayovFqO%F_QRiy| zElqLmf`@N!>9&1LU2BZ3h}jv6$+vjx%2s|d$a zMjq(Gfr_jO69!Pks)w5B$?g>3>J=`$nGHfp(?Ex#YSyPeDPpUY`xcCKgF&#WXOySh zEK2>f>_aNUR;HzHzI^u|r|Dl7&OiuuNqqRz*Z-I`5guQlKFA;n^PdI>h!K%-mJj|~ zmD_3^VuXaS>=QgckgEhBO7toS;c#&7p2MBL1T-_G^(fL&s%SW<$6=xP()-N3vs{f; z++Sj5TkigC3I4O2;*x5!=;`7d()AKO4Rc(9L`LF%VfpTPr&NjLE{QCEp$~7zyL6Cq z?XOzDUe2Tw6t-b_k9btuXACMFEx3MHv4@qT|&(wjnYPSvB6c|sqR%!C#rb_Y=HG536PDC*9V;ln*vIQOcJ=;d^&?U z*xOD+6xWzv(|*P11pTo= zgX7KLWNtBSE7jcj8n_l~mQNU*w{mEB;;HKJ)4J4%UtdwW5QPmU5W)BS!LcJ&OS-5= zF!8|qky?uxoR8S$m^f=})!1xId!hn{X#1xcFL3mCirrt=5-dZILjNdItU_GkkbW%b z^q%M4q5K-G#$S2buor0zNQhb_++L}H^1r3wxx;hj2*>y*MX>Z{NnFRUomI&Vp5x6p z4ys}kJ0icn5-h$!l(jd%{cXZp5teiX5VgOH&J2Tsp&rWK z49Fd`1R9ISR6q4Gz)CGH1ig6>7$LkEmzwG!2+0^jY$N6#R=@B&lzJxGrA%id)qP91 z_(sI><}`KnuF9ORotWx^JKu%=?a_7!NBpX*wf+pA_Fw!hc>2hQQSHdekZFI@+`&TI zPwG2rrpc8c*~M zhq3>4;{P)j_D>ZuWrp%iCS2?Xn4{AFL8^=SD$+K$T3M zjX_4W(!5~G{_HIAK8MY~%Dvwt)_u?Z$`|V-LG{!;?;*L}W%QS~8u_u40S}?Jqvr+9 zD#Zgfz}nhyLTR42+)%73L;BRymvRfoHB_v0scDFRWy$s90313$a&8U%w-NdFDjpdv zO%uWS8Z)W%@>X-nS(RT8M{U&I1upR)ULZ96+tL2}{QdH;hHUU%dCR&^>i^TPpYF7P z(|1vj`L+0&|K*kiGTpzQ{=YoPA48oML>TM|QT_C>|LvLo_|>0N?%Rt58+Lno43Gci zi2s*C-KB*ySGrYYKH`6yBL%zDaPx<1T0;jWga(@bd^}4z65LfBLAMfM`p(_!i2)Vc zB5*EVa!bBjvL2Q|IeA|GF;-)FCUe#SC~O2v=kp44W0Q_d&E1&szh~sgQ&GrRK6phu^=<)vsqG zG8bbm=D-U-f%tKxwL(AaljkGosNpiqS2E0L0=8m0zB`C3n~COgTn_g)5nUZpvo6F2 zZiL$)c0CBQ5xRDKFaF^OKEuI?cg`R%Q!e)vrT%YA$a@MLM**3conScT})@$nA9p@@hW&5J^O z6cJX`$yuc9i3Q9rN%$yex`=u5D=d+MZXM$OhX~4o5FNqV+*e_u;S?axIPT13HI_Mk ztpRn$Zv{B03GzZ{%#1C%v}0`Z?4IQwSU7~*JNx$e0JBW!?&6SagCx+AW=Datf&%)H z8}BBFOM(z?TjUHPD}(#a(-l}vEA%I94v@4jUSN=vq_?PAR{SM$F zbBx->4aKr)$}IoJSiXhoLfQdfiQ_K3x0k7N2si}loQ8t!A<#|FyX+$JIYb3zg;^YW zcQkGrFW@_BC}$P%m`vM5Xs7sNs3!74wjOU7u9Zi{*i8R){>gK#a+J1n$86~&F6;6Bh6w&<2 zf!wPlb>ON%w`*P%?(bot=9_QwHVEuL4ZIn>{(Y>6c|HQKLl~S){lNGr9@#-WUlm z*ud>wL?|!0YD08(x#TStZ3n=&3i2nB;_`&P+hLz8*hGY7SLFC03x8s&9(}y>$UC&^ut@{zkr;r zzAljXJ8kIUIbU<&9BSY2*%-C?$7S-%#r~gH)fY?1b;%^@qWXIs#`3iQ5ap=gtb>Wh zNxm+5aFz)S41G!4#==bBk%w)BwN#tIe!!atgN+iuY1lp<``qj9}W2N zt{sev5)EpoP}x1fU}~4~QXd~UF!{Kpx=A>I$H${>{w#hWif})83M-|z+`6+n=AGK)Yb-HhR2_1 z5U}x&<#qC7IM4w1>Y$q=K_3F1%H6yCbpMS;uEfp|ovQ!^0T4vgd?6e!fr>MYF%&fPxM(#PT;G8tb=AJio_Wbqi*&{(VRod3pUHO*rcNG+W*^j^bFMb@~d+9K~QJ- zTMs=p}G4RzR!0`${9rMM9)SstJ+}Z5s-N8PEt}p zx60KmGyLpszy0$VLqf<{`Zf*tE% z{fv2q_mfR3c`e5%PfYd>zp6W-gZVHR6|&c;U&OUu5ZJ385>=xC)-kT*O360U#=laV zc1w`03p{J)*tTp`15Yxxu*ESUy5bQ3{7+Y!NywQVB>uUMq;sr zoZSRCPGrvraDd&lD@vVh$M+q0#s;UViVW-6TrP$R=Bs9Cejw={`4XzC1liZI3mB(q z)r%*OT+T!vT|W!F8}AFPVKhv4jo#TO>O&YfahT+8wY64G{22zo&Yxx%sxx;7sq#%i zL4NtEvHlM0^nc4&?5{E|=Rmr~_Nvb%wwB==37qp$q66j(w`pKZD9{SX%6~d^ycb=q zKTB7Gknb45Hz$6&m@za3*DftESjU5<3`TCj7D#G!gY$tsM>q(D@*L}&PmIHq@n|r6 zDY(gxg~i&e!!7^g&ZUYjMA-rsC>cgo=Eaa6aFD=7vbcwJ+9i5izYkD{x?|yj2f_cz zi$IjxkP7_X&3`5-adydk>9^w!c7g%w(TuDYcVH&Ncf}4*0k$DL9WW0%ga3LLpmG)r z8>dC!{L7s!h3V2635RT1t?IoL!T~d{wMD>uml(z;2U{ME-C`g-xTp_OB{IS(!|njg zisGJUgp_w*-9a0#VHw!QU%NfQUmxxUBbtsd^!<(d?&SiV%aYgCrI6YwC6KpVSXTfw zj1l`oCT@lJz?@LUKmWxD>_*C!1NKAD4=Qn+xB%B(SZ?@OHv7gE3H^_vN%K9f(@u~A^TB(xB_#!Q0;`!ffJN(vZwcv zqO>jthLM4*HN!FTlF`vaMRbO;LG7J#1P24sx@r^tnF_K`>0NW*8fF-NyOA+lW;ovb zu7(*1+f3SQuqA};O8_Xx>eY8pL{;9mp$yR$XI`WrwHwDSH81{axd4Dt?g53f+6lkv zv4E2MG&4yR>2taq|MR*i{39DLV?VooYy(Kb3^L3rRGEi?>frg@iE|kQVqT@RNz>RU z6{sw<#QEEd3aw8?TEZDhZHH%j7nnqkJmZ%WPge#T?j45|&52ab+|~nSx^6&E{j{7> zY1~zgIlB3KK)HT-2)|Wl^GOPv-z$nlB`opH5n?^o`hcgB&d|{LnuR~WA zhVGx3w2q?zh>m^7mME*RqR7do!1P=SacxXVZ^a z${hC2kniwkP;}RCo!>FDBW%#9$%|gL0RdB0(uR*{u?X%cV`#O`B-5@~376Na^&(kZ z(t=fk7Z|qg(W3dmklFlCIt8aLAb^V^hp0`v+KlX=0tf4ks6z~T{2z8t!x(_ZnR&#v zoAI9*m{Pv0tO4frszhj8&`r@lq}pyKY1vSB(fH96J5+L3GlndID%Pnn;&y(cZI)a; zz2dOz_3oP~f-;`;4?($PhIgx3YpQ*L8dL6|?v44O0~Q%C&F~pjQ5G`;0MEGWS#xnL z1IZ~<^(RB|_V8@?buiPAdw;XY#DmW-18=UYn_hXe=Lzmx5*#xZD_#m9f`)N#p=nto zn`r%+prbd-Q}hJVx9`UPb3wqI8(~T&O)khFZz2{X|9`;d=x*c zBa~%7$|y*`c!*3eSIGdIlz#$os$K_yK-a6IL}vT#?><<2{D}H0=pdZ2JP$>+9~}uS zv}9!aA6-iEU=yZR80On7hHvk%Cxc|$PgmAt{ zzTH-om~LvNzhn=ilyC>*Kf^#Ql7&|Fjoy4aRO&{^2haWW*cBm=?;Ko1MsY2QgX>hd zdg($07g*b42Qh{kAKGB^UIl+xA64>o_NGT3uS0?e=a_AJecNXJpMCorKhUiT?ESEJ z`={m-r+VIL-CL`^2QQYi0^DDC84^Z&KKN`w1H=A5+_=cL{y2aiL}z7@Gs1~q>Vp7v z4iqv$$B=rD!Mx2$tHt4uz)BP7x`b19EdtA$!;;_MJPiDB<}iQGS)FXuXz_SQa`h;d z+>O32!zRkh9X=XRziC8BOU&;!FntItEENZU_tgkMM#S#(-FE34#z z{;4KQD*W52SZ>LMH|-4b*nNy~2;NRe87$bfuO0Kbl{N?}Bsr7ZH!(X#r<=n!Uu z3Iq`2t>=*Fv7&Uz28L5J!|5ecvDSAt@Qin}YTD6=%V2tmU;WL0@_#N}g%i|>deZu* zkp|*Fn^Ac>7nAM?ioW>i@UUk|y1Y0lwqx0DGP|5r=pziaG9%5mo0o_|_0gzQseI`tHww&(W< zD*kCXfdB(Rfi;W)jS+Ht0r;ULc*xD@pO0!t%rSt|Ho2GL=xsx=T0{N!FhPXb=zkySmv;oO?U?sx|Hmo*a(RCp{p)pR zmi4~JTAjb1@&9tnUHi+Xj{JI${yNC-uL%pV?HaH>7IC#yP~?DsDx_WLoJ zLY%q5z?|nB=br!bF8*@3|GZ;J;L!hecH7?U|NWaf{&3p~frVtZThh4jGgvdZmLEeK zFxG1L`3N2fNoncUh{I9=&E!hEwxha;Td~qEKt&F*T}%GTgX&AZOOVnk?oy^euFad- zwx}O2nYqT%+vQ`LYxN{_a^I0RXGI(mKFkhTXYfQqPOlwtJY{Wg+W7f#4};UvliF@e zIH{pTXX0x=lcLuT_Yqa3um65lz=*S~ZJxk1_v?qMTC!VIaSPP$ePG^>YgSg41NDZc zW(lb4>kb||)cL}uI4xxj1oqoLN1mnz05275FpZp4kU9U7sMz7_0|F7%8O&b|ALw~! zRtCo0gVCpvE%9 zC;a`gdEkLjRFCm@2`ZZ_mnp>F@;k()><47^iY?+asXG-DKKS_%M5eF@s#%gWt)?L8 zt11PFkvxBa!sq3(rc>K002puYYbF^h6icVmlD@ON5)jfX=9M+oClzF)7DD%(Qe>F?l+Ii z%lkRZyRXoO7N_JpYu}Qfu#S^7D{HswTfk$Q#Pzf9CCIzn^5Tr6cuh7ht$%X>9l@R= zJ1`v_o9qw9SHd5KE>AQikTV@f`d^;$Sp(|9It5hZXS%ieB=SG9O&q$LMi;3HC8?J> zmqwbY(k3e=oa>@nxOU-lVt6xTFe~CGd$n>D`d-!(QC@304pj>+#tx-$NWV>Xh6%8< zq6Tvcm{i}Ta2;$vx4H)5b1PNIv_v?W^l4J=g(5E_zK;4xYbQ6+Jg)0g0*kV1T5meZ z_pv?5z&|=7b{Hvxh7IpLVs;1heo%H^p)-mO3@j6Le2pL0K=6T6Js1gdDBQbq47%2` z$Mn9rME@9#H-Z#UZoFeCvAkJmW+b^_{k)H4q=0CVr)dO+I%AiRP~4q;SbF%`vaxe= z^&8Igiaud!dO-YMlj2s-N++bF@t{RQ%>X6JS9ej3RB)g6hroF9X7kx=my4YLv4rwi zZbu``${qInx`aIAgF`FgK0ase_md+{*DLCC&~&8~tXYHL0I{MxP$a#yJaSmMr@KoNthQ0aVf& z*zV2VUL(_D`&USLdZJhB5>*#k>fCp?(cKWXd-rYMJXeWro?`h%aDbQD4`RHb@ z;5B(0G1wR_0b7KF58Ckyw)F z_|&OWQnGN+i(_ft-hri0;H20wKcZ#yI{_P6_`>zYPR|uSa@yhb8?ERt^9&1 z2X`8T)f5aug?G$BXfDs^JUc&?`i4xU-|6v#R>Cr#8<&5l^%Xwy$u_7=>nB%*&WC^pKPaHa1B=+YC2PVxS-4UP1F>hfZ>+K)IPfO;P+Dff|q?O`(Fe*ic__Q~N<5^ZX@Hs77ZIG5cl>V2~ z=)rqu%GXHJt~CZ|K~R;U{anhcFOi{8V-lFey~xURPH`9@)^avDMoZk_!z~`6 z$2dLe%+r}WwiRcG`b%7h5av6~Bx&=Cw|M=-RVmY;p_y;MIMGdfiH`AFp~R$ajezOEAK%gS-? zhviGt&Kj@hIus2rG=UcGWzgp$-9&$cw?U~T6~fblhg_$bx(nPpeFg9ZugoXTl7t}D z@jf}mU%Igk>}zs|Y6D+dm@JMnK$%4QqSKoU?+lyi)`#n4Y9G@*T`{9;seD@w3QUIGpAcru zb`?t4qlYW;cVIS+QGE+0NxJ(jT*PxMjAuELof?BQ4241`F;2Ll1r_C@MO!Gy`%=)>kXW}|uqxjsM{W4Q*6H#t3mu);fUaXbQj9pfrVD$z+HM*ARldX3 zvVk*bIJEE7%2W}gLX~vl&|z{)b?Er_h)@E$#mM#B{5o!Hz>?tXuKLEeFjA zcL(+y5+@HXxU+Je8$_Jqtu-{Dew`3-uC2pJAF9b)6O?OUr^GttTCQf&E(7_Sf!e+wg}%OjwwD7um)|7*MuR^vG5*!2})`lGlgLw7SFlrlPXxGaV{urf)muNeUXU=rGehFq9kD8 z$?T)RQ%$KBv!`_w+xR+FFH74)d(-p!6Mc~^1PE%#-o@-RtgzqBpfEql@YqM%Y)_n_ zuvtSI&)%Kd4rA#=1S$5EO4{IF*(EF`wZI>wdagnP3*$W%IKA~IvlQB>_^I5r#Ash! zuYY>!^f`qSs`td+%0%+`hS1oxa_(}K&-(A(?=FY;RrmlFN2a|aoNZSB+}@g7$NaRi zST>#UkEB$tKpW062}c>YzPxgK{$kAiPUDz1|8Xye4dNR=GBf)Kf64F9rJzdUUv=4fE zR&K3oM)!`Ac>F%-gI(Mg4Tbp6*;|5vV{5EzQT0N`b+Qr?P`>5tb>X(aKtLA_FFYEu4v`XCVwU>PaAHr%a*D z$_pVGG&g+lH-@ug<^yiMwk#t@o+s)}LAVvDSymVoV|9%QwWa_lvW<%7sLRQlxV4WRU~-z?sibg`GB$+i_q5c_QC zn8ofN`kYgx8KwrMhoyT5U5902#?v#~a_ukB%ma1iV(t{dcGiThdc7&ZxA-(}_UC0A zG(yy=VT!!XZPw;aQ3W13@+LWjuC|Y1d|U6}HcO>w?dGFiKF`df#~)BJblKKCLHR+h z%i1Kk9ge`}+8DI=-u)Jh2IyBdivBqm?aiCReTUxgZrW8&_VdAqgIl|$4lhvd<04mr zd}&UyvBuxlulFZ@cDbN&>6h5e$ohuMIA`f-*@kL={;S)5RA{JriMao^p;i=?aaa3+ zH`2V);j?XELh+G6@B+2qg3pW*h{{wr$P8hYCUHxE78lMVVbCmui#)9n-wTXoXF>mX z4X5X!yC`u#FZBXw|5!s2;Ce&@s{uFL;lWOBK|^dsC1zZ|v~YrFz(5!h^`{Gb*Jr0& zG%$sV(wVJAYzw#3ovg|;thM;ysIM?ro}(T@(yqgd#4$3-KtPn-azH7eeTY7hK|A;S zG0eJXa#?li@**8rM=erLsJ%G1m#JNuW5dZk1mBa(Qek*)&YRfN0wsW|4%s3^Mhj!p zH-G~mqEn1KCLJq97^4`c`^@n)zmTjn_g4PGRu%1!tPvHdrn@=i+Esh1NjEV-$Q_V z6&r~v;+x)bz4G+3Q8Cs1cK_m?6IKxC=p`f^BG@S(u4X@@ZUyiv!sJN&JCO0$bG_cR_7L^Lsr?d}RJW-M%b6bFx&K1)mX6lr z7GD1!k4b(N5z!jZI*l`k;e>#z`uNkO*QR!FJ9EPEPebrwqS` zC3rLYYowvYNctA>HC^*Z6bSM|-X%hoDb~hI&DpV`+Y%gM_gS_9Y=RllvAg0y|Dc-F z?wK?(j!rip$)LLPRGhbBy35AVat$ncft(pe{kkwxhP5QfeJ9B(9d7Llp<@z!fqrxw zq8D-_WcAX_SFgA^J7474#^?z|Zp4gIjPVS=_I}j8t{2JIj909Tnb=0b!&nIwwuqx1 ztAxM?`A@2TGfKHnOXF&{)2r<9mzfSFH56XuEEIB}o;vGKvY(6cG$tWDJJ%qiwqos3 zTc*DAg=zz{Eb%yME% zzT23KHY!Nvk+Hbg8L0R~)nFH+{6%ey8OsM;OLg(ZHrsAyQQ>2@|Od}(son#c+$9SoIm;~<9A>riw%wxntuHWIP7HtUJ!zVtxE~ zJnWz6J$@VD#OGJmFQfnaZvX37ng_ryXMB~3Z`d9?{`C*O#(}ibYjWYC#j*eA(?~oH zep%}k^jze&@*$3McBr~v-UWZpwA8g_>vHRH_t%`W9&HK%Hm^_3_42IU6hZafdnzxY zrrdDpA2(g`Y)F-wuYlk7_ZNw*1$`~&jl~fMuBewUEdk#M^ZJx}`jMt-B|zjU02_?y z93F!*D!6;Tx^i_vbO*N)GPbw{Zd}^eb9$lp(e9<5va81=1mA2TMnx7hF**y+OC++R zi`VGc{Eqjb|1MqT9fj8|m&d=U*b`E(aaICe4+;zE z#6Ryvpn5A#e4=rg77ocT4A=;@nOgVz&b2O9gl;aErTDl$^+DR7I)<=#+9W_VD<*2a zx9;q5D+v73S|r!6tNGrw({TH34|$_1yfU&O@{x6U*S58)dYuKp$SU^G90RFJAnT;s zOft(aG6IE0lwIx0Uor}>C<0; z%E1|g`Qm5^Lz8!xAI^fg6^n5cFjOe1C0QBlh+wLPf?Ej~@M)T*^MQdu*9?MW5)TOa zmgSxk%X51L72Bh(p=p`bAmiqoZd%Obb_-BGFr0E%a18cmdW{(%Q>Dl4xc=;q zR|Z<3_>@#pQ8}^i#gt`;c~;;o{(!8Myq0u=`^2CL7d>)a}kw|R>1 zkW!jG7ds(@vbX$*BD9qx&Aa8;zETu$x4HuQr9)9!1Y-Dk(qyv@tz=(xM1SzUy@M;` zC1+esXgM`;Ruf~^b5ocEGkJtn;Cp}lO2^(k>b_LP46`!=z8=;%cy?!Yh5}zEAVf3ld4KZ|0}13Bk}yI$2eI{lo9`$f@0<^a z-`_cSrJVs`aAn;b=myfsfI$@qU2jcNVxW~h6+TWvDPV5w>$aCTAB_b0wax*zfwJ$H z11mJAK-U76{a+haX0srz!PQazz!n0nNSG<_9YjoZudL)ojmdOmatx%DoD zvr43|{z?X!!u=9j?GmmplSp7+$v_ci+LU3oK7kXnczMTbsW5rOb1oX%H*OK@GT@pf z?KHzm?A7o00smPpVYV$pe{s%1 zxQAvsu!5bs2y_j40fy`*VUYVL+nRpY6o3qk0EUMG!#UEK znaO}_+Q7c()RQ|cyD29S9C3D|DO$pg>*8WCXdHYK8f$nWl9IB4oQZ|lH#qS;_u?C8 zbMARm-T5P2pvI`|i(P_(q(wVzs`!@tH=7bPzQpgs#xZsIvf7|yfuGpEMel~p%^Z&D zuU3$rcYQPHlQmzxHN@7~U+GMBGqVjS=nX1SZq%bdCC%(GPrpzC@D(ZRy_zj^1+v+j z(m~7pj)D39JQUsP<(?1M9eDqQwA4UfMfHRmty`>n@y*AUJJX3yu}dxvNt^uxmZ7)U zI5%oCkK=deVnq!>0Vgqac2yS^O#gH~XSQS~&+K2|pKr)ek-=MA z>2|sJ^TQ#hqhWyv2cwSw+PLdKc;lhEIPZGfP<_jF?bFhy7YnZamVyX3vF%GVm1#`{fD4e{IdQ+&x^=4%SXoNWnRN5cbkqiGV_8TuPtQ`KAEKQun{&+K&`^Tb654?# zr#%dK%msxuP3hfDtxry9%e+fLHc~B>hvtStHU-|SH#Oo+H}KCU;P}l+q?UKzoS4cV zXiK;Z?;kk5jf`0FCB?9#jYh&cKyCqncY z>Gq@k$esL|&ZM~yy%MetOt8yhM@rWhG;r6X=40IDL!Ls-;3Aw3dr9kCiJ8r07rp}UpBF}=xh#89j+=IyYf;+5OUa*?HXpj znq@J5$l{VeCT)5HBVV1~!WFXlmE;XoJWBpx4Nx7DF-gKOuNXKQH-kFavN~WbqAHqt z=<0C%%!j!z3$}4*TV$JdApFT^orcpfXfsg+{tcs548nT}0}i{iQKhmAVmV?G=zu?4 z*=9-@lHj4lNlk= z*GPAmUL25y@$}(-^36$oFktx|wcdMk`%#$U zz>4u2Aj&Tj8zjCCW@rgv(PFD|)zyXb02uUM1N`lEEu$O*l%&57rZi~NGvR_y_9+pO zevpnh0H$sgl%SHfljnyake>rme9O)hv2`Gky9152-6LvN=5FE+NefU+_F~iY`nZu{ zqE|$E0Qcy`(T@rmM)Ei(kFqSp()_YDe3%1J$ApZB;;QSk!~pE#)JsUv$4~~jm)bDd zRsbIAt9n1@>l>FUZ`E==@Dpk`wi&e!@5AYuCk4um5D!1~3t1TSZOZIZ(WU1JP4#t1 zeRC*MxmwcsU84w%8G`~?%BDA?SD$dZbcJ2R=Mut8m%v*@X=o{3h!r8%`0~pS@|W$| zDqIRI8a_chkB4cjph*D5z()e037JJgeCdnMYk3xNa5mZ++PbDD%e*z5zJ!Y+|D#fS z5zEB4-k=`u`)jVx0Et}(dfBIemeTc&h!zQ^cNp$h>RQb*vX}o{zJ89urr4B^P9F*M zd8&~lm3!q*Osb;C#>@#PBAuXXM{+Z(LCbk_c0*eY1o@8n=edyE323nm3_$zM1t9P$ zq$9MC6i;K|%4-^5K7Tf9OIGIUxj5yOUkj`)O;=v$P@^^@WsKdBtwtD$(W5N1E=lL7t1e-WCMtAdBhB+fFeX)siH)vKRM`*@omwkz=liK@7)3wqWNKlLZhgNv za#(?_CjE8f9>;KUR5yCh>Sb4c@&g|8gktO1XwjE#bauq}n&TC|x%fuf{V1PrN`oCt z^KN8CjNirNC-T3pGo}z-{aR{ZGiJWeu(Hi}{rd%1vVBGIs_79M-YRuR?Kco~k=dVZLRP%dJF?lg?MH>RkD2i*SOHD{&h3|v)|Vi92Ry*Y1uemjf5zP%A#tGvMc`?~tKzw8qQ2#LUw1OH#|^ILJc z?OT@hD%O8H$nUS+O9QBc^XCkQZM*d^@$c6++cmJV@AshjZy>_U=Zx0X0c86B1%|R8 zn4&BF+d+PRO;w%)^u4bK#s5x~`nQv1+|rK3EC(f;9aqC^8HdYONyYT&y%6${d)&bAS^wHH1 zC4rFvmwtO5REOKymO60e~pmyu$vrByCD=Fb; zkZWWGlIj8=?>EjfD|g=7Sdw?>I0;a@8Xj>yQHg}~`9nsQpI#)z>`!RpF2+(C{0&g< ziAkn4MqMI0yEdi$TAt41wOd8?KZDw{fak@x4J2DnITIbQX?nMuOv}lfVWwPxIV7ch zNwy%DyZ1oGF>0EsMXPEzaMkdDIlZ3tiA&PM_QThT)?7^+T(fnhi_{~@1LW}}(h%sh zO*!yLLFdg#9ji8^FU>YRo!UYl-Z-MO$J8#0N5K3AymY;R80#COyp5*25l>0&55@) z?kRBOcFIu`IQ$xhVZOx&Q8OBuz-Ggf#(Ft zb`pHB-y?WsTnPwzbrK-`8-SVEx&~Wd{)i=*bfaK1&X^Et075hckl>vG`-4US-dYUs zgfWJ<8IZf})MF$IXjDo+5CuDcdcEkP|MEsN4M1(1ADKaNS^_+g82zG)B;aje#poje zpPp}A{6D&LVx>$=nsM)%DGY!IG#cj^grNpKt!Q!mS)e;A0v1Q}xCVgT5b>CtX=A;v zR-jGZ8fNPLjxtqv8X37hwc&Ah_cNoCkF@m$f|(^eQdz;LK;I{Bkppii`G-?uof~A4 zS11aJLq&Is7AmO2S6T;EnCKbg2`NPKfUj@)UD8_pbLT6|Ls{cIvsm}9dIFW=-#p9d zgM{Kj<-XL4aE~{ty)Z~i(fU+wp`Jq7ID%il(5@}l%70+@V8*j8q=8%Uz&s_#4p#!{ zmRML2C=YsIe(qlUTyJ$hK1#|_eUO`)aq2TAP<)m8owgEA?kVux4XI7(=6y4Z&Kqj& zR-apMY9D@J0ckE!FyC2uE3#rD7tq3j`e~}4Bkj^9ODGN0$w)H`%zHP5#GZ3h-aW}P zK{}E{doORKm@8MNn%t~xFh>Vd0D(UF8Z}^Hpu+b9u_4km|C2tUIsY0CQz(M4xCaGk zlf=Mnrl!)?m4*qn4}l;TA0(aM18v2XEZGS@8MuRcJW*LtrwxUQ?Qgw#AW88n_%fgW3cP z2(GF~Q$$|Y9+G~Xn*tL}(DkKY22MO6(fi9hP1-GR(O;2mIy!!)7_J6$UgN5dk1E9G7hH7eE#6jqW_zcQ zF<5G;Tgas%u{hMkmfKJkyl$ePUmZ%?`?P@~w!rgtsKP6@>3!Q6%S@nI`-Sdmxn_=}0xBxDz+}ud)BctP-jwZ~2I8pM&_rv^BTXEmo(%5DWteTY{l?U|i%dt=d z*lN7f%IG`YxoO#)ehJr?pE7x#kovad;!Ma98zI{Rr~54iY;+3Va`EJ^JCk5ua8H8a z9aW3YULe*T6xYkNY>bjIE6Z<-GTe_SZA#QXO#_=k&}8M=IbB^{7ch%WWyNAmG&oOe zQ2@{lz;EVR%+4?I!iC{{P z!TTEr2nuYg-IG9>LHF(iZ>saU8)&?QEcT@GwB z8DX7!<+I1Q@Z;WtqW9d&Ebp`9+8hikLlov=eoGrvaz~-}0V0CtVDQnV9(&O`%Urvl zOrSmAZ~sR`tgCy`f$@Ux5(;E8d-=r93pmk?W#pPFSfrgG@mToq<7?pYM7VS zFIT)`j@6T%@1Ggn3Fd9FpuB{P@0ur3%}&?MSJwFQEqH*KJSVU4HAUwmOHE{B32s3+ z-sYb9?62H&uqqM<7)(`9I^6%luL+bQ3p3l;r}&kpyfP&$Y#bZ88`{xlM|g4#hs})F zIC-U4`BvjEBN!}UJQ;wwCIB4#Bt@%Oyyhcv>eMFsU6Q*rUVhJU?fuY8wAE{I>l_1M z;Pnb6sl&_OQWbrKv~+Vx9X6DdtVFhpwaqbMBB}0;Jd~+|+g60ZpM|E}R4T zKCDM%p;(4D57TePge5NWk%DsKOZuxL zCj@BR)GRov0o=z4TErd%h(7X`wM@kB9NatkCZF>+hC8zBsZmScE6(+5EaU}y_Q5VK zySGrh49L@iLXHOY5tYH@7FX29Dbv?;NUUT*HYId9eyAqV^r^W`VFCvf_s|lgevneD-pj_kc+q^@7j!3ePkCUqE5X{OcN%x5l-@5;R65pX$ad}xQ zow1-9W@N>yhgd8YPlrp$S}?=+nrI8Wv)Afd>@?dMBszmWOVh_ki4{VjtLxfbY$Ic4 zOy;ZyE|g>D<*2l?yqVbE7R7eF@t~Y8x&Z*t89WaL*?M9^%{cE31`8{0zVT&SW|(jlKo6b1hg1M|#c7p8!7*Br2+S<_u{;%DGUw}To1Zmzl!17lva zuU?oxJKxDZ=QC&$YeQcQ+a!^jC*To*s4Mh=t`E|~=AX3|EWX$j0OGrMLQ+`^$`0Ea zkC6YU;^Tz2Gl-aKBW7T+o0Ps1d#^%hzsks<(Ci%4&%H_~2i)k@ct%&-4|4MhJKMNE zSmKrKMWSN)jj{rP|0$y9~2gA1oH(lFqtMfJBCcT^5QT|=j;`o&6{=OXAd zd7l|QL@ta%GAQ@7!J>T@cv5~cqPnwHDCW%6uLsZ0`bc^>nHesjeJYmh>Tk~F z3U%#-E#6K#1)glGP*cnaM-*715=hG3j4lxlx}bA{yoU?nLHrzP^6E!=19A=$;HdGO zFf|aMLfle|l|zv24x#27#x6eYDWW4E@xXiouX%PAT?IjlI>j01NYw6hUz7&6g^5Z&wERN zFt}Am$a!*28w+y-mdqMOgg%t9P{f|&4>qz(GX;WERB+<_c9_9gRukW07hI`0+luM! ztF;hM`VGk|LcPBMGl^R)BiQG%fgSd^t4E)f2)%F+P;opl8;*K}&LI3m_w^wjV)d(n_U##hcHoaH~C+GHkSHSe18pgCaN)05mh#D8Pm~$z>szy!iD*q!FP87P)%n zMIQ`cG^GnQlvdw`Az1Uw`{Tc#);@jVg?AQTeYUOm+Hc}1!y^Ea30m|7ig({0W4j}( zcYNB0KR!SOZ7wsy5NMjm4gwip4A8;T&)c(^1=m_}I0M{WG{}L(W2FMwjoHY_Dz^FtB53EpODMf(x!4Pzs0P76~ zG6i=GV$u&nH?EaCU1nU}#k0zhbNV zCj;&LseCKATfemqGN?WfWnqDU@0x#D%0#f&;YH$W7XFhu72Xc?Suk}Q1p|HB5+|Ir z(8fH#uLgl>qd|t|5jstoy4u-OV68^CAi@H{tX~b|iBq?t^4X8xujNwYQwb_VOs%?t zE=?Dp8u4}#K7k4q1qPe@0y2~F<;$UHG)M$UAj>9~fFkuC0MFJI?63O}2My%uVBJY+ zC13Of?`)?idY#omuZz9qcnY?GftrCFVr%#h>hr80aWdE~Pe^Ay7~pyjbmSJ-Gidu!sJ^?SXOHLi{ zpU_*meqT&4!kKg@gt%<*zcvLz0Of4BB6JFH$ZK2x;f7th+lq|XS={qQUUxB5}cKiIS;CRAHZ|-1%u5^f$N$^$Y)>(`W2~Ls~z$k z=vD{WR}@?a>^V}hMHRDEXMq`rh*NiVbX>FfufF2X}K%r7TeY1x`d8=9*v}Rg}yY zo(*AL`b$1sa##!>l1mEQT56c%LTo%}6GfX~vgvuJj-1=LddZW=Jg1flYW|tn=k0;$ z2_e06yRJ2H;{Pyh|38-W#!Ik8|d_Q9tu0EFc4zcAf18g{0 zip9G9%aA(opk^&u+hDUxWTIV<+;Gr!jUs~!?@BVoXi(W zcjk${MX$@644Paxej9-VFdpO&)js-k{~nic6gkCM3fP)C6IwwZe!3q8>PLs#keCc@ zia3CRix|Ud;W;7Fz|>cR(%&5{z_X^o>KgS8eTkL-t#*;EMkR1Ap>86!#)RMods@QY z@hOb=0++lKCIPjEU;nvwwZS%Xpw2_!uPlra!4m~p0K7nAzHal?DJjrqR-APc3~gTq zV8NC{_M$d-m+qZKZRCD?t|^Sh&6`Vc%~rR(j_5Ax;UxadatUE!^X}z^am9Ug1Omw# z67b<6OVYr2^G`!y;X7A>UNWK(;;Gyn)mJVbIcY)lr&zUFf%;u zhNS9<^g}XwnJ)>r)e#R54;3%t5EYx5beZ_e(2r`Ur6Un9vaVKIH1MQ!sl{z@_=>+o zi)}_v=iWxxZ0YXT&c6`FC_LA7J~~z#lEauVdAs=*@VME1WYPU-hk3c`s-2GobAKdt zRpzckb-y_se!Rc8hl1Wiem2viL;>!?8-D(v0Yw5g#VGCi^PtJCkNCY)JYkUrtBEH3 zst-6XAI8S)e);4gcQMX;6YPb5O7W#kFX+#7WmyA@=NmaXZK+rvo0agXh;z3qU;akP z2h3ZeV7d9CKi-4QL@aI;s>_k>y<+ysD->~0?%W^o#i_p+3ya2bwZ82e#bPavoe$UWIR6{ zm>H<#ANfD*y?H#;`~N;18g-O7At_sRN=V99+0}`%MD|@B*|S7;V+`$eP@zzktl38P zeQA{?yJ0M&kaY}U24lIO@6PfeeIJkSy*%#6{r&y!f6k+$b1?7a^?Y8}^SZ8QgvZG+ zs?g?7lG$fl8-;5!CBK3PUEUX(6!8obCA8ICGXuj+k}-#e@8JCQv8H)uma)*3|o2%?oMa>Mv*VK(i5x zghVf)!PBjfv3;mXzWcGJq7j)%ng}sZE1ze1-A7yA;kMwGoq9{U;AOOgV9EqO-JN0| z++*pfP$F|yN9LjO4G>TDf*t=&J*#xGr*7`Wk$DL185YM&N>-}E@ssIGos?%&fRl^q zG)6{KZY~UjTJ^+)3Vob;FIifv9P;$Y9*)J7HX}RgQY%64=AdbW9nll8Bh+>JW+vEmz zC77{!A0hZ7wvyDF*?a}H^O}|4(P)V>&3k|FO}D?`=dqmYw|DR?7L)u}1Cq(?n=kx^ z4IO&nI6uPoRDAJf)-+zGL2p zsUv&xQwrJ+p|EE-wB8qWB!)cGR_NLL$?nkIdipP)7i~?-pD;a5!NiKE%Lw;bHOM0C zB4`g*V9vK#<+oVLu}rc%roK4flU2XCmsEV}*4mP_l|OWuezMXE=U#3|lJD-dp;m+> zyR`ZPg#OI-$xfsIu_DR2M*CY3=Pv$2dq{k94O3m=@B+LsN1lnVpbq~Txc*(`x1>YK zgd}o1#VO=nOC;T-b;U%{Go`6)Bd8t7b-SGw-s~G`)XUZDmg=ZndUSK2*t?|#Wp1^~Ehzu`CweZ`ta${72=SP6Y&qgOU35&Ye*H)MBb$n2k z&Z>U=%)d9_Z-m!>4q_qE{HeUq z)!e>)yJJEOWio_-$za@(_%D;u5X2dL)A8i4;&y*Js$egS zy#1XVid|na0h5tj1rd&ZAM%-F+uC&NM%c1G^F?2%C!Q$(TQ7koi6Yo(-M`t#ti32q)Eb^yMoVxekWf89_nJ971Kp9Oce-8 z^QjK{TYq?cif^+f?e&fgSM(>>XDhb_omHmJPto(*UKQan_@g&Nt`VDT!&;oS{we(r zxaS8@SGMK9afi14?<9Ho+4cBeR7X^^?ML~@GzV-ribo_2OuLRCbHrTmL-P=KJo_z^ z)Rp@o;;5ND0TETW4qIPcJpV0y==hJ1<;fv<0%Kh(U3qt}CD!(%kc=DP_6wF4W>R?i zURmDOOVj;$6cQvs>~2VyPUwX}Bg9PSqPFdtPiy;1BUd_me;YhSNYngCD|GDsD(6We zSi#OD`3z#X{|BMt$B%D+cJd&Rm-k0;7xvjf#22?LKf=8B_2Ra{&W+={2R}Y$v2}-K zArx@t3pjfLoTDA2FpiC zkR+84^?(2#j%$W=s|h1V3xD#iaUsI1&|7S4A0`)}Uj`wE>3iQ%Q+sE%KZxZjqzO=Z z+#0(8*5+C0mx+}>e*9QON~+__z<{__OW1tL1wPb0JtRmAXbH8pxMct#=+c|pI4Me_ z4}=VeZ6Po{ zdv?2I6R$1$E(C8pOt`b){C>kR;IkG{pA5Q0T;2Fr1%9ASnvf0vAU&HD)BYc(_I#xm}4t!)QWx;5`#r~_#7+SQ&uo(mM zCxCE#ZTh7`@cjxw{nOOvOO}fUmOvp{5lXy*BRq@K#K(^wO+cJ`-e_wIjl6jA#qYnA z4#)T|sWUumY)epKL9F`|VA!3(3wfBINVEc`BGz2tSs5Z70nUa3l-N9$-A5`v*LA4Y<*uY{Q?6ar~Z;)pg+mrgQdbD=>^}*^=X)N&iI%IJ%pSl#nt_(&2M_In)DiwCWwmKQx$ZsY| zvIS)6e5K_!$~)xRG*YPQ&!yX0xV2X2GF;mvA<&oLkEU{}EO|j&+!{!c&KPczi#o`k zQwGX3`1Z^dP3lZ(7S;3cGAK7R;b&_1A3xsAa$T#*9G$KeABgjT1IJ(MX4VGA0Sche zKE?NF{Zws%wFd-jv4lg#P6scnDC0NpvbvqAU#QfidJcjC<`uI8YigSeATz2b>YEwY z3^eGPzD}sjaApf2$oQ)Cd6>+F`LkYrlU%MC)At65vRq)@5Jh2m@(Nes2PxtmNYt2C zKPd7hH6+*TH&Og<=3gRqV)*_m{A1d8-`EJsQ+|c^4h3 zVUByKHeB4QHQik9eh!giH{N~UQyk-d@rfOF2@B!tq*f_}F_MZx}*4i2*F*~uy zQ**|#Mu&l!7qfItAsriYk%4YQ>(3wXb0P7Ca|mARg0&X?L8DCHZawfo`EX=+9OppY zO3{e6j+!*9_OcpFw@q89saghco&y-Fz74--F@qo%9Q|0-ehd(#c9A561AX`Y{h|YV zCogah3Mo~7SNbbTqpdBfhi1=meT|y5IIGhtJde9nM&BhA)nQR>%aM;OU^fIH4LZMR zB^MM<|!1nPWd<*d$RGK+raV zpb-Q=`QE~AxvYqdIC$qsyyh4ZlRDfR){KF)+Q}27^2K<%t&7i(n3r|Jx-=3M235&B zm-6}i1qe8>i6L;wKWYh9(ajV8WaLR5p(b+eY@s&94sOuTgJC2LrYj*kL%Y}Z%l(6_ zT5-}Dy}U8!=xk9R^-d?}2ewA-lt|o z6vV18D~4|Q{3V4#)P@Pn>I zLwSe00jn`~kX0ANQ!a%3+qntYO=%{48mIV-u3tEK^*|%fnE%%P@x`g_pZgFyUR-&M zQfmh=t({w{R~PY>x75UXl5xVD8^a}W^^2?-_&u`_>M<9ScBID>Z|1omxXdw+zeJCE zH^gPfyNAWyAr2cOfLU2u3Cp3($t~@em06g`ZColw_KqcY?Uc~L22Ss5RcL#eN!U&u zqk)Xm4^E*XSjCi~8ZIPd^NG7M1N-SG9XvK;XJ_=zhkE%sqH9kgewV~v{YpToo(}ro8;&S)(vhk1%s-boDn&XDDU` zwnBO(vxm8rh!kX8KN=AFZ((~GXzHrg~~U;!hFdAcpJ{);b}d1X5_6Zis0 zflQxsXoX0Y1`6C$0;nY&CpuqMG-SU=gI{FF?ql&4woNyYut|F_Vw?@+J zXJE)ui12(@SEppF&qpp_CeXeY%z4TCfs7YZA>hCEkowbp2HN8Ct(}uB#IB!oi62x0 z9?&cgo|jwKCZ1-xan(tK#M_}ALgAODzTPHkh#bFmR`$ZF=|`4!)`mC#7QHm<9T!4XR=FyQ}%%1;`zEiEGZ z2qcFRW2|JSA%}q&^LZ>oiLy8o_eA92&X|1QhM-A1VG)~LgLgYjGi&{V&osgFId|nG z^+M?PijibeMIgm~02tu{2;`SU8!UT1H{d}^39;RvJ)MpP1YE=ITjW;Hu*ii;1!0p% z6yRB1zP?cM3dCqD{zkQuUV^?BXIsZ(VbPMm#qtv~IKG#uMMXtb6wpPw*wC&7$N9tKf(e>M%0{RE zHKg?G{tD=R7W;Kzx{T?h!=gJXAR+UkzXV!~Qo2Gr>pt!#dyjr1O3J)?iuHy5#nlYR_x#pSGo{rXUcShcGcG=6v-LgS-OH+~_xQr%FQM})Y}yWe zSbIi)A0YFOZ|=b)Sd81__h7!WM4I+tnZY+hvRYSS?pPwUkYg+Pw&i4)!jl!>lUbSf zKHc6~{N4YvL!Iut%)1{r14Ris)b+WK_g=UYLp(3?o5ot|g?-Grx?F#c{)@`DjN4=W zztPc}ESQ<@Na-k@Y}~c>eEkc%o$UB8c%ijVmN$5fEA^k&=Xt*hFw$&y0pJ$rvw7qkdh zK_?e0cxj?F`|=yp3i{XQlX^=%OQonI%?Fxk=gS|r_`)K&+YWVbUb8dpp-}{%X5@i> zpcJMnB$!93&v;Dq6t|lDj2_$zU3I!Z5=ryp%pUG0h_^rh@a(Hl^c?9JV} z+_y+2J0pk>VzTQ{iyF3!l8K^(mE-_#AT>l#KV4m+sYaNgOU- zKVU&R#A(hN-qk}*^y{t&zdt>bH7(9g)%YQ-wW4~($a-ski}LNLgw*cZmB&aUki3Yb zus~Ok1B2(10tfzp7QhVS!LL@X)I~Jt+Q4Y@2;%DDl}TFyIen2-mQn6|kBQF9&?sTc`7nOo52 zHW={BKBC3l>3G(WvA?gzaei3cNlwp93S3z03bQkP$EMo0|P zet)1Tk^^255)~_2AZo%)%Nx|pN00R(89kud>5*Gi3F43tMpGubI`SP1WJVJotLK(W z?p=ZPotMk>us)`9$H9XJa{;Cd8SbzIs$DVxA%n8^+FpM*TS;WN=KNw zPL_C(2$Q?(iXlRtLR?+JBMDqEgopufSDOX9>cI5>3~AG{Di-Z^Hkm;{LWWVRM4iPP zJgpxh4yf$#T!uZQAN-`8`^ubHZ|Iw8@gWOoWaip*9AUvI|LkrHEt#b*@}g;k*K ziZh_E>4tb;7QAM@9*aM?`aRuoOLY9!qIvKP2=fSyX50-Bmc^R>1 ziW8XlS{IEZrFBKM>J^(-m62Mluq_65EE~cnSEoIOoL=GP?Pyf+@`GiN7uAw1vc_TA z?|ahmtbiQrNa4d-N}E)o;bsrt(<;>su}HI^GehAy>f3jYMv?qs?MjK#<~@dSR+Iye ztx3YElij#YCG_u@=ErA1sMQ6x$t>G2cUCW$zVZCQhA9f2cSDAOFZ(n77O_R?)j7O{ znTcessk^{XM%QTF6H(7B9|Np6Nf75@FY3jY*b%oW-x0j)S$>e;=%L*xv)m0Ws(ur0!`cv@7xf+z!7{oIdh2l(F$ zGpY@QFP$S-^IzU$FC<|!ZD&>g%?0MfI(&?0*e7@)dXxk zyoPl^1%ph&De7S+e@S2lQ-MRrV)Jjz^i8e{AS`#U9)K;I%^aT1XE}=#tUaj{U9G71 zk_;B&qtMjqaNY^Yz;7vU$JZoAjxqh_AhiH=m^C5RoPoYg0d+5-e4wsLamzvGT}}3z zAhXGJxnny9mBUdl3K`9UhW@|V5S7Upu7E3E2ARC;2U1d!%hqZWs#dgkaHm0X;Mix! zwyU!>Hgi0qwD$THP?B^p)7y3zWIE)g^S_TJbr;I)MM1*1OcV8m5lxk8BHf=kx#=Dw zKt@-rS0-cJZ;xS5&d15JnF}_}kQ_l>0&`jqdU*k!Xfs8N$^#e+V&+)b{n~bZ`plhi z9J^(%)#!$&0nAd$i|_&C1p&NzCt|CQ^sA}_ej+AL4@Xs1hd?4 zXf74k4mVCym+H&yb_;$7(E_TUiTCTa(jK?vGEr!o${3Yxvz4?30liQ9c2LtJXBIz& z&+a9F<6v7Yt>UHQO6lDrI!d0zueQnl0e2V~=D+3LsKkxKe(F33{#M>qx32E~bvaHW zmt#sT;p4i?L7|s-8CTQaWU6FMI+!Kb#Br&8h4S#@mbv`4;=pfAUNogmOkX`Arw6qn zsbfKvU|6wz9ARUiWlD<{wzKmft{|$cqqey6LFbauLwlvKr=p>pUre9HUY^rC@B2YnlnIintYm-75;Acb%*9@L5Pj@$x%(y zA&k+)9}PA*3e>L>u1`7WZd6e1f*HtKr# zu`yXxC;0&qjE`v4bRwB9(Gs~PnHJM~nM#EFv#RM0%-q9)rEgK#HJ8et2buFd8^DX2}jDn`lGf479{(&+Drj@$WzJzpcX5OuuLqU4%c~P$s zc_i={PS%zFHpbQcFiW@|GG^xJaO{t_ccu)^3^x;4OFsUxw%_~fx!aA+;7UFyv3VUb zxsy-@XL@hnI04g3uIq!Qj5DCUWrk@|`4Gws_8Ry=<$c!OYAQaF&sRoYN+6s27CG!H z2qYSdndOp~V@N`ETe=R^$+hIuk4C-AN?dLf)=g#gIjgh;I@E4Wh2<--nW7MuB6aoZ zxbz5!%w>(kTH+1}r>z(v2vpd&r^VYydVPMV!g~#G?5(Ke+c4?Wkr63+=wm{}vnQG$ zJc-%7s@*YL3Xx17ru;iXNCU59OPK1gg075#g`n@Vzbf&+RLjBy@?$(pf~{+=rpi@R22 zTBr$e@Ir*#w8tKc`&C3a4!M|-5 zO9+TPn2@k)n|vW71f%R5^XQ+ED3PooMp^L_qyAU4D!(`d$6kH1{!N>v{|MLzVOYxnPM;-5jJ zdrQQ9a_jqF)^j%ltUnamx7RwAO)D2_1l~IgimRL;%FEP81{=Q1CTuEj<_S5W>w_Wq zU0!SrgOyoEbzfo+^UkhIsQmstg3ALacLmmu)7BpPf6*e}XQGPFVDSCnml*pEjL%Ov zh0sk{U;qD>^x`eDQ;U20<;HV%*Xtr}J(a zR3d|Mpc>TbPLR8CmvZjjjIK3&x9=i(*rZxY{Q&9+=d$Tra)4f750S=`6Rv~jpa-yh z@eTGBotFVMJKNA%^VB6s7mu#ht&I?gb{}b~hJkTLjf&&y$}%!wL?+ay8`FZp#!xg4 zvd3O&SWEV#Zrlcm z$|waf^+8{-u8J6BnNAu93BgcrTFVHQSSIv(bUQ}Cj)XV0_f&2XRskk=L!2oI9D1)F zUyv5G7l(WFb(4T=O{+5xGhNF`(rog$u5CR^so zKfL|Vhp%*wo8MWeE)>^IB+?fYtyC%Ow8kq)m_{o7Q@Y``}}P6BI~)AUlcs!_Bv z9LlFoc}>M3BYh<1KIOSb)V4dw!P=l@;36v)e#EE+G~do3o$wUzGAS8T+1hne`m+=GZXoLOl>Dekxk~~YqCRKka2#RL zWEvTli)GhEW+BmLlQa86nDQK~m-FmeuT}-nIcX^ZwbY}2y`3|XeMG-SF%STn2`D_w zqGyI1$q`Woie@IL!=V{+UnL(~)J^hfwCtq7x#NyDukb6*G|sPWpoDash^$ei^N*F- zq(tXG=LXH~(WXo+O5Vj?-45~>9+xpm`D~xmv1*>3lGL0*T35|Zfy|`8o)f>6Re89 zF%Gwum{0Vuj!SY*=rtLr)ur<`bn+q0p)YK+%37&;!f~>LpP|9apadYt8QPol5c?GU zU$kmtwA-9xgw;oBi!al_~P`iPc+?J}{LM%{(7u(w$I+GGP>aTQB9CWV-n%Ft;A* zzt~m<5KcgFfLbQkZsdv{?bGiC@Z&r z%y{!k!y@&9dr4pR$56)`Od8VbWJ8PAUL~G zk2vZpmMPsN;1E3dD$7a(hY0uOWJ9@&k5q^@@^KV_yDW9v$f9gRhk?JgAi~WppcM|t zEgA7`+R@nBLTydaWU+bc!Hl8=JQiyBKqk_B55v^xtFlpPHjs0xhPd=O03A8xm|ie;j`f zB^Uo_E{a(WOjsu@O>@&Y{Pg1tt8LJ5a%?M9C|*peN~fQMTH{9dRa1W9ZNr|BXYM>s zaXEQC%RnxT26jb>;D(5}qA&M;V`veYSscd|0-Q#c4SWgwAarIZT-2g3Uqk%shhU!Z zG#!P!?JGbxeV(*at_&PDeq@op`S7UGkX_{*RQ=M(`6!WC!f(QJj>utisD!>ptoev{ z!v%wAq^|%D%OeOiC}Z2ikADy7+z4bqJxrVSNW^zR_=JIH`sP$L$gDg}IAI&oNVXB_ zrK7WbU#s(3UxLH2+w!92vyV*BO2WI_()7l&$)5qh7IKMOBhgkp&Pky7aWV;l6`$6f z^2zUSdTwmf=ID=v$NI?htvhfB6cv>W52D_2NKAIVN`UO++95=}wg(tE`T>{@xY0g3 zEO??!mmiUtC<-8faq9AJsDjMnymp+0LY`)+@CfePaNd%eEO#;)=!0SEuP|F)(dDUiw&n!T6 z1f&wpSM}nzPXVQR=wmfQeBd9?YA*7^Q+upEDUpLdPq$(*Q?X)oB!(Q~oIokUx2&oP zshQBpLRLYwY|LF5eL-ixg~!Suk)BG2aa%!}tVS)OGT$$2+S+k@2_x7d_~)e)}e;}(*B zF$#-iQwg7DHpl7&Vy^7n#XTUs_sra5){}eaDkstao1!Hx(M#eF>#p-^?DgXOr(dWU zp*LQUlYQzVL7G$RK+eUB$Bn<3iccPxnbXpy?&R3%@%ahXfWK3;oX)3-aS#3_2J zKG*IUx$dV#4Dwgl!~g4o9JeT1T}A%h4}pUxt5Ja%6Wcwk8UH8YrsaF|oxt^IvtJWy zi}mik*x%XsC^%1b%pBps$ca*hlLkyvRtMd6<4)>p?`^TKI&+0bQ1HadfU>|9K|$dh z9h{11{gVZNl!XhnSkP%2pFVv$Y7a6GhN085WGm%eu%rJy6uUl=yU-Z5UvGAlJD&dEL8aE$iPbJX}R zdHfl(o^d$8?eOkJLPM;9Wsg%^aKL7c6W|+lZ+zXj>mS!c_UxDzwIAsiv zBNLuUjyL}~y#gKK#7BWx^|lx!f^HHr3xD@6IjN1=b;R%zK#e@X-C46RWa|Vc{qU!O zWdQ;;>Ji1hs%9WW!D$?i^E4}-e!mw)a89|fExKqN=yW7)vd24^`&0&Gaq7SL{jQg1 z^x}ql!_Tuhc+$eMC0>brJzc}ChK2Y=LqH9!d9?sHKLXoL3T$EOU;&a3hP_|2LJD3W zIpK#iW3D1+J)|}Fc4Qb0)M}>nfI#jIiZu6ten=JC`2Y-n)CmZ6e1*VAgyjTpf(JF^ zYa>j5k;Fcy041QKHDck9XGO$bt|04MzOMoPa!+^ydf#kh;te43SElPKB2&As)E@i( z@zWka=s~l@xi6W8eXb0LLBneY^tQVkqMY4E03SmK+7m36!Rf6mmrgSFCNgcnE+=mx z>dt*qdTXBn#rJGe*sJ;KYOj#wIH$kR-?bO~6d2+H^mB^$1yP&b;jI;3(|?@MF(wP{ zE_EGJ#a}E>=$c@9;9%|NW%lx66KxF+%YY%alQj)eku=oORMdQi!F*VVSsu55y%G6Z zd%*%h;;kHtFzMkBV&V`gsu1+@gG@2ovj=4~#oxpD+zwfD0@s`XvtN4{rGC3i=6k7t zbQq-anNKoi0W^XG&fV$)#4~5-1Y0R*kR=b2dULGq+r0|{+QqQKZ{hoPRb<~9h$Bp6 zzhgWb1mo?UZO$^2(J6FCBwq>NmmUnSbtwsMN^cWJR2sr59*DiC>~c{bk* zO2}o{AD#6XSN83m2&`sqP{;IRx0oI?r}H6c^a0M}WXI>w;Enb4HYS+T88xutANZrp zLZn`9Z#T%kRIPO}>LX6E)Y?}?4N<`RsxbTt;%EQP1E0l+ zfVao#7Us&3%2*>b`x?UgZ;1BBf_0=dW@=jfRRumQ&l3T2{J52cMB?3u2E6AB;^q0A z`90g?$;QG5Hxi%y^K6j0yo64fT^D7hy)UkdLWnl2`v9(pc9F&`t|n+1Uq#a)AGI`T zRMNK$=IY5qQ;2B-^rJ3VeUhFzgkJbgRd30JDQ!G@K&LtEDekaKx~7*9%t`hhVT~DX zq-(J-%Kx3=@T?i^NRc?; z5iPa$(f(e6758ktq8TK1nEsy*=6fq%Gy5HsVYLC2X$N?LO7JKKoI6g99vDrPhAe|7 z6RZ#49X)>^l%XV>N$gaKgbTkuzlqvxx(IZ4$=kL%oI;~@Z&_y{mRr>1D)>c;hV!nj zz}BRl4I>5^?MLjU2BGFy>xIK|3xkg-z-GzRxe(zK32z!iuuhI%a9|Gr7SHY-Bhm>; zVR;5&D-kow};=sD)FyHG@qy>;$k*hL^>xkY^Mg&hK zji6h^zA|wOA6tR1_CI?&pi z4C&1C#bsa0LAx)-d~UvSm8Rf8$a}eM3G$5bAiN>dzX6e=TQv>InaJY^2z>ugt@ZYk z$Y*ZtGWKnU3wL5MeOsoM^A&hsDj=j_!Dlt9gCK@Etmcm3L6V4hSnqdbZ;9q153BKa(+Xdby4+Focg&`l-$CfTnTiBgN!UU3Xi{Bu}#{PKLo-DPbJvaqtXrC zvKc0U{@tmWbEI~AI#|zFY3FiBpEuRKyrf%IQ5iYoy2X&4vU3XnlTM%o*bb??REjbe zHEA#H;Z|I`3gi3Zj2+MnNct91Ne<&(``{}wZD!9l&<-$EnnElVz&V+kLs7~Asl1c2 zFGzl`LjL2?r?~!?*2%(xovTo44Z$x)f-0U1M~n#s;+?5`TY5WCL1piD>QIl%8|LJL z?fK5-k0?dXAioH>MgpKFq#lK<3mQs z4Tyl@pItU{YmoE+pH8WhUY2RsWYNHmLg_&Lb4_U|sKTmw8mE;<6dc#0>%Xo`-mmk% z;^mz~XMGRJiV}(&TbnVuK?+orhWQX#s<-rFNKCVLLAETWarh>mdlu%b%)xn;g3Hy% z8&)2wTRmh2;i`X^9w4W>o9`FrZD7N%YeqE4v;S%SdNxCsHW4^t*Sx7A&fpuJlSOib zF#Z9p#;;d%EC!<>5)ze^DJ|(HBkT37MOyb(ZHw3fxZ~AE$Ir`Gx{vF7S}<%4ZhN1& zn4nllzf9P{@2VE?+g{d`XhA#NN@Zz*anrZ?&kQ1dt!z7Y_BdY%;`_t#RDbNyj|V~3 z^byvj?$fPt7>A(7tbVtCTx0cNm7#@@nAU~(?6N6`Se)fxapN|pV&8{&c?*?;y;Q*^ z*_ZIKpI+m8(Z8O=o7dqtzGUvnZrUzj4A>`cI7CX+IP`?1Ra&pHB){CFi1(UKaQBS& zn=`PBsi~g#m5kdbh@s>)9wADT)`D~74)l*~mT-8!?#2D*;;ns|zklu8PJS0Y0k58v$i;I_;!E)oc|BbjQ)!&@P8djthq2hUM%cM@QH>Tkk|VmHTI{M zPO(3R_+MQ|gj4wUf4asFw@Sq??FSJ4)87M9|0~zk+>`Mr#N`V%5j*?rKi)BQmwCHI zMQ|B)0@6{B9sF%hvyoT&`r)ww`*Aq6Ui8W6M}kix2N)--5h>-|&c7yW2dzur5I<(1 zx04x$|MQFe{ijfQ`mWX#L)G<>OiA8q+_c}Of)fm$Y zO}<@9u>)!rnxze+ELDwLM`ECVHUaN*ImjhFTFwic6|n{%2uzCjJw-vF)dBJ;;fpVB zlwKf9DLZP3iM1C3C)W*~L{Dp1j#VzSw4EUJGAUSzjj5CHE&mUO z;V=J=Va&*aO=Uo+HTg!Bn}ai37+Aq@a1mdSo70tnr{D}#$Mr>lIb@$7%{BuKHi%Y2 z5!r~7@-o~QHjX44P}q=S@K=|>!Cq{`QG?Gl?n5I3rwFefu*d0TRozQWqIqHgj9jv_ zO=p}~&lI_NT^#rjQV7kDF_f?#{u|I#pBjg$Q=;$QH{A~(xh;Hr3D10T`!)%$7qA}4 z$(`Z3N;2I08hMvL*S?J3ufeErmG;8uxZ3EtD{>z8adzyaLcg|+C%?=WNg@JMjfYyf z!$&Hh(h?g)NS*J1_n;!FX^6-eOTL((T)g}xf3WmXgb!Y9bn!4!a7Em4Rlcf^8R*ubMPviQPk`2H>tdj`hs+2dKIpHNX8RR*C(!aL>@ z!?)yZuB2~mrf*s)KEPwuRp@NN8CnT(UcC=iZOJ3WAdT*Z)#h9!nI7qr@UYw@JmhuU zuJ`mF8%YlrIR`D8TQZG8$^|!ik>0i?>g4@~4D>8%_{UnfiT;B!L{+`Imb`22V^h;l zALWQ!9`T(W`E30j0X7m2OVImy?vlcPybWiu45UT+hJoK3$8#b!zjr(!opEq$nIdkR6D(dmtxTNu$J6E&*zVxqqZF_ zhM2l8G*JxRjX2tcD?D6fjStYWkLaiy2@FS|ol-IdlGe3*hd2yNJu0$J8Z%v1oQ5 zbtSJ%Wf$R!z>nrq`wKn;{qZp5$4gU6qVKhGaqinO-w=^o!Hk&vV zzcVg$A`w!;w?e!4D3u*Go&PR?9O9Iw;Xk@CYj62NIq}PWI2eLm2DItz1q4iU>;@R(~@)*aM`L;W7VNf-Cu`uKFD78*I0Y!3`sQH97 zQMhOcuuG{;yRrxk$2AS61@~McfF&oWo$jP4IbRrQr(R5WWBo2AG2Yb=R>Ep9@XUIH zPTVx06wH45u*P;cMQ;lTH^%Rk!#vp$jPr;mV7L=bfxfVm#9ALjS(aWO z{SxuS86pqs9Gc>=NE#;U3hc4?N;!_-ImaaAAXV`wa9LA!`i9`KOrx&|98Ofzw@2GmF2$%eX}QdH0&P0u3?v7&3flw?lgrvw=l}()8RnaoucZ zu@x?GQwPInvof(D;Zz?2y)sdV_1)kBqn<1>in@7gASpy;;7#eqOCp9n^3h9{ApY6A z`O|lSVH#M8?cZYn1ONh>eefyw=Foz#yy#M@+p;i0uv#I9d0ViGq~-7A$EPERnn|Jy!}io|h^e5M;nc&UjsNP^0DQ0P6`kv9@|`%y^>4L(VG zb>3Tl`#{R%P`1JtZUqy&=$H6Sw~)X|G767RTH)}b)UDpubF06AU>bFIW}!Q#f$|A? z$M@VS;B4x@G3bYbs^7e*v0<$K!I*!Z8j`H^{Qp6a)6;=~oR}ERhL-u}v1xBXuEbE? z-iP9Y=!Fl9BL;ML^qrOMEb|H$IQG8iy4S+a_>C8wLLZfXVFN5**Y^J19Ai%c zoe{z&+x`=`?uPG+ldSa-tx?0dr3{&&&aZMZ~#;gbJdu+vWw7GSfTQVZl=#7S5MrbH35FMQL zdt>tOI{;aik*p_BHznCfhW+ewvmOeSn|P+PwhL73zri*Sdo++azkZS`2Vy`Jfg!-Y zAUR)3X8;|;RXD>vV47tDt;-qeBexgSaM!Q(TteX6dL;#sEzn6vLm*}ivKAZJoesXr z&dJ`=-kB$+u6L250P~v9W9HC>A(73!YUv7l4rfC&@$ZgcObDF=k{A(*B9k=e&rCWp z9#Ag`yVd@fZU;B?k6)%lkG;B5v(}A-WjlRo;QgOczLcwbAtY7<5;QKxa&#i0j=d_? zw6H|zTsuJ|G(!MHKWMW}!>o$V$QzBxjoNZAN8`K)`|MwFGb+^7qQ^7=aEeU{C zKQsl5WjDAutRW7;MZ|!=x3P-)Vd^Nf^bHNh2BC5m6@H%!dmi|#1}ltV|K5Q%JW1nR z(w;Xk_fC?83=NxTLPF%Uy~-8sUWlK`gNa-bKV}eZMh25;Lni<{+GSGR!vnW{5Bezv z5?)5Gg8kH@URv_$K4Z**aViOrnpVxRC9Zr8;hnaUf#*u6hEJ}&kbj?{e`k&ts`IVw zulbGWnI0j)qys8&D%Qc`4keD8?P`*4|Rs9frtk zJ7C;nl5^#5zB94Uz9YjfME2VqB;Y!^YeCgmc@-v{IUoS-Yq*8^8fnv0K}}1Cia*IE zVo3zP_jh*(k0r>}w1jZ7>y3z-6OqcoZ{UGnbc6q%U>PF!m4F9NB=RbhrW~Bsa|W># z5-ghy*`_5%^9XBAYC5AbhKuMlFd2rCtB7%)i!f&@vnqip4r#;6ysmj>=J-%2N!+H& zQ!3r;wpEIdFy*&PW!*dSokHrrvGdZ)CAP8g*3g@@;9&BBW0 zAPUmTgs8{L_o8AY513&mYVv?#{(a#)LL7ZF-sD@-SL*3J;yz?YDS1?@m93C73GZ(+ z`vZKgJrM%Zh5{*3N*2lLT+~UhlfZtDS(nBePjJyb&cH@bo?5j5B6?Ed)bbp8Mp|>Qcrf|GmnTU#(>q-6phSW5c1mTz0Z~BD?IsX*ySms2_$O_ zNm`Yt!@!YpvA!C2?>jHOU%or**lMu$ ze%}#{8yW-s7*kr+vF`M(wR|Hkn$0=bbr! zu##AYd0#nk@vY4`Pibx24-ykJVFP-mvrOa#8l$-0PA8e*z1@6e&}K_S*>?B(5TKYm%` zCb{Mym202JvtaoALK_yNv6ghSP?+vH6Y>PZIQ<{BP!^f8pTp&X( zYh~QQZ5w5V<62leED7V7C@IH1dnQ=>tUqnIx|^^AWvPDvXkLa=e0VeudoS zW4y51c^kojQnDCtwFvs|=#hn~`v)=^`^VLtFmLLD^P1!wRlXy2J-QXJ_jR8acs^*( zC21dKGN!PE{@E|eb`}VdyWccgHP=1|=L!_T9o&<%@KE&dR-7Cu9D)EjjioT4Zb0&d zo>;(y*R#!aipi8rtRyadTbNW9TD^f^2K#@JV);Goa>!?S1sqm!RiTB4MO~YPOEt== zYq2KI*Nbhog0M&ACf+-7McG$D43W+|Z42a;^DzXXL>=p!X&brSVj($`F_RaoQcv1&l>Ul@0!X38)4 z&u?0VlU`%U18kK@c;2ev$jG>?HfFhgspyJ>Ud zoKfDmazZ#vORZoX`-#fgGWurY7ky90pR`biXntlix794nd%id0uvNhz)rl_;DPSa! z)?9bI3b5BC*qjXB*gB+_*`pq(#3-MQJ2>8M9s4?nRy*T({sN}GLd>eR=*5z6g((jV z2FGf3jF34V!*;O4GaS%$hJj`V1Rusrzab8BZ^R%cf8D(DY~|r~%>+5N7*0~p@aTv_ z+Phd<0^^R~W4>z-8%JbK3}Y&XzdPI{9_xTa^W>3}w^kl%41>chIv|!K2^?<9I*7wf zJmcIym#ymV{%lB!(77~kn2fN35#IQiZy&^7IxVj%0ikt{UyK9-01$v?P_e5uHrhVV zBbN1y7FRQwX89aS!zj_i8{Sm@75eH*X9;HGS5os6O!5S(W^B;K;My6!)%y5s+1?ra z=MOb*X5$Hijc>rE=GzaN_~!!Q!(=YCq1%T~uJ6^f5B1xOr%Yt#c`u%GcStUmw~Gwc zwNV{Yt;^BY7H#|q#^buEnA@>&%Dry9^7n^l6+rAxfhopoU(^2z0sMvxZ+-|{{m(PE z_D}z}hByD!kN+PIKsMBxzc1MTU}qXUM2d&lPkN1nW)ky7*$SQ=`j^A`=jBpFalG>#d`P zmgyc7$DdQ9%X@ZgX4uoR|7^ObNNv)FSqWW+a7?_@jgUv8*bw7UICLQL$gm3yeiH;+nt&w+4LXhj@D4v6 z;u%%eh7bg^Nj^UM`vsFZhX(xf$p+4^#_Krqqbr`lJ`?w|^`8VcE%&o*6Tznw4ZGrr zCe!=aNP!_KT?OSd%ZkTQd(HgK?Kv@Gy%Zkx=&EAEu|GaaM;DDXuJWXnQ#DO5@uVE} zXrS#ISsf*76v$LWI*6ZeDtuy%%f21tpVeD@LbAb={F|Od+P0yyKfdvg_JzuEHBN0^ z2g6)?m<|_Jz`By?W0wQXJi4sn{e`y1K1+;SMm+B@oGd`xWr&+8SQ-*1|3pS^yuK61 zA#)>EcoMv7h0tjnN*PIQgrC~RStC2Sd1a<`KWvpOYZub5n$r-kkM@`Qa8x=e^f}GI z+$%)@MK|f68(|cCKi&9#s~SOc@6L&P7b`m%h@#nrqB!1_k&Dk`9|@!keT-?(;nowx zRA#KA3S#D?pJP<%(hbtGIcg(&J9;nT?+t$X%)99N?vU_P@!O8}7x6h(AOA226a1t1 zXzK34q{&$6U|k|nWMKObl?I!~d9D}Jkc^f&yxwMg=e}YDe}9U^wJ*QR3_K8@fV7oU z89c^cRzQDwP5kTJ(!nRDf2_`bP%zELKx*)$cSDmiq+D$KLIx|eJuEkZA%_PQwu9Iq z>5UmsXOW$nh~Q_aF_wtz071l?)ys%U9SKAN+1pb)?`3E>@d%(#!+~bj;~j@VCw#@` z)mZ7u;yBE;;5PICp#C}r*fB>~9E^2Ho?<7&vmV*EuNubP)@fu!yb4`s={P{9F1S}_ zXe1GJ+tH%_V_U?&h-Ql!?(`pC35t&^H%^S33$l5VkN=vPV{q@ehv5OXz@%9>>jvx0 zv?m2UT{$KE^PS`NoyonJPepijO1kpu9|~E$_C`TDjBPRv#?LPj*lQ}T4mL&zd)d5B z6DbhbeZ$rA<{y;L;WkFW8Aey#kL516^shLZco^Oc^v*b!#XZ?o!6Zhs=T`;z#4i@is;-N8p0xNAvYoNflDE5zD8 z?znmlZHsX_HSVL7bU^y7&xQdhWY|U2Za7Ac(Sz*JGj|9H!GyF*ccs~>PYz$p>8F_N zg_{t%={Efc@Hlw@QQJX?YK_ox)P{0o8<+?983~E!A76!JuE{RLxtA{x3+L=;D+$@w4*hmF zsIGc9ZR*u|4tmBs5VyCEw3Nq$A!onmiG|1Un|C?( z+UYUzRQ&N~RA6Wu#f$iBe&*RAt}$O0-t2p1^&C1SeqXz6&gG$``<)F+$Be5NN@7>8 zsuhq5L~$}7Q148(R6C2j!R2}2&1uq4yH+}e+B5L)^sWw)$4QSbEi49AuO4O3!}on- z8a$C{yuXv^Z*okre`+EtB*UsjfS;>iS?C!6OCgu=QHt>zY( zq3wUA;h*G^@PEo=P|xa_@~_tKUvTW?uqnD!#&~pM2jfxOp#Zo09NQULujKz~@Z2h8 zu)%Im+>~zHNxZe2k@8VB~UdU?$ztF4U`Mrk3*?w)Ti^etIo-`)|B! zyE^QEi6TtYx{+8@7vCmf!^y|i-N?)m*}o10BB_Qy@DJQktxyLYky)4;3CzszL>`if zb&=vJNalRQAP$s#+s1@#$*qVk5aLRY)?}5HPL|XmLtyJNWVVKC3CG#wJ*Whnv0^x9 z7f}7|lv@UDUCA=@IRVt%Q5PI`GgCeIlW3|@7b`DS)1S~%q=wD<0m$!(pxg66vDS+o zN@#xV&2QWt*^dF7RS&;$+RT-IpEFN$PmCiKCEmo>^kG*~e*_pv??`Y3X6@%w? zPf*oogx-?r%(~>Hy}-^nh(S*ZMVH7|XE9l4uU0rd`Li-U zxt%$tl|SI1NziyWW>ST(E4Y8yj@ajwr6>FhZ@-0(TF9C4s#vL<#=`3wwCTF2Gvz8p z>Dbn|o+iGGRa_mZeKEzPYpFQH`qh%hd9B-w{|9;R9?x|D|Bsi_;c|7jDpXE&l~jtT zoKKxYQREP2WvN(5%rM(JmoPF}%MyF;RCE3<6`_V2O17mIHs%2kW!0TH1C^m>nL0lLpA zeNInb>-h#i5z6%gr2Z^*(eLphCvvEJAs6u}md(FSB#>@UT7X0q46uxf!I%K;FD>&J zrKQ64Sl#>Y*TIXKYldubOojbNsCv#6_rj(f_OCC6qtJT1-fQX03y0;asR9lZZ+jpQ z4gDsj_1nld3VUyWfx4$%(tGK8d!w>2{C-Q{Uf8EYg2# zYduL^%{0<>o^(gi**{-x)Eq^YvERSEv_*{Oxd^--qKk^e#PYjN`$j@{t1q{nBFbHz zWN0~Vd!GHC8ly_)bd?>sgpI18tC4E7H?7a3K<_2ajQJ&IM4RQPB@4&btyo$eG}(0P zFZ93DGFS;i_$+PE?EAu2bX5bo}H7*A766 zf=V(aUYs`D^AX??0Hz;(@f&EC1PqECsRn;R0(f!i)lcxlOVXcb58hie>r-oAi$1iG z3T(O7Q{rMY5K6Q$<{pyDykVciR;+K%=cnu6D5O-y2)@{HF0Dgx1NsUa=Z=^3{d6@Q zUL5jhn`Cg?X$+ENSG=!d9fcO@>FXCNOVE%#Sf_1}`Bd%(f7MtWZ%1dim1yed_L)N4 z#VM?u%b5F8RA#D<%sB6AwHg4z0xiRj&UiGhm8~g+vu88*yO?hCn=xND_Y;%7$T4~K zI3b=%qXhpJ^WLwjSjH?z!U3o2@Bxb>;%H#4BtJW@ZjPB}ht0;yQ8>UyIIJoD^&GPl zg?&qXaO-M`$&s!PwLh0$n@=|fnW@2#3FgzHB@&gyqIJkWhxGl+*PlCJYkA}tca56r zNFyi)B&44_T;E;$OAaXq>ViwoagGc((l zOGOOE7`N}+Wm=V;`qgRmDs1%B?5d&#%$~$xCx{M;(7nNQD|Wt^c%cCIp)FTUU>!Zt$x$Kdo3&ZIvW(--!&e z?=PQlD(tx>;LA3ArYi6AgKk@uB$=aTIs0ienu`bLizUrRDz1G9(_coND(d5w>^C0g zwOW_m4$eGU#*JUo<%2k2Y+h!$>=(j5*Xp!HQ3YCQUk_1zu4%Dfqon@!B66U$ep^DH zsA7(1$J!LA;fU5)3A_xIk|JN^mmTF&UM2eEc6EQ#Zuu$kV~WjfV(MS|F~ennqv^P( z`RBmiplbQ1Hw@i5Ga!7>BpnPYZL?^w%dizUQ9)mmRBt0536%Z2q+=EvNzvrA5WuR* z2QUb)yJywn?9wGbFbHvBi?sISx&aGHRKDxqgRY>lt5b|TrzY8ctY}n2)9%gbx60)B z3uvjhhL^c``>}^3=Y_riR7XcykXutEv&+!57SC?1govt-CsC=nuJ{kMxI9#3Lt%j)wSr z^t@K;IdHgZu{%1;OSfSkQiufIiv$r;FbGm8jbneAWE@NDnd~fLzzm=NHc9YL#ziZcY z=t%AJcd>*oQpAX$4j~wQ_@dbf8ur8?ooPImPU61Gpk|ZxJ534rl}7Ek{f#igxm$)mUay-w z?@%S2Lo=~IDmh6`sD%8X>tyc-`e#k3|l^D#FiZt6dToOHgJr;R4vx463D+rc8B z{`5KWiD04$D2b{cM8p>V`%_M-OR+9Zx7nskedpz$S2tjWD_*>@&3lu`1sW@QpU2mw zuNlAAot>q{MG_^p2`xyH%Iz17b?d%mJDBfbkH{9UwC>=G;D#bUN8fkx_qI&`^pTW=U^J^ezWZtJ^w*?Th&G=|{Dx7*q>gT}CVE|A+lIM|!x%kN4Q;9J|W&?}L$ z>C3R_qW;9j-=mF$YFJyj>N(JUjF{D#bYqBi&rJbBI$w2`lX#tN31}!)3b%It`C0%C z?Eoydm6Gvb(^Q#QrULF`EtXKbaW@qwCdBGNf1<^ z>$q@+2tm#CBO?1%7ydO0^ z?rgM{qT&K{tLqOh1A5G@OUzwZZLAE9z@j7C{0IEYqdO+sd0kRpOhEx@}*n{j#OtX&Igr^kk)_2*G3kU4eVo(adUebEl z))!9Cw`3UU+I^lR|b^)Au?4Dn&p#CsY}J7fArz zbjt;cs$S`+UTJ&|s-Pv==@=#et`f8Gseqfd0P6jOPoTapo%-wp7|J{m5FYsr)PXKW ztD4>bq}M-^a;!uQ1@nwhxm`~$pmVeiZPBjhnoH)Qz1CM3*hqWx$e;<9R?ZB})1Ehu z%s*cB4b=TB`o;k9?N`6-*-$V(MM`~cUUK`*K6{Zka-N)B>R-f5LxtUC z0n$QX_j!51<)(pFqbndUcn7**oxzJhdO#1ZmBYfRTy2L3yQVUMF^`_rc%8Th3MLnUK7_O>^;wC17+!vx8IT@Dfo{DXzjH4DGdJ1= zND|C7ZCWtff#si;9_ZGi1L_B5bNam#rk z$#A~;*t$+oEFA~@zG7+S3#3Q4g!+O?GC{eg_0xj1rt6<+%s7BPk#jEFEi`41TW<}^ z*me`>v~(9rRkE({Lgwq41D-mdFWx`rFJ&b=>YhUZaj)TeyTqS#Pg&k@o-MSG*MdicQ~o^H)DK=p9rL5zs1Q(Gs$zHl2Su?@%D9WW~MaTXvn;4dQ3! z*EQ1>sKIBajxq`;#zI}}pA)1dcPv2rhWWDZEh12gD!nc99P|VPEkzx6sG@@!cWtN}>E||W5Q7VNJzZmTJRAfW#ej5Pe#r}@T+*r2 zT1)bc;-~eaGSI-nKOY)Sto7i07tfhMHcpQu1X}*{#-NJOvIveh&+%?@2+3A^>)UV z-k&x|%iC+*00Z`J#Y|P(>3wl8*-~cc-7=RakfvJi0ALz==u5rR%|OY_^jCpQdvOe*O0Vwt9+q*5jfq(T4uxE^}$wtIw-&wiWwu&t!=avITB>y_#y81pW zTVa1)bJ-fJ$7h(nN0v@V2ZW*5fey=JY1d+$+UkfCx&P7v$Xh7D*fM|J&P0xIz}?Qy zJH?PjZeknUGCsFTxXLuQB(ea@G$dD-aX_5EuhiXlk;uRJm3dHp`y^ z^S%(&Upl=bR{V+@94% zR~$lSCh)qu58mH$U*W|1@Sjd@$LwBJwe-M~trs3Y*|z!D6~7Kx95{Mlx6Pdg&yJki zb^i77s*Gok`#0!(I=(`Fz3lmuM-q>`C#IprWedGM;uIr?65qa;5)^)nEUb7G&`8W> zyb9r@*m?HOn zI@#H+4j}hR7KQBPBY>`($S-yBut%;V7B(7r{k}&33@8XF*;+L5z6DkmzZ;4HxADquzTJwB;A215BytPiR>}lRcX}o$0 zP$y{7Fq;T}qp@bUAz`7>fE79aW@%3i{ytfiN?>uqWvpU=zFsX0X}~F1ET3|#b4xvS zaWJEr8Y3tvcPRYp7SUXa;(rT;bD1WLwUO}(p(!I)T%BPHq zDbFntjmW6O^wT2UyUGIfr9B9uhSJFDpE&pucjo0sDw73*#gPWZ(3UEoiq~n71@HEV z*k5bDF0}qGZ1mcaIs-tP2qv$lEtvSyljP$fQ*1I zt=pMT=;8*|iGVjS<~c@YdQOKwO=XG=4_ANjk#U0`JYOvI&5U#OHkPmbvoX1(vtgS* zbu+osZSVIk{QbDXIT?p&XNHQP{5AQ-(;4|O-z)MOI&quYQ#_-?%}<U4Oip2$YI)JChxMS3D%D)$OKpHd2^u%89swFq3_!}~KBpYWAgAqaz7UA>;X_)D z2L4sSla?uen_d016guAJok2>B9xfi;6wZ2((E}ubekz-d;uzBk6VDWhb}H(O{eR-s{xc z9G-X6A&s7Pdh2Euzr}A3bgFc>8cYuvPMnKao1JpYN>D!SxkNENRyDpau+eBnsrTE% zut(Glv&P&adz(m3Sln`Y{N6x~iWxiIF7_bo?F+swR@7=jtGi};#KNa%fk+Asq{Q-c zn-$kHYX=s6;pSwI^HMR|(|%ZSS1iFEdeZ=O{@$9TjLyG)CY)qjE@TOt17N0~#9J8* z%C_}QP5jGluV-`{_Qj^lybNe>(jM8fBGlz}+KuK5NoJ=+uWEsmL=tuU7LX7eqDF*H z-dj|C+tGb;Y@Mk0aOy_?KfAevE*UvNb$I>gF_ zZJu}%y*~OR1M;oB!5uXwEQxz_;qH0MYXbC2Ogx#ytI@{z8v*^Psn@-62e5tO-gq0M z(Ki!2vu3`iNPxJ-tzJ7g6PJBFZv#t&M)rKhf^8qxR-P>wBu&}9a-}uD?h!l|fqS~& z+{Ha0^*A1{2{Y1;pG=XLL{MiV!d8-0Pf$PWbq(g2^?|k~GxHW`G}q~tTX@gA>)0L# zZ4^2BmfeSo(A%&hq>l5XV@DIxV zIj2(aTgoeiR`y{Ds(=19IL!*Hb}vN%mC2!l4wGH0Z<<=U*9|aJdu%N79ADW*Uvc{N zJoR@>$K^*+<`fLjYO6yohX*z` zWcd|+Iq5a^S-**$lYq;CdAYaF8CP-17sOL#JdOOdGb?t4YJmKu{QGYr9`h zH4~Sk`k;j7R`m!SI8TXCqH6Nq4<TE7F*ym1&95fHU$i4LM#nJaA0H&-U`84z2MA-9>-i{*4CGu1xCYi zYNeqhYoVh0Q3$kRyi4y|GprbmOG-%^Fe09>MEWpjoB!mZ0w5VezwDk+#@jwG)LUU_ z*diy~3ZDQ?$}YwfelF-hx*M5*TheNy#T|PR|nN^Y+6Uy@ye|pY8jP@tT zJ4ZHrg%H0W4dSPg2ZkzLunALbiW|Hw`OL+$1(%yHM&IMRBoTb-)Z@>Dwp(>M`(XCd zgM99#V14+6f-E?{9Fq`oPqmO6&^Fk%i7|&8AS(@*U;M7NRd~z-`9BWyzLd25bhqtB zlSkh-OaIw(|B<8q@gEDBoxC~a|BEg2XRmZ13jEXTU(%2Lm=u1W693~-76WNbf2Jt? z`9a_P`_|nS1DLH7hKK&LtpDYmz^nfJ)u)Hb#}2D&ijGzxO+ z31dzU)Nzz1OE2MHs#xpAF}l8;ZLO%{K0w_bIIBf6RR`1h6xE3D#%VI?yy+jt!txqZY9}gX~Pfuzznff$c(YK(*Eug86 z0t&7TNU}rA0SBlRv}32H%@5Y0%_Uy8C>Iy+oXm%2Ltu(BZ8W)W{;J(Op`~qTOS5>N zjhx^?I1FdF%cp!aYZQ!EgQ!a%JyV$enJ>%(>pTtgaZFUe`j2{Qqb`Ov2BZ}> z&ucAJu}8T9ZPU>`wjuRLp+(J*1yNKkDG zjq&AUxuY5P)>?^lEiMkco)L7+gE2=Y#ETx`>MeIxsv1!Gz=V-x98marLo4ws?!4*+ znnY}YgNSZ%qD;nB4uPiFB%J9?M^THF=2?T|Cea{1)Z^#eCvB)vo9|!QT9_ut50pAD z4hrmEqWfIE)3CrF(mKb6hy=L3<|l!{Lu3K)~gUWT8)z$^wux9l$qA4vUP^WA3il`;r*& zB@Asgow?f7|1$7<*7`kx_C|nJGs(8#3&0M}S3Z(7r&)bW4`O=Fg|fs1LygoxI~PE5 zZ;f!DeiaCE($I@7ItZzj%YL_wIrtSF7y znx;p>%s;o0EL}eQ?)@O;iFv$dsoszG>}rNZ;uXQ3y}#sDS8k{R4Y!_l10ry4t=E}+ zv#@z$E-Y*M46~ZY^e-=+RIZvEn*hI!)ipBeG%0r8m9 z$fkl`=qwG?K>|MOtSNtfu^_;!%F zy(k8nq0`dKF}kHG_#`jh-25i+$=Q4~A51V*1dYxBd z=Vc=%w+5P^tB$P3Vs*Cp(Z$CsCBPs_ELSSue1Fsy`ZOYK^5*oHQ|wbS9Lpu4(H>r4 zhbo^JF%(q-Pf;mLZUIbkIN-WCta`!gdqW=Ja7nArUy@xW%JPT&Xs@5kSS4sC5~R^y zQ=OZ-gTNWBp4qoJQ=*}MqfbOH8LnW(9pBHdo=FQGq-Fr6uOv9j&e66$1W8YOlaZ})qx9=TFA%qd5GU86 zM+ZRk*2s9NgP%~`F&%gtJ5R%&F?vYZ^io4>{&(~FW0W-NLKpRO))3|_I+aB;n<sh2=;Nlv~c;3Bpy z|LHpmegJx@arid-)IJF2$;BTPC zEE_;@#?hnY;EbxjUkF&1CYg++1c_ivr63eZ3PJtGIEQa`ievx{Kt;nOFF+iMxLTs z(|bCto~E^-s>^u~9X*_oULY*bdUcAX8G@$`an_CkWX;sPwrBMmu=qRrs)!+0ch!*H z{&NMwvvt>0P9dLjo{4l4^ZSw+W$jO>&LD~6oL>lCUO98&ZU{&et)y0ba*oRN@oT7? z_#<6ISRfYw{E5$7zaT8BBXcp}^YtLxJzSOn=A>VqCA5?dMp zRg)>jmD3NFqB{p(MQGKV8)szeja-v;OENRw+IOSy^Q66ki4*kbw`*6Mflbc%!6rXh zLiIOy>a`>+`yn+ekbi91zu`!<2}7k7%t<&&LAg*L5q8diW<&=Y6+W$E2*Id`Dc<{p zDDJ!Szsy@51au^23-Bqjf!X#A-g0D((pc=-uG)5Rhep zU_FF<>T|Ep{(IG}T>fej!*eYVif@+PEVcLe60 z1@uO<8eeg{xIEn2iD8NTq)xnKw^ghgb?@= zY*59Z#+t##d2Hy^QXTH8!}DzH;x)`q$GX_Z>O#?%zcw24KLxN1X|UGs z5AD^$_pwGPVLmpI?Mz(GjP;{iT_nm@_hJ=$Zv60DJl4~Am|5VQhrhOn?-bLf;zI?q z=8NrF+YWRs4?A_on>wxZ_^ftQ8JOd6tt;~u!~%kb1!mffGd^80T2kp#4Ry`^PmPJ8dY2kzblP z&Zs!yU-`#(_(p{6`&?tpgRf#Kp84TYFS%25-Xi=~pJ9(c)WxIwDsf7%iQ_zdDC_qW zY%7InO>`LzP050flv9GnixY5+z)!^pd!1p8gGF43IBXhTjAQSp))vn|ly7Ai2;NP{0<|vND%klKh1lJ6zf0;I( zD9l+EvVP>qaO19(jR@T85gXL^p8C7o^&hWv=%=4!#43k~-NDT#4j<^+AdIMgz}oiP zY1!%Eu)qD|eQ7cWP5sSB^tTU`?DIfPgdxkuF7Ehk{9Qw1QozvhA2QXye6d}35|-h( znC#bO_dfAU`aaUG-5S8GFFi7hQ+~GQZ~j=C;bxt<^we!)TY%zd&8O;Ww9~%N93$kj zSGNu<&pO%GyJ~d^T#V*O@6;^jLY6Xz4@VuYIfeW9 zaMhVOi!)5(yZXHwV`jk2$N38?FVKIp)(PPatb#WPm)reuBX z9s~n2`oh&WF+BT|;lFjP3f=obXNoPTi~5BEDdnpRq?=14h_@Ge#4I(50rr>R^LtHZ z`|r*1n|4R%XlqM`^{HE~H-Ox3r*zWr=*vf{Td%9c{;E%TTDz#&U z(v7E0d?%{NfxrM^joZ}9f5+tS2W3IK#@%T$AMF>m!&ES`-!H`41;oR(u-^}1M6Kyr z;6UxdgTmVH`ehCp;<-2{Pa4twwR72Gi8hw|d*Gj$HGynh&l0jGquiUIokOENC zPFR7H7l_QgQ}lC}s__9@ROdQoO#>4Mue1-Xx!5y~L_oRh0hU!2ZvwNIOTK4v0I zol51u0eV!%slYnorv_Gtge}+1#hvrWAu!z&qx|Xz!Hfg?%N6QZHc|686CpXZ;?FsF z*DD1l5Hz&;eP-|$P4O=|Ui)a4^izA8g_f5(%h~)#5}q8 zbff$~W5cUO@1>wc?2PM;f)k?tmF5Ytsa7Y`Zhlxj3X*jtQMZ8qR3aiutfVN)!`@?Z z2(7*a9}-_@^SEb%8Pan{|XGtpV!Pi;ZGxLU8&m7|2@^a`xtjC4hD(>i`NntpV>}g41yic zQg6o!r5H+!q|^l#b$HUUC$RNw8FBM}Y8jUd?r5Y1|Ej?i96Uk92=b^Sv3bI>g0RRXgEfB8A1QIq;BZUi9sT-lla!%n45$x#b zLnYtSQv8q!T3%WK)FH`|)-kasqXCljM!R^VuTAucGv%`D3&I3#X~A)D2RJFasbbN$ zotFhNz=kQeh15AP!`uAp=+cR>Y5U8eKXpoBNa4av2{pBe3#$Bet0kb}O?|YGNOj$7 zWWLZ744gvi(v`|jaRvjA!+J!zxJ6YEK7`D5BM8K>AdeB=v)Ibf zW!)E^S7Lbq>B)`|M7zleNvt(GX6CF%^}lS-9bXxd$_;gq9yl7S<)-_fYKz|<1sq+J zT0kHkew7LGtrpOa_w0G4(>r%0i$m3s#@6%3-TYvh@uczsWd?|nrpMm1O4$2y?xB9= z_9j!1`%bcif>i-3Qvlzr7hjLo4*M!MN970ptiDy67qQ9EsU*f=fV5!!)O|80{*5$O z#dcnLq!RRTbt~9yO>>*D53KGvD}BiDFcEWt$p*K`vy79@e0$Y!%{02G3X&ps3msxceP1G z&P-nuz&Z~~B{nP>FSU1#@DnN9EdJcjBi(C=3|XQUaEc$P#wXW@-K<<6MT&|KfMJUTk%8k@7TZ4y+wvrzwup!FwFi7zl{?SYjq=c_b8#FA3G5N9Zc7;``|By!d8cv z?sBU;sVl%;a?P~vo)iDhh1-Zyr+|o4qQ3a3XFP~ z6Pc;xSLyEp!01Wa-J{k^FjpvxQLkC(kz;CGZ83U~WfNuU8BI@A&r1Lbc9=Y!sr^|| zSP+fgH|jh6Zlqz4RR`zGgiH37GR#VM=-My#l~OEts3|$k2oN`rI~N?uX0CrAWAPV? z(#?<}-H5cG3P3IL#iPx9&_6pG;-|glc03$UlBWl>)cvrV;ZdBe# zO?^OsJY_5QZEj?VRX02}?dnTT^TyrJs~I713g*SpiFdn$K5loYb*TSGtuH2>{@)44_1yYY2}>~rueO@E>s&Qd%%$O^uJ za$mErwvC=VbDEF+dH#*iyl@f9Rr}T(xfP__vvszZn8itL$*pqRd#rz_ND-;Gd1+2x zAa$hsZx&Tv9-osU5LG9`g|n_KtNgs{=IZ+pH1ZQV&G-r85qX1HD=9A?H&K)g=0bfL zcw)FckCqHqOV5iDg^FS}#D$Lf5BOoGl4HSnyJ)g}`uQqTugmUy|4A)xj>BS?6B=FY zHr?rP)D20`+r6Ft4#@sSV+qn@yUTR1xdOHk_K6FIlxb+RNOU`c9Cr#SN+VNs*}(|l`@H%`*?F|}SzBop~$aqVcSG+y#l z*#13MekXBXv$%|uKHbQF*4q${O85Qr3o@#m9*iH8y19=`dr%*#Iix<^P|y+W19>CP zWm%(Wl;K>1tRS0iArEJG3fV1OyjHEW>CLtS8)c^rEH?-bPNaTK`Dbczi6A$Ub21bH z$ONMxGwlVl1rdwg+}s z;c4|1^T0tg*-p0DZx+d;Yo|RowTo_uc>z5I#KBUYFDTTorc@R{xdYbg3*vg;?infA zGbI^KU)*E9{gvMNbT733iRkxz*I!3XZdx#H_G9pSQ63Md!LPK*vtiS+53)8$(hh&l zsaX)_=$-tb5&6>9pHhHxxmL-6@Qt#OV6iyIVeSSq^4ek@J#26oPMp@-2Fk*Q`nWYc z?rl_msQdBGXvG#i1$GX;%%36-b^Abea`Uf=4~?ESE*2V0%Aq8usmCM-BNbO196fjw z^qyt|<8Lm}%2Z9Z{f{+sJ|tsxmm@3#Wr-a{afdGG&cBJZsrNBGioLf+?<32K$0;ck zbTRja9!I)<>2)C*CpYx9IYO!D39mw|nmJTk!K`2E@3M++PbsrC+PlK>KO8l&X-Nf`hv_NKd)JewwX@+V!J;jcpzLFzJG$sgh&Z2<|Pn< z9cn~Q6ZGL@j7Bo<#cbeM3s4*hZK)AaVLBA)HkRI6#6G5k6DGm)*h>Wsz z3kXd_%I1vhV2KWz& zWU2rs!L`xh@BK?0;(dhax>$;LQ-BIAH1~ZAIX-R8TlPo}o;~Pglfp)mAHh@Yl{K5b zEWG3GSE8zxz!8x-5CyLFe>UUCbm(81*RCDSFCODyzKpTW_7yXetntIcLHX@74FTN@ z{?@U~on+o`*ivEWb&R;cU4>o7b>S4H!)XpQRw=&xhOq*tx5%W4RO?n=1P@SABA!}! z8dqA-`xt}LDWzrtHV>-;VJrsuc?D?VBQuL1QuWS$SzDXEW-^7d;90`Vf zo(ORBa4mSp4AjWV)}gkues!blWYu9*Bh z%;{Axi4iL4J*UOXa||cZJWOo2eo-@{pDtEH3}AFMGUWn}GP&=xgxWf7(b}J#pnh+9 zol8<9o$xy;IF1o+50AnG+>~PW^wEtT;GqRtU1Js3{r(p4*mmHjr9;+m_1c~w{G7Mg zffFAtaOu-&$9UQHZ6`AQ8MryOu(bq)mR1^z0;e^&uy7%~qIUb#QpSU|F=4nVn6b{}1fk!bh?V@^8Xg4?;TudiDEIP!;{tPWBJfPh%yrAG?wYh0ifCjEuIKZ4q zJQj)j)t|pn`A}6p!iB}m?rU?Z)XQ?-m!^LPzwZ8qDfc{ddyv~gha>bvK^BJ*8ePM2 zaH}aO=oEevYbv%jZSK1;D2UQnG@|kgb*U+1(q2_?6c;x78V6R)O34DKQeDHa9E!9BJg_ zVJ{oy04T}Kz-lb-EgoiE$1kPt1Aq-zEZY;L$Sog1Q1k z?L%|=0+v}CD?v<yFpm~KEWBc(BXUZz|)P)Uh9d{-i0G@^s4%S>WbQWun*Z&2r4;XTB5ova{m)E%RNDV^w;F=1?lD+w!|g)bu2Y<=XTD^l;(s3qBJ zo}FNJTh=^0+bv$M5o>`%RR>jWt6}MMJ8_GLEBY>Q)*$RCdK$P22;B(hVU&&`2K%Pv zC0JFel2o*5ZGLgfTg35_AKF z^VrL)P>sMXT&!(#@;9X?zcN>J7{GM2Mz6BEln14!y)MV&_34)LE?ouA9A}#pa23dV z0CLVNY4<HoI4%+PS7&`{c-=N^|IgI@8(^GjASrzH7;D2KL2)|EzlX$ETdv_ua2;S zUat2!DzjJ*m#4xg<(8)yzgv8}QD}5oBNb+xc5{pHL@30NfsUe;`J&8$kip#U6Wy5?~=W7uC`@&Yd9Y?{ZE#_4g<0`i7fYBt3Uf6jX77 z6vNR?_K;ouJxFdDuOg_j_>sq6f17byF?+8<1mgwZm>Tnb=~7iIPrEVTu5mE2`c{|d z)+a>*3-}2*srQ@)tHI?av&kPC;Y~H6p&6u7m=CG;LXqu7?}A%65d<8u4S%j={WtS< zr)+0xOK>CN}Uv zge)YvDiD#~0rgCly`Ale0e8jz>RUIEQz>te zZaSZ%!$lqRglK*-r}vy{05yd@QS1WS>uyYU{dUbhtSYj=@qb<@wLccBzEtdkkme_; z_qqu1@Y&4~KE(4qn}{mMbmZ}Q@_bH#L6Z+7?cj|bWV%*3N~K$=eM7Ae%)P6q(VzRZ znDI8~OF}d&fwP&RG<1brYnoL$^UXPhtrI0~hvQ0;J^XF(_=G3)is~TO{DuVfxxb4Z zmdHSsr=_{Oam%@9x6L3cgD~kE2SLYJdr@21Jj8VT=UfHyv-D7|#)@a}Z~!MRcF^2(fBjyN+XVyVC>) zMi!+*hTEJr{5}7@c6s@rEBudkhkbO<3cAyc1V)A>iYhU49FOM)rwt{D3ufjwE9IKj zSEH#Ln=MP!Uz+kFTHQ)WNH-Ci*5CGZ|#E>zAQ$BIQDzIm=*y5=D z2`A+Kn_>R$cL|jiuDvAX2y{tBThc~$nHn5oIbLCUJ*JoQDiW6K(2X=+skHbl>EYKe z53-E_V49=;TE#CH@jx}el@uXtOF3e-KaohTOrM$bS8?Jd)T$sW{_vW)JvqbL!3RrD6n+s3fk;;(U49hG_nG3^umBK;qnQ9 z7~rs@yI$LLGuFP{NKnseC>49+P37&snEjEUNfQ_XnK<)UJBm^3aV8*ajk^-Kydh6= zra94{lV-1#T^-nM`uCY-@EuH<1J|w5Ym8Rfl?&?<*CenH)tIOe@H1Kv1SAu-xK667u(!r5Z#&eREL2a9`_X%>3J0IbH)=)v5#HY}M$>7T+ zJb{5D=l5h!Z)Phyw){C;xwwrE!UrNrKA_Suo^=*YW2x#mMu^KzZP85; zJ~THJBxNJ40OES^V{l4x*S%dlMP>%fLc`r!k1>Fo^B^_qs1PDS5EcR>&zO_boA%6r zZxzaS7O(34ox}*Pr1Omw*k8WqT>Ujb1>6y<_aPn3#UWsW0N~YwLok92Z5IeSYF$$x z=qZKQK)iJTWrFOxQ*c3@hnUoPhL4RZa51hOs4*nC)YMHCxQo->ITv~2?j#Y&TV}o) zG0qljc5+oGY>C)6e=Xinj`-`{zcnR4Yh}1yr`r8vgGl9j6jNh)1UqJv;&S7NDHh{-i8eO{jR$ zG;z6qJc(qeLnm@4Tza$>Xca{d2qFFi>3wU8(jhqvbU43JopQE^bY**Keb>GCU!lp2 zT?fwCl^174)_`CIp$hOxOo2gfCYM!HhHD?&42Q$d)QE9{F>Fv`VRL=mt_NZ~F)Chq zcvRqdaF~ul*U@uS_@^m{ykLlHg|ay(fR&hLoKDjNzo9c9S{HdF+U^)fxm3tmD636CAASf3R6-makvI^1C_5Z1(HdSHRAg= z*_$Y&+eRY1ZT0qaBhWtXTYzzea6GzIvsAC1HMuH1sAzdLY(7KMbc8MJd$#58tz*Lb zjMc-;d0hqZ0#jA(jp`Kw;ay6fw%)G7OQ~Xi2;d@`UG>R7toHq$*1b8oL-zW&U${R%V~>S>w3%Ks2Wp97s{ zpGjq&`8jHU_e3|W=*i^iXBR{5_elX9Ewd~!sk|YDS+1;f;#Da}l@#KckLT+!%9oU^ z#8>1;1u&UI38KAb*#*5Huro@~VA)^(&gNKL@|G2;XTVut@5CficY1lfE}aB*Rf2iv z1yjLu7MRLS`#HCWw<<~Ixr6=;wD(lKvuhuWfbjRNAk>%)m;2Z#!{PA&dG^qn=)j%- z`(W22&Zk0h+OF06dmA!YM%4o|39qm`a4H9HlCe=Pk?wfHC;@| z)>RNXx~i*|(3@iSPANwt%AAxr-Kw5oY2D9G)d#zpFu8>rOs*+L7^BmVKK`N?#eVQQECvkR(MnzG7B!CT-QT0w`xnSZ>< zx(%(}E_;BM$FU!(a{uM~B-nr}&`K(Ucnqb05~pD`#=auOiKAb`9N4O9ZSv^WjsC?8 z>d#homU#K@cdy;msuqa%Z$K;zsQTq5&%l#x|BKfB54LqP>HTlvBUuOtYp7CMMde=s z2Y=j|#|_4-Uh(x=I9iZ%X6w3l$gXat^A;rp^xRNdE&NFdeu7Crbm^4ys!aa&QUSxA zTOH74b`}QK0z6{HP}-MFpM8y-5?jNP0Br8Y>U-mTdL?>vb-i4}6?iUNr+uN8)qR9% zPvUQ5zjyn)4@gLrxwkWGW!VReSTBk(;F&+psjPSIlp3Br1iLQSjVoWxS0+|`8+-Bb zg2w%oJyah|tMmR|b;sl#xkp&TJ}&Hu^Yn;G=hr5FGe5Re{J1H1augHZEe{xK6RYHT zRl+Ovi10JnuF0H+>q=88&g+c+-|W}r=IVE`d{}V&h57!>J!0>rgoASPqHPYDt?eyt z%k_VH@9;d~*VtMZ$YKd)oIa74b{@Zw`hJ;Z^O5Z0Y{R|AzJ>d<{~ohF|8>FVz3YPa zu9$S_u*~w@vkQ`af%|X|WlO&{y7!WIhW*O>8`*Al?<8EvD=;ng@%nyyb?%vC&u7$$F9`yCQ$O9@Y0 zonZr(Shr%IZ9gkn<})of`}Ugl*z4QUOLKNjI&)ZN`{`MA#cI}ag1_I2KEFh`K_|xE z=s4-_-)DYhG57v{Td`OD@S2rxFI$?;J^4Jb|8DBt70);}osOG(aCyRh$G)=!)1bqG z?gJ|(UyuF%+9*GyIEyd#+q$*0LvpTozI60YGdli$SJ{=%r?TJdswZk(Bpg_XRg}k? zzp6C-zV7&nwR1yq)KuoGSMxQmkxyBdz&_W0rMa@symgP;f)}9ND}pUPibE2130-NH zE1&SQ`OMnAYbVFX-`-rD1Kbs;Uafa{jeMH#k-2Yv?GPuT&M@QlG5cwI=2zl1m&Yg9 z^;h%WotN49JaEqWly5W6+)BLP^3vkjhUcfO2V4>Z1gh?~4B zJ?m0M$aB-n-)3H!eKd)X3BdCdxO%i4?Jj?lycun{>d3bfei}I@qR-7ltA9;dUX(B2 zjJj(It<(c^XLvF#_F8s*U8dHzd0n>I&+P(o%v5GCewe=s2FwcwFq>;V+&-a6 zwX43#+J8K0k{0}_Dsay0MHa_W?&)8HAB%`BPQYTtt_guEm&K17s{O4ybIs*z$(-*c zGR2qj4W!XpfmpbgH4J1sKLdk%Nk@9MQI*-8|2Y=NJ!?B6P_7ZhW_58~f|<(U^uv~6 z_8P^SD{ZE)Tly|LJ>ON6!o^>jMXLg#j z8*+h)UW|jsB!F!NvC~It>@_A`{@cPPf4ro?I1EcrqdM-5kOHIq?tA*@#8AdHu%)lz eA~wUV@jt(EaA8PW1~V%I5O})!xvXMLY40%{|wcV+{!T_(28>gA@Y+0Rij1tmG#I1hhj01eA~H&)`ow zwcP6v5HQLuBqTn*myn?T=xAqVVQq?lAR7`FkEW{fnY8x^v=i}4Oz;=qJ3+*3D1uzJ ze?&A2zTAuFh+Tnw8Ax=Y!RYzOf^RdIH4#WKX+sI6Q1_8J(ci8av;(Ejda@6fUTPD(j0;F}C$Tg+z`Wh8`bCE1kt;SXY7eN5=u82ny{ z9gpZul^!hE9oo2Q=|3thL%);yI?U^P;XiJYyty!`z|R)0O0ZaIxiK>2w7PimAb-+k z{QYB==REq|X2`un^k=i(`5)@2a-VVQ_}$}gQg-ewHs9ZOnkTYeh9;U~4+wp{wLV?V z_#C-)$C)i+5nlfJRSCxTTc>W3UsZ$nLnZX@F|MLZ2TWywRqlr0t5SxeG=&FNvq#$+ z$N?5Qub+RPCI_6x9dbzBCxA~##_zfHezrPC6*s`@SKnG-k(bs*akHT(Y@$yH=R9_p zW0;cM)P6Gs{e!ey{%vm;v%4U)YXV`cW9 z&R{hLg24JdthS0i^E{E*a~BOcSnSnXB(;nHFPWY`#kyygZ6x)`RJaIV-w_8tV@4o5 z7Q?{xdr|(%8pR_6!5XbeOkf5F+qZL>m>)5z?Xx|e4kBM0#V8h~zX&_Jo*&0CqJkLi zH~+V|gr5ScX^{I~R0eKGGp{3~zN7ib{SuR23`rKLB!KrF>PHS$Y_)eaqkvJ8ZCYon z-LI7552NVkuWpgD3^+WhQ^o5?@;s;sc^6D>YVXrDS(uE&F*FZnjD zh+Gp2MOk z;`NHeuN81NLZl^$jEFhD*MHZPE`FoOAVLG7`!3t~T4o#{KRs5FiH_opF8xJ}NDN_L zt_k3jv+`SWgjevqoVTpE%&(6x7!PBK%2QnGcbVjfASw|N{Tf{an zpJ~NYTT$=PG>P-d*Q#D-@7v5O3w%xam6AX%Z`-01Fi+B;*Wln$*c|6o?iK3w>mKjM z>a-JsA5{XC3N=!^v;#3f9s^nRrCQXkl&K1zGR`M}3L0TWsC4LyZpm(>ZsX9@P-8g^ zxmr0qxkNcaxvkjSSmpk}{udi28?+k){lI?xO^e~PpS`JdE_x5mO=lv7`9<|b_G+hU zq^gZ-ko<8~uxgB|TRv}rh?+!EVj-*Yz{j~f*UvVpy2=ZmQ%lmyyu}~BKPxsY#LKLZ zUi0lyjBrq7RTNeHwMjW7pOmH5uXU&uqD8N@RU=(p04s%g9pE2e!T=U>+&EgCCE?Q_ z$R@@{PoUqoRd<|s6}Cxt0{1qzdACKT=yu00RxjkvVdp*PH5WuXWm9DnJ|<%98Dz&V zT*;h?y|}qK!@1|JXH595vyHmg`#B4_JdG4MT)95*l=4FCzViG^ex10_(_oB|3`;y! zU{>!jqu9dS)EGJ9d6NwKnU@SrywZNFjq-V2llybCUPddmS$iZZ z1tvrr_L)JOvf9f!$AHiv&Unh`Vj4D?WTR^cUJ5i?v#M&(o!yKmNo0k(rXL^+6)w;= z4Y}I5F6~q7OI==E(qZ3XS766sw>V1)#^}km?gl%YJI^n>PoGr9w5TLaJkJwN9ZHQ! ziQ>lraBKDHy4$b#hLvItUo-fC;?zyn65V@29V8ZjJAeAKb35 zIJrrzrCE(x+Gq@P#X!^o?A+zT#~#rZ(Qorj@tWTnj15aEy&_|I#bS%`tUY`=wOuJu zdQf$iTIV@cg&)4S?Kg~6jXV&c3?BBa=B5Ud`yDZ|&hY(#5hY1ET&%d$}8Y@fJL*=!0Nh=@05YpoTxkva`^Vm8&N zR8I@gcRw<~anpr^YP#ZFhH2%1 zDMlBK-Jfqis?r5^4RjA#gvxe0sTi@`yc5Tjn{Kkc(V;j5Ite9Tn0H}V zR?rS}8raci^#(etZ&`N>V(H^AZ<#BD=l?J?r8dqEet0>tr5xVQu^3ln?)ygwewI+r1cs!BIVTNjN3Y27NU zeZH_`XyrMdy-MA?I&8fWKEGK*ylg94>TdO+7zDrbP!`MvstQ>HyTNg7~Zr_QFn_VWn6SB_=wPVY9o}(_B{)4L{h10Z{4Pv zWk$7{sQeOxfPk28p{nVusi+`mY-ht}Xkuq%%I0ok5689$2*U1y@LL;GXG3at8*5u9 zL3beSe@Y0#@Bcgo&{F@Wh_e-tR#WjKwS=9cDK!rpHyb;x2nIDZwXma!ncyc$>Hn?{ z{{*D{;_PfM2mrXbxv{x%vDrDA12_Z(1OV)u08UO;cnMY~4_jwLcUD^`y8mkA|7}Oo z)XCVVQe|Lw`v>A$B1pCI7RHvkSccEJB> z8(vlT&r`vV7Vf6jnvxbarnXM-K14X#x!8sOQ{n&f)&K4Ce^mYaf2(qEuyg;a z`gQE6(60b|&+pi@Zxtmai#3%sG^8e7Y_um`pi^-V(~-K$EWy4McrSMpJ&%47XuYKY z-Yj0t3;q86+vdIP7m>B2#YB&-)JxF~qckojglG8Fi2wifzgVC?`uR7Vz8E2SC%TC$ zl(dB(2+yPc;Y#5^YA`R(TY4w+GO>lqr1E4qkp8t8(m!1v$&p^(13%sY!zNm{8bJJn zUugevZTzY}EW0u8Kk0StEe!~d+^TgU{>xzhlo5-5u5)bk7{K&JKmQEl^k!&N))(cU zuH|Mr`}XHIL_gZVG(#KBO`QA&|BD^}SNGz_L}5e6d-5V`8VNc{$1xVhgyJ;4{Vh~i)ssONsC&WTZ4Zd#}>Zd_{%Q&tb_3{Rb9PnI)usoJf%)0srXdvy#MHR zVn|ygeg+{MTUtWzgkH4c*ZT8h7=-7&wu#NQbs$NJ5D61fpQih_dDXK&N0EOCz)1aZ z{`p6vS$O-G&T6&HYaRRudBOPANx%mRq2nLZb#>j`|MW7!{WE0*MULqkQJ%NM?hHvn zHKe7)C~pLHr6Jq+t=vQAHPd9~EzzAAKT}$XH$|sG{6Bgw+y`pAb~7)vUp{4CdkSXL zmmC!g`P!IkQ?tE)@|(u0O((F;I1t+7Q2J+w!0=neSn`|3tWAG&=y$nNU>jm>uHwvQ zyW}^C86VYwm0gla{>`9HBNnnF|F4bu;iA_DQ+xsWU84^45(J6CE>+7U;S2&TQQnf+ z?)4d?MFT}`YwbQnA?6=K)1SA!?Z{6|`J0^&gq~Gn@ey|HtPrZwt0IIrH(Y(KGyix$ zb*82_&xt&y0bVnX3fr|S8~FE?!a)gTvPD}x8px|R?H||B)h`ay9??jq92m~-(@BBc zPo1b8mJBBABHl1zX3x`^)Q#!SL3S&{|832DQHG!S{RoCW?%pz8sc#OIT6@KzemV>( zYvlz_F;*TZg#7N_>D5ThjQ2RZGSi5L^dm6>`rD788p^Otz`wfN%K$O1vP5!cIkKZ&e4mIL9tH~%^|9MX+xLULOnalR?=&Lz zuJAZj{vuUFHoCZ*cxupNURh=knQZfqoyCgyeIiVx=)8g^)SZeQq}?Oc?0f{?Br#qy zafw{k=RaOHicI9NA`s<(^&x5fNEHHLg~cvcem_`sdPO z@3ei0^)RQ8$HwOQi5XWo@FtnlT<4{}xo-N+_{;dP@mheslIe%!vgY_iC6f1hz1PVz z*o+^Or%%?c>;|%tFSs7V-~a1gq(g(7Z*VX)60?w?IN&%>rI;MGvQoSUD7#1z$z}C1 zb#2YO72NY2N{G+UiFIwc@vIcG@mp8R$4OB7=GEUg@eAKd7X$`rg%;!H4<)oRo)Lm} zdlN(l{%I$K50Y9F#VZ5`xjj}JQArd{j^BHuEs}WpJ6fqxs6-r6<*j@+F8PahGPiv; zeqi^e=`AEp+g?*%f}Kq+dC?0vo64*2p^}>kmQ+<$y(v)1TO7@J=MVY*{riEVlam!c zKl?w&jMw(qxaiNH3;c|aujS<6I7wLP4D$Jrl;rs-Fb4?|dPTb5(EvPPIg7nAJ2QoH zn%iIQu>d|TqR&eeuJ;Oz^0wS~z)f@6TvuH)t|xgXS7kopU944Od38;~7xu5q0e@L( zkbce0RcXD=p>ypo zT=5n(nilUR^(83w~Dtos1#O2M*Td_oM7OM1Jfj44^XjF*yzCt za5zQ!Uoj1}pHrHz_E|)KO>c7PfUH_8<(c{p`;;KbLfo zbk1v^x1h18XEshMG$B}L56)|Wj+OtTx5JAqr!Xu}dv%&dOV_(ub_#kMpT)Vxd-NA6 z`nLcRa$dIj)6XZEj1D(KPIDEEL0WhMHiC8K^YinhT7CbF3trnl;@Mk43^^U?=J#Hw z+?MktS6Eqp9ZPE2hyX^<%&JqnVBDZc)Z;i)r`@Og@nAEf)bRIn#!5Tl1bKe{8rNl) zn`trx%iplh*mA|3m^$6M4-_p_8+$c(``vmJ*#W;V*RThp`n{OkF+L@on-FBN;{_!y z$Q-=*SG)&DIByWMo{}`pe_3E%&ZP0egO1v7^^tX8cW!B3WyY+tkl&AQKVHE1Ecgs4 zvfiWN3xVZ0Wu|NJ_+9sj)r&O^tJvQoy~b5QI+&}Iv9`8mPd3s1d++u%xag|L!*Rb0 z%Yf52pvr;;%J8U#S6>=myC{EJ5s7}ci;&uGQMGkop)xXq6f)KO$YI0IM&nmq&0Vb1 zfDgVse-}Z@BR4}@1mE8IpOXu_<2r2)zN@ocz$GEsVKGblyM?_+P=qboTpjcV;Euf? zUIyE@Q1YVFN-P0F8d^SEx0(roke z{)^W}%d{0BCpQcJtPY77(y#_Nw|S!7Nt%4Tt_o-6W$|mP`wo`?Ad!8(^isG8%NZ%-R5y_WU9Sde&&c@Br z6?wW*7dG}Tv-_pi(9;^6^a)m_BZZL#NGs{ruAAI@)Zn;%k67NwJpFfueLD3&$ z=0bXMb(;>tvpeMqh*G1uW^B^NU6Wf%E3EdJ4_K=1=H||lu@|bJ8|s4tc7^KbSOiJ) zbtlx`+@M!N?w-Bho2IdvVK?Ek+N@)BK^K4^t_ZbC))d#gC8K!W)lG&KXmv#CP0PCsO{k4>%zKX`gz|1fJqT=v_t5b#hx`o*p> zJY@UVZm{t2Uex3%>MHT7sPETTe*85Y*8s-^)e`l5f= zCXx{dBJ?V~Bkqx;QxMUrRq}GQZC!Zk2Yt3E%LJ#gCoi?57X~48I!IRkEH1ds7rD+ZsoCe~MGY3}k2!s&uF4HaTWj?AezF}a<)ULA) z^!eq!6`6YNv8j-qolV^Z?sAr;`SBi@8oIyF@+~lsrcfug##59*@L9t7QB-}PLjWuj z9;w@;G7^P}tL<0BF|LGZ{`z`{N-m$*>W}V@kGZwY+o1 zZCXejlzg`e=o0`3HsS&v)ERPw94hAZ%T<> zQ6Wi!SYfYNBqdG084Pw;Td16j7nNlib_T|aw!*E9fj?@+rsaA+YV}cLNvJcPRXd}} zaQi})^xYg57FK}m+|j`;Ai{f=;cp>G>^HiJS*{jV%Ht_=vB$Zka|x;8hSP_GE)={2 z9upHYn#x0|pWGEdqvqhtT_W0!O-99+;FfB&fjy03nv~&7t=$r_0NE_WCdv0BY0|3sW0fn$M>s*C3vHq!%^8$BY{XJ(=LY0>f8J>(G|TV3p<;rGNcyDS2iQ)HcXCt1@xx7S&+wX zAUN`=0Ya*CGFzIxMMU!z1(i=ID;sse@=Wu4mUp~1u=T4IS@6{b-^`m#u;y%K-;k@W zZhZ7xCuX|LB`{9-I~=^DsE44^wDtv&6_LMRe zKVz*zt07BX=$$#JD9C&4fzEJWn$_LKzAdSAVE0d~uj2*A-Bns7w#=_97C-!~uA7X96jhT7ZPFTnFJ}11xsi>lGnwgRTKYZh16ojB##kG94 zprW#ykTc*Uia4yMKe<BnU>H5w6Jb!fT>nAF0;qAxD*d4FGb8tsjT z)27i`t|IYM4_V(2)-xyP;&IEw@{a`;4EpXbO~-kSR0A;F!4DxF0lWi|7FiB!aVieu zX3Qn)k?*g5b&S?I3@*Gwzg$fxWLl}b(%5oIY}%7i&F4qQRPh=-m}GF?oqj$r(Q>!W z)7N#BBvztTQ@p@DSo0-FxxvxYy>bpLmlPQhA=Tn}QSP)g{DZgq_OIdJ{D)YgpZnvE z5XVi#XMQ$Vs%?y@TZj9L#{rf44q#-l3h4MyUOSrpb|FNOYgAtHE*GHCR(vEPJ{0v7 zV8zg=z9kd(bYG|6Nw4G+sni4Xb)#y=SUM17w8>qq646-e#OOSkm~Xh=9_GE?i}2~` zk4fwktj2&|v_8`Y0fR`ma(}H&CvccdCiAcAq3bBTTs${0hMFnDx^kI8dK1I&j8$($ zg#zU9eZ2kEVQMOfthfRcRzsm;HlD;sRb#>KpOJMzPXHcy`84arIT zWa(2(xg+TS2}j7toQrk70v@kt6LDlHJmWO!whz4)7WNPc)SG;j3P1f*9<*nn*M$sZ zT=gCqp03f2m3tC$D}Dj+YRuf8y|%`FLe{(KG~l)ve|7~q7OaG}ew#w8)~oObD9*$t z_9(*1lP0bb5z>^3futv!{xjBh3URgec2tF}AwL}>QY~Wm4oIkc9KLTQ%;i_)cUy2G zX(uGPZn~H@+}>gmCd+|H*Z@}5!>$Wh`BAsG&r7mgymtEH%+9lDGjY?fdb_$Z5?&Z7=nTDLs(pVMaat zU=l+ysYY_kuP&71StF`9I<4;@-&oCi0&dGm^b*gd;vu7v5d7y?g%5>qN&94)xY`fP zcw_i1*0vbcm$>jlS*-7f56iALN*?&RAZjZSJqWu>|H4=l3BJJ5sqj&gpg&~HhzX-UragceNI%dve&+&`3bv} zV$o@Mk*??PvhIr1(niL|c>w8k3AE;>Z45b?<6;(6QT?EzS+g%A?70nm@zkpnPwnk~ z=`*?&1z7tY<3FlXjj$+7*g)BzcJKLZjh|cmtbc zIW#JFD%bQ;oTQ;Vnb!uRh2elk@=(fUohDHt2zz!Y=SS(M9E@}DRpV*eU)hdjVd`iQ zM&d8!ZI`{F>y;e0<4xwWENCl0>ZVe_qoXNNDl+(tM@U0rJk4u}#^Zs!`EJ9=s=MVj zfO@Wet9u9Z%4p_c#Av;DqQb0`*ZQ*%L28Zu$*`>G*U|VWgPooT%_=h>Z?N9wP1kSY zdCi2nS3>z1S}9RGqmwmTsTLPw21e#ErfTr)gY{wB^nvb#XVBiA_ij>W;(=ma9 z))0CU_rAk%RCo%x4n8|{D{2bxEJBTm=e$tX_o0EOo8%Z)s43CrN*KXcpC(9iyxu3m zv0W?s+gdWVA&WqTSxddWqK|e@`HBORGT<-*XZm|M_sF`ks1KIPv>K9-kZ=&M9baq# zCDe52Xsno>Xq-t8^vRAes? zj<6L_?R>)%>QSRXdVhDX!BMTtRUIGqgt;Ltu#zsSC4}~KkyxJ}#kOH1Uif4&_|g)S zo7;ANrja4FNmaE>ZvoaJ!ZjfngKSgU=Y4xD)*VV%;Z~N`@OOf13l(t;R;2&B%zcra zG`NU5CRArTQgeYp58>K{pBaJ4{L3+LGB(vN3D+ z6t30et$-mt%rsTG*(%L}g>%AI_X;2y+CQN`#u?cO9C~2M6^YfG2fQ_N{)|^I=Wt?M zBA1*?t)HjzSQB4@F9-{d<|ElX07A42+M<1b@-aOr5ZuXHX$l27*Q5=Oh5^c~7Oef! z^4i}`b*D@~Ub+!wnJu?sUJn6Ucxop>Fb$-;+!c6ICf4xQVuW6YPEEbDUk*fg07s`` z1g=Mm5rJ4_v@9&q6B5TwfO2-cBjZft)5b}{c2dZ-7e0gc`SW>pL-~M#Mom*P68YRHjIHqWBR6 zrvQu9u4=6IvRHD6&T0IHlKHZ{A8rvB$>i)B8So^W9Z(JJrRcO; z{q4_}rNW~;WRhjCcGe*w^?|U2rMki@XrB~l+p%|5(y{%RS`sLs9o_-WY6>3ko-B7E z{KSjo@MA>kZ6=vZ&(f_%4-hP*NvUhsjMkad61I2O91*v7*dC-*+RlpH)L_Ne15b#h z*MiwKK^6no{iwA9bxjb$g6n*$sjnB$krY7~H%e$PS!(XcsA>e@+uiEdlGsnfF}x(< zrTa0L(6j}OiOc3`9$s^6mK5doxU`qj{9Awz{lN7W;Z*Z5XB zV6n`Wrr!Bb)@VE*B5Vd$v2A5MXB=yXxIUqSs-jxAl4=~WYCeK(+zE0eo_b{6NY<|T zHRg&}aW#3K>^T{$m;qG&4F{M6Csn$={D>MhM);*!gYEdqFB7Z0se^Hbi${TgrG3%6d| zwvh{{q`eI4N_^@hP?6~;ko1x1E#%-oUP#A#O4;HYPAFJ-6~)_vh1US z;q0)Uu7-|{@_X33wXM&_EXkvA^Am^h1f{)0p7ju8h^SVvKo9#agE4;DPrhk91yOLe z-1ZD!>+(Ao{{)=%OX$n(;43e432P)rx0aBy&##wJonKFyii0O&)= zd90?-?<_G@^7tLx-T94-jG|*>zm0p#X7H~WQ~V7=ArkrhWJoZ)s~tGC*8$ohmhv_@ zMjT(dPUUdF=#011WhA^s6XB+`I#iGjWC@F41%xG+jN(2GoDuyJ&7@4L+OPv#ag_dm z9+(An%cjb%n=D3|J9XevkOt~yrT5-iQT7%T>qz#hN~+fH9*A{s`kQ+BmpJ3KrU;gA z9<&EXeP}x2*hu0N>B;qo;eA|Og&*WwWkt7SBz?~3A2E2AW?oM36<3g4=h(E6#_KX^ z1}A@W2Pxt3uxP>Myv7yJzvk4t57*@Po44=2-4s95&`LL`&g-~8;0gM3XAT=JDOZaP z<8FHK6A4fedem6?SY3QB>h<>d$xt%gjV7n`k|XoD>A(Y?hJJ(@YqIe`&rp0iZ`Nu{ z!B);J(x#(B>L}C0r+W`C{bue$Aod`6&>>&zw-Hxz8G-?>1qS!IiBdC1Q|5=T-f+}s zx`A(syaTL~(>nGZY`<3-XVj4D*9!LS9d#W_xnJD!`H28FXZJ&NJaY4o;%rXt19R#h zf1nh-eZzw7Z(9)QCL$a>AlM|WT579Ja%LcW_uKS(MD4)-JmG50wyXDA8g|4?hNv2w zgtPcW%XVw;{_)@FYAMh+`%i1sxK8(~I%6 z+2tuLT2u@U4i?+!k8@b>!&5C%ANnazKdp8p0btJG(kh$P|syef+D-M$7X;91sRmpU}WQZA*M&GtkCvAXyiz zFqeyE4jck8Ro!{aV>SEwn<&V904bm4QV>{y&0%SEb#`@Dut$!A8Jo-M7K&Uj?ne$? zsdhNpxI1Rj%szrlU)j1f<`b~(juSpF!Drv88ezBTS51)<2!ZqeM)z}eS#~3O@djm& ze(-2f*LBc$%x==_+J42g)Uo{7Il4Vk`bhQY_57K}^LDd^!K`;`b?0n5-z<4a^t^Nh z1(`0~(XCp;+gs=YR|xU;^`ESTFLkcIUqs$Ld$8-xBD#=TlBS)>LVY|xcBxboYxjUT zv4U{W(#pQ-ow9*6&?WAeZIKxcC9b45SX5kV(yn)dG}x_24JKRXHZJm_wz8tEOUksP z*X2ZUt^~hPM(E5XYcyW5vNZh)XaY(T;Ug~SLG)X_QBgbzkJYN7m6<5IE>C-9t(kf) zo~YlPbX{6q4`82&4&g{YgZT)DLJ)=UgygR@uk7**{6B2}w1E*}k0OjI8bB8hXZ#ft zdwP~)XCD+`U6-ES@9%76DDF{xM1~zfiz=`gZr9w1p_x=A#hHNvQwE!;i30UaRXW7s9?rU+8XwKY_Ob<2ZXbbIp$s5)ie7mxuaE`i* zn%c?{tvdmxt7`<&qdUsf_0)6H@$u?|KHoGm2fjT%jNfvdzpGg!`(Lf41r~1P`!zUi(em<6!$_AzJ`*0gFoSf#`bjI_bk-Vmy@Rkzucl(n^sSTsw&(hy zyzrBbAk}5rd401jROXV?f^j%JV>?lOmi0&qKijrqca5p-g^Uk#4hi}1bXwG%GC8M* z7<_X#F9wrwEDB(+S=Es(Wp-WOD%?>=|NI%eSvdt(mVnbX`LD$@10Bc4g5$4di`eyf zGg&SV7yWsP)M;orJ3Ik(p_eqLcxVF0Y1kEIi=8ZnmHBWET(iW?)a$B^eX?K_H36qI zvVY-7vdTP7OsMWlnFv!F2p?KgTu;NtGEQ1m=US7J33k|d6xrM1DTEesZ8LchPRa|Z zM(+tRGh_BfQ2`E0XGH!+MX$dRAwZZW7Z z`I3y9LA~jH@{Da&o?-)+hzbtFw&w7j{q?coc2i~8ZR9?48EGUu;YYlJv%I&LO(?Cy zkAxv}b#$L70GnGAF?)6kUKoNiEDx$HtaqnQKKILv4+?u-n_v5U2< zC>RrI$DvkVr!NN8ugtB9_k&U76vWDuThuR-O0;;MQaK2j)vHVS2q$@Tliu}aluf-o z@RoDJ{`)G!^^XRw`g}>{AH*g|6^e^sz#P^$H$;L>ou$o9yg3~`%MZTaIIv+q@biTL znxw*BQOf-h-|}lb=eC-D0Y4`cFH$eTc%fW30@Y>xkS-EI?!hW$fwJ&9OQ*pxXN-I9 zAH=J6C@GEQw#fJ++UU}{%BGBoML?Ssv21#dY#J3%Bar@Jn~9>k-7fLVgEG_0d5l__@R6ev{bM2@A>KLVF z>vejva{XP~+=lu=tVUlSR{mk>vu!kS)9>V&8JRk+kqb#L^OM}x7J~8lweUD4= z?{oZbBfvF6$JwZ4$%zrbG7FIXX3gNv(QkN*t<^0+9|&rH81p>Qm)C9Kb?hXo^2T*rJO|auj^@SQ3^Nm!PMZ<> z6>H^2P?prtG=_ZMriJwb-mNc4Cl1qwBC;rvl)%ugF3IfNTv|TpRuSpfNxEd3f9cf^ zGfYfY7QLgh^G|St2kV`VB%Kp8g5YP?R~+IwV{wX$=cTTBL$RqR_1pmXkqT=HHghq}TeP20|MQ9om zz^QLEE!%rJ9_&DSI|ltpzguKuSk+x(b<1GPke=;$_y~gE;Glx-l*2RrD$IXaT)!nW z#03U@edVE#UkvLgLM(gIoQ;jSDhk$EkE+Rh^ed(rKeQm(Jd>ygjAqcOOd`S_4lF=b zmhdyPJdc$key-#nl)2DladrDs#%Tz_u{t4hr5zT`164Jdj9i0C=Pski$4ehK-&7g(}i)~`+BK-`gFV&C2BNV zX)3FrP`%6jWfUP*(51r{5gC_)g5sl)^FRH$j9(`1OqDs#bn$28h`s5OFhQ5y48>$# zDT_=^2rMs_jdu92d38Y|wu?4U%uZkW_nTwJ_dug(VgmB$7r2}d=X z52Ce{R$I4KHn^jmd7t?5aHwk^*|p+i zH*#7AEfeW6LEk&%4<_bYa3=7)I@C4rf^h!+#3#^>*86=k_> zvE^$+mKnc0Srfft(F;K)5lg*}+@5ZZEP>>$GrqPJ`g-a@n&Ft;B21A?G}2?a!(8mB z>%6;2=zPyJL$UKV40gaKo_9N(mu%uaVCp>= zMa`GXCV2T)xV0J2j2?4o&37#npx-GFrJ{NL`=yE7p)YH?SIEA+%v$83%URONPuYdQ zEB$MJcKs-<6pFQW)1|d0Iv0llUtaVJj&B5x^St{aERhf? z_3vSV6Es^U`1m+^eH9U6L$DgW4P#Eht)naT&WKLIfzKPF>uK};vlBk;Ne_%)KvP58 zDs?DI2xe5>fOMa**xH1Z({EfL(F@UuPp7iLP{rihReL$Mezk%yl!jLRhOKM{!_Hj_ z+4!(3y%_a;efo|ggJI|z@ixyEk*|Ib_x|T5ypUcMT;+;atJ*x`s4}U>Leqv15R>&l zHL77A&;IJYn*H$D+cM;Mk8yAzGfFXZ{y-Xn3u zLB=~Ez|@(q)5M`QS)}DIY&%duhvp#uXz|OYD~Y#KX=V9cgN(o?1)+91mED8YM8J*t zYF~R+M~eYED^XbChAzdPCJLyXdcLrqqZ+5XvG<5Se16;V%dFsH?+J&ZsnJIDNO{#t zPJN|~!BwTPcD%uD$_D?>&m^68tyj?!) zoH7&Zo$9@z+~(PM@KWfUjw^CtrzgNuTOHLq+`Bw`FXOShtZp5DC!TxX^h-;Jj@xmO zDBI*I{$eK18KdEQ+*r0Lrm71N5SB8z#_vo!L?`AngwiFZbqvyvwpv`$ag4b#=+2eQ zHVgP=IWhf3z2&$S`RiDe+ajg%sO{vi5ZzI9sAoioWz=Ob;;0 zMW|Y=F$Ur80ugSgkwZsIb%oBi$B=8J_9x2imP7{AMVIjRBBIoAy8tbCkekiqeEn7t zO3!T?t0pYa+3m{_pQk(h0hzkzV}#d`PD8J!K_Kzz)o-yo2mZ=?8qHHzn3*tNIbGWI zMQn*Dv%)+-4j*^Xm)Rei&Hkj|!|FK9m^Zo0P#(hLdO-PQrk(g3*JumV}8B2Ta zonX@*WgCdEwtZU(dlqIHa5X*HX;Y#Dwn@1*uO_~r(r!Sf#`(|||FpPHYUlTZg~fA+ z&6(`Z8*#6kZ_D^pcR?2hf?+4>CySqfe1@#&VTH#y{iP#Mq4mn8WLYg^q5zTbEkNbX z8@ujsR-w@%8!mF(-eY6h+H1@_C6vRxvJx)Mv576Z!V=#=((H#M_0o)^zrkXTN~UtWB1xm{h~cKAsP}n0A8ls6N#o6qxA9I$GCdPv=@S@ZK+jR_gtie zc4eLz=5;<^jXVY=fQ0BVm;z_l4jN=GQ$f9cNidue+nR?*Djd&Cr~n}|En zQpm`aSZM*SJCJGv!o9IkS1wK2!)a)lC4aoG*fJ0GuepZk+u_nVD`lkKdiOzzssrDhMVND3jd zi-Mi&>+9yn5fgE@ZgmF{28K-qSF&P=j?X-E@pG#?Ei;kfW|*#zD)U)E#7@8Qwpgy@Xpy#d`Ud`I^={#e7 zp1I2U>yplTtH#wH*C)xk7(j;MjG@B56CeA1>&)YdCO1pE-xR^q*V?So4iNN>aj~{N zpT9!VS!3}1RT7KkdXDeL6J!DZK>ylLpv5;m3Z0{KQ(yr&nW; zdxCVsfeC1)wB{>buag&AdQM!6kR1$R*dqPm7LSKLgdSGsy&^OSGAR$1{QdLhKDGWF z2gq(?AXr+e|EdXcQ$`PKt#;?@(NQH5=$&3ESfp^6n;Eg68U!tLe9{Y(1y)GJi#=lP zxkgG&6)O}`%TF`)sMdyD8UZUE=pDsLvlPXNbZFCk#p5pB?~e|U9f5f%>xT*2ye}dn z@J@s3?E>hhr?x>r+arpo%7VL-PP8L~lj`4JmR2dbIac?6>uNHteypo?xN#YglyepQ z$&v|{y{Erki_^t*v8H2a0TOa~-(%@MjY6}033k$)4EP?&$rXpCKIAFa8_TZ!7?E{; zvbUhOqcHp;$ZPXCAQm|x(;)`)V2aoxgYK8k|NFlHeu{1o?P)dMv|Ej8sv}S>USsOr zd0~q@n37SFEUz|zej}|Yqw$Ffl19))tyJadw-=V&Jz!jI9XPP`-)Ib;8DBN;%p@se zCqzIn7xvV}`VVv5k6Mm6R+0&?p%)a<6%Xd})loa#FR#KzKW{EuHgkA0F(_T5Dju~~ z`x2)nHJxFMFE*~TP)VZG!I+8$y_i9|4zZu{~KADInUd->=oEg>L6V* zYL`ayW~h!<2->c8wcuN;)=#5*d;9S=>2|`ix}{Ok&q_|pj_`nIT{_v@$bM%AZ4{{e zs%X!N3qL4;!MJCSpq!SIvPR15Qk3dx%jh)eNGe6&@}fk4b2>NkX8!-7>^-BJ{I+jl z1qBt9qVy8Qf{K8MG$BMmL`4BbdXrv5q?eFHq<2Azh%^yV={5Awd+!h+^p=EB6G%w% za^CyDU(PxAj^7<)f60@KooDa8)-G$#HMb;>h{o0qY0mYm<1-se3T|L$s7U(0lbtbZ zbeRSzbUQeVSZ!m)9`E|HJ%z4SygzDP&Hc@4pZ5sZll0BUETj=HHj9!NCKL0{}Fikir?f9dU( zGYzjP>de+(SKq5|gq^}p?|Ic0$?kUdSK33E-tsR}Kb>XC$M2k=FFNIN)J;XahHCi) zF;^?Y<%EeYhNqrA;8XO<*Hs5R*uFAsqlU%CA)2R`*WOqx9(?_b%v8D<9w~c@4fctm zR*qCTIHM%LbyjI;Blc_g>Kmo$#oNTnmyL9qUs)K@@7vSNz6#{R-#3yXz>#XCMDbcO zWN?+{OWR3&!zG)v#d(#rYSj$Fope&kcAOmg0=P?6xwMHw6f`t0G$b zupOXQKB0X}_VjgijmXQx!1CMZ{oJ1VjdWpq!`X?KbFZ9DN(A`CL$m%KHxbKtZix`d z&}Fth3D?zm$S(5+AB*d|B<8j5?xwB4qDC9A%~)cKzW#mqm$@?qI{H@af2rd>*n=9u zYzYTEcTj1`%7nvLC1^p#aFt_^u>Iu<0haj14|F^%*ihC>oW@~Jts5QVxtm2DT;Ltg zQYH@2P7$2{1~St={As&oMRBe>9AaXvqHB8O-}_KT>aG&Ky7;$Ne8(LF!7P*RwuuMPu+IpG&j^Pnj|Eml%M<(gQPQB}h4D5|A%`81GQ34?diLtml?G*gm zXnjojbYyPW;F8(K@6{#aiL2s2PaBOzeBSAr(fO8X)BT_~K9StLQTpck8*dE5tM3iX zGMFHE)y8Iep_LfAL-N>`-?oTzYgo^~`LYRocFf)wsKRvB-FHRf-G=vhH+^bQu%cF{ z06T&P+^}(0|^HN#=?{2k))P_Jcj01f3o{ zaywrdO=`YlZrM(r)vHv=-s1Je=lqU*>aVn=>U03^+46^4xPFL9?b1{BK?TUyLlN4WB01s87+6Cr&{MlL zZU^L&oJ%(eWMkvm(MSh5$Sz*O9``<~68-|B^QXpaU_sqK;JF%7mSGXM3g^p|RM#Hy zaY4ORx__9LY`l~BvFX|VJ1(sl*1aa8EnHEB6z~HU_8QyR1Jc$!qKQH)V+^MEhRlF} zWg!9NuYrtiW-094W_tZiuhJp}Bj2r$nI19_5rS!ZPUGHZo^|^QIQHRZ6k;CLAJ0=C zNp2p+VQzi?o)p=6D7-H6qdsKaPiQb}nC)u=BKBN8xWsD9k|R!Fo~i6n^)rE)`|mHB zQC<1Q1@Vy*egN0dd}?a3j<9tNwd76Mw>^F{L)(}8=Fp+_;YwyB*7fC@f$L0o3CG|f zJ$giT?m@2?@G#!AEam33Q(qYW`RBhMUaXA~jDw<%^?naskQh=ddjl~sb`rZaMGnt@ z_ouN%EhUx5GFs{OsO?igYqv~8H^KiDVr_BZVybrKtoE^kHdh^ehFRV@wpqRQ(FC}&`|hD)^+9U*2a>g^87caWJKw-mT0mBf`ts;U&1{n~ zz2VTV7VtRFB%8Avy(R98@20wE=SR4(W3H_9^iZ3PKO4V%{uk@|BWkIukWy^SJCGM2 z7i6wX6?9)V%OoX_GfI{Tt8|Mc2O*vAqrHk0$y=!6Zdeh^ERtWRAw9g0*_0wR8jlH% zYk`XB!J(zzeJy(gNLxkhoCw=~6^$?TAw*;jJ$sI=OOyFl(6X)NRO`g{?D)v;?WPM+ zP?xiRNxZ>B^#TGss1o-XBGis3QH{_t3DpyMUX+3CB@0EzV>hM+BzQO`WC|06G^8B5 z*(Pt2`o4daH<9`&RQW2+a2|7s#3%rd>y+6Z= z_cW=fy`-AamU`c5$LKq^CbJwk8LH~ZDtH408u#T391oOiDP1AFKl%&Yg^qDvOXSaj z4aD%?II)<|yRPfQH4NiLBOP~ccD6|B{%y7I=K6{Gv#TAe{C+sQW+r2~VT&@8q`OVq zV&P&Vr)gL(@;iUw@Mv)PP4UrhZJRI&4?fARVbLR~p|>hN4aXv}m{%E6{{@6NliIjB zmREq^!HePXuyyXEn&A3~%_jD(gD0oQgk+p&Yq&I$C4ym6PA4peO!S`9;Mvv_+NJ}O zsSSX0k&KQZT2;0p(Vu2fl|n%$wX{6AJUIEYVkQMSv6DPr;}wTVA?btcSB?-_myEvL zbm_b_HTCrb7$eq^AMN#%mG{;nPF65J=baOp-+|sp4X`0M^GAKdNJDvZsZCElX-YrO z7GoaM zyyD|Qi{0j~?$&CgpFA|tzgq|EBcnH;jp1QJ!ngv7LeRc2X7_qK@HRoM8e0CEb$I;Y z_vT@Ty^oXQymG|X#~V3!?BQKPKDZ6h4;lj@50i2{(n2()+-zoeNco8G8u+Xwf&uJ&<^?Df2b$0rO{8)QFhDt1z*`YaO>5>X+| zvye+ND|^~-iOMYU!1X+LVQTP;1A(5+y3Ip8b>hBiEpU3Rzpg?oc%`x+s}#Nkou?;w_X8nTwwc~P${c9hPoriyR_rSTIIO8 zv$;I?n$yF`>k`gZJ+>6#A|;8>H`ZQxe8YZ!V?X84C7G!$u;!s4h*tklp#QCq1 zN@A6D=fpQBcB&c5opVCgr^;@<(_*>YWRDco;F@e{K11$0@bNw75$V=zR%1LN&r|cZ z_eu%d$3w4_+;!xF$YRN5TVJD~=-#Q{Hw7imqXRQ|B-_w*(+FqZ&z6mkIiNYHM9iya zdwOh{)#qRxB>dC(I?N=W+jXm~>7?~}?m1g;GI!tmr_zs&4Y7vFvngj|y`Sf_^ZMkBe{s^}c3bT=*SwS$Q{eb^S8V>07 z-$F*oWK&a_vF`WlEyZ?x_v_2D?b2yjLifon6T;!-Ak^7*GdA>n^33X;#J#2v-#wd0TG zQqnvx+!0BTO!q!lASoQ?xJciF^z4j_>hAR7-5|g^21%_$vwps`4z+WyO~N3c4BLaL zb}EFKPI^gSQ*U~4s8|><3*AF|nCW~(?!AEzE<2y%H0nXc?W)}1@6d0O)L>iuU6H41 z_9Uxy!&Gr4AT8f5*R2g1ALin%52Rmtwf-ik>A! zEMALeisCYu8E|t34L&<;Au-hOv9J4SH=s<-nm&QpZVHR3s(`)bKzYySNLdvO6Ox=e zvWcXcJkK?)s&dr1E8d8ZS|RkZlWR}}QCQ`#^8ru;SGF8WsIq3AqgaX%wFE*%A?s0h zpzx*|b%~_mZ-;xLMGN7T*+amsjblBUG-jHpjM2WISVIOUI8i#3mez|v>Xfigxd+oc zl+1%AmReA()3uEp2ra)Xz2bSJ&>4(j|7}+}Hd#IPY3$ ztIjsaL;7-l+UOFaUU%kC321e4h`%gy@ldYZfl+dO=|<=APjZ;cC!3< z$>|s+>Mc%E7{qwqjsq{fX}ZYSF$;$6E#~b?SaR6h1eoOk3+pR|zR4D?4X-`wCKGZo zP2uGptq&a}u)P!SXXi$q+b0Dd2xuC>wx+5Wr$i(GQw?KAuT!y}{Mbc^$wfm;ZJApezV#=bnwR^zf&i?$(`vwCxmj1)Vq)_WXN z0+)o|hwtlUm!caXmQKDE7kv0l+yU-%nZXK=w7ivh^9+e6XaPbKSB;Q=?CNvGCc?n$ zd55Xc0ogPV`vaS0=$WiNTBvs^{m5P@rYFJ(#{M|)%UA-UOR>oAUejmWWTQ_%E`%Dx zee^3gXC>J{B1qS;(rM_4sDA`b>RGwn5?C?z^7^HrWt9Q5Bw&gB*R! z@(of>vPnYtC~^-h+1pjp`5xNk##T*T&e#iFIL~%l`(~9>Z*(c;qhMu?&Gx=xS+R}& zg>Q1_+v3@7y$=ZWwzCT@@32DDikK(7o{dU2JA6p6$jI-WmAZG$+(5D3i8=l!mHp?u z^)o|O#Gy-y>LXj!zT`c7xOh6Rb|1lY24%3OFO*HYTLc-jy2@rN^KG9&Ij#O&DAYXi z(%PVF`Fst^-*oMoColt$Qj2I2&5$gS`;y%7cFuTiyb@TOH!lzOaS|bR!NAriZp)X* zUMVg?`l$jFF}iP39rsO+O-?-imfa&O3ab+74ejgZr5Xi-4F3UB7jam_tfSO{V3kt) zqmYOyL%u##th#bJ3GmDrV?3k>cGAEIC&lGmwdG9e0)J1@>=udLkPR(f}u znbTVANUp)mYW7R7<~=gy{?eC>g3$AYU%0C7(s(W`eA=DVyC;TbfceR`$@+e^*jkob zA+4HKlimeS&|ur3D$i8U*?i-~ph_TA#Dj1*-{1xt?uJb_5GBx^F7FtgKLxE6sl}_U zkKN{TM;J$I(Y;Si0R7~?8H=?`mv~PIJ5?pwOQKv6wWem$B4Xb#ep`&AH7gvf5@npI z?iOy>z^!KS(jP{u$=qW*&1mWTa`;gVQ*5V;j{@N#x|=>hHU33>(0_;~hI2 zxy%CjYt8l50^C)Q?t*v1x~1^z6(M2?Ptx>eht?V|9@YRVM?545|ld@(5v{LWZpdL9?gFt6TCXzuK;S=Wm&zNr z65;)^3}xrmt6p9Ntku>7wI&jfds37S@dtx1XH`gi)uC&`C2%CRV@$nscjfEBh~ud6 z;4?VOgOZhG^Lq=kb49J9_ZFz0|>0>y@}6t$s}bQKe?~=-_To;%sli7Yr?8xsKQC#DcRmG zu%=T^q?v|j)MTUka?N!_@dcjHA*MJ9%oq93P$vVGZ)7g~3()n-(8FtD6U6lUx46s8 zCAeja&T476i${e=c~E7#52hP3J#{m$apBEj2f97Kj8~Z*4(e$`&Hm+J3P38q!FlD` zSAD=2S!K28z@d-x7XHJw0iz#-T=4eM72cMiOxk2K+tvT);kjdWrP_C%X6RIY8fDH|$1pPc^+2zNaX^ zyI`Mu=zbtm`r2Jz8jhdb;Zl^gcdkh}T=q>Y=HBRii5N!Lx>N1(?p~8czu`-h*>~dcLQev`|q& z42T^z^)GNlt9c`)Q?Bv* z}S`Qm6!Nif9Ke-w+JUDvHX?ed;->6 zNJMst{hAl|oxdt#aoZ))y*ntX^+4ppGb`&Q17w$s_g>jwg2=ddg>e-!W&-4`&mPcn z@C6XDSvq{Y{X^}mk~>>WuI-|STYR}rVdJO8kUjzK_hY}*&gRb~I2P2EKLi-QIgSn^ zKB`2S%r@!D9q(*G)&kkyB42J5S3ExU;*Ad)h>zGQaTEJf9B-Xn74cK zSLthRK3IF)j%8W^b@#_#&rE%`-evpqE@;g9V2x4)i@pL2vwke?+W&00DX>!lbNaQe zyj$p9-;SLdBCw>M3r@%nn4i8vIzn7M>OBf3K=a;$RZg$6{DZims{L?L*YMo2#9hrr zhGesMRwjs+3iS1VrFvz?9kF(TW*#BG0N0di53Kg` z|5QxNf+&jU`UOpBRS<{N0~``Vmbl_|t^mG}Q|YpBMX?&sMLF0bOv({_?%JOjbJU{y z2kQ7C?*8r_=v6r@asc=~Hg%Z|;?-fcT!&}At^1S0mnlwkC>tsTPda#8QoSWuc9}Dt zK8>Gu)s+NYu=;ebc3(?UeI0%yf307!^QYH94r^-V`#AAC%45oK`jxF%D^p4iz~DU^(9p64%j;e>^@$cQ@@p4{Vhy45eTl^I#5B!~ z0eG=kB-L7$wT)ruv_VZ29}74g=mIr)v*g1x(n79@Qc0BqPMG=cawz)L^>12i%$SVW z02LM@e7ys{(mj}>fs-~qqgH9H4Oa6FWmDsg>|ul=wWf2Nz0#t{Mm~1yEPVz4-|YwW zd;Ty;oBxRbMH|dT5N2bE&lZjG^CSuDL$&5pRDSWP-HegMV29og-ASGdl?7K|>W+)4 zVzjzj;?Q&&aK3o83h2BUdz^B7$L9?l0oyToJaG4wdJy*^gxU#fJA%IO`qW*rg= zDgdO>NjrE+lb3FbsB?dc*Fpq;Ew@vPn*Tf%6aH(*nRNawykPB@|4 zKqMGrqq_|^_ZTw~d>QMt-yEz{@PqT3&8LafHwpv8Jy0xYCQ#}XeskA;?#P(JUH@tg z(RjyXwtXHH`u@(iZu#`80^v11eH{Zee211qF%f)u)e@Rpd^FXnU*i=Vbfem^8Y$Jv z;R= z?Ia>&gEDe+?p-UVv%&2NhB>fR5O=1t6pZ(04s zN@*trWVj=Ip(yEhwDiE!OYw6B$4QaeM`b4O;~I$)P)Y+~x(I_URZFG^m^R#JSDIDK zJ({=pEtDKYuGzW{Re8fvXSGNR;`G`YK6z=b++Jh`bxEiaM!9wm4zA>Q#+V48C752` zA5E8G#Om5SoJIimYVhFt#w20*l&^bkV#V~TUHTKS_jI^iUU86m4UmQvb*4SKXDFrc zes!dD#c)FZyBF9T0yUFwpoGtH*RKn|A@DItgDCC5`)}_e1sXo&_3b?LK6gZm#MDKO zlos%>KpFaE3YLO&`~W_#f%T(a>GhDVD~c=GazxXHQvv%E1$Qd@AkXS8dxdl~shP0N z(T31Ivy#bSGg!Nq@L%MZ1~=Lhd2h@8@v}B1yV43&@W9x4DC0|Lp+3Cli1l@4XU!(P z4^9QqZ9p>yA;iz%vfOJARJowd_j<4+7wrt5{6=qR9`h-YOQ|D5s3w^*@YauDS$7wO zq$>(8GEE)zT3MCO+DRyT6U_dDoj zudQd>f8|@ff7ILS`po-aZ2jb@zv}z2^iz}Bv~%i0`{`=0@q!ar!88?DK$S^~Gq%nB zE{mz0ITELsx|n5@m@PzAS8`H=vgig1K(yMLuM^};pM{6;ujg~bNkPfL)0ANOtsLmv zJB41YHRMr5pimQ~D}xCtgfJsZFo<0J_tNs@{lVs#CaC@9_dl0e*%cfDNvmC${aob~#AfD2)~6Qfi$XGX7{^CpZa+BRy1gl#8~PGpJ#a<|w* zOngDw0U~$seBB~bBbxJOC3-NlkP|6>4n5ZQEx)xb$=+%l(RT-BHnA>pV>Q)t~(py zbw%dl-3%n=W2U@aG?jp=6Uj7i!Z@U=L_pVD221Qz6x<0`wrzGW&bx_!Dji)4sk;__ zNUq5-miIFZ20A-=j{W?U^_==7*8<&+0@=W3`(O8NcX~Yu7`GDp6hWG{+6ON^m^hte z8fsn&nce%5(+9%PCi>QbeM82l&_xqdqipvsp|?uIsBCqAyq`FL)^xqrDg6t=Zon)$6>m2naqBsIs%&KZVT6ZYu;T?&8CcDQv@t> zAtQ4au^iK&5#>V#pBsJ=s-qUZHhj(2gtC_6FazG1IiKZX#j^aW+wE|GG^T=yHti@W z@{X4GyLP+Pi;^RG?H#n42<>ON*Zt}@< zO|Je@5su}PhS*oU@19W9@JkN9>%})-dP5@*tk(|Yf_6+xHdktKXq1A(1cqjpMGMS2 zs9)=z{$~0!@c4TJ_}=w0{nHwwg%SM7sSzy*%gQB;36z?+G+wrypSdWE{Xl;ZkAw-5 zE~^`tD?bylmr+D41U#fibmoeyk!6Pvx(ncA)=hwTM~&Pqn%WGn9ASjUYEW-lgn+; z(SK2s!*3^pR*<%&rt47Tt)WvTwn#be-_^D2cyFS=?w}}t2}K`Emp6!Bm$pOSxtWsm zCNbDec4{0Z^Yz`CjFsuYN*0o!Pu(DMn;+AV+|fu^AZ2il{m)7d!ba@Vz&Z=myv)1V zB8U|-FN8QpN&*gKyk1wli0OO~w@i*XP0=hz-@pCJ}5b$EbmGE}#?_h@WQv zsj5gMUy95w3UYg7OIddeo$#*AqC}Y%xgtsS0|`Zk3+7Vrl*lkpsu>hLt<@5L!G(Sv zU3I5e872is0(`m}yfKPI+Q6JGkNAcAQoN35l8g-^+>JQGm#{>Sp zzwp%ayvgCmy~=^DCGY@H3hkvtHF2@)g?4?dJ%!&ig>DpNSBlvCk5)qzUZ7(JknuE5aBtH|=eP9W}@W`WAf_`feGb zREcT??UtxEjD0b-!R;&0apN*X4nh#g$I{>R-$QD8w8+~d5w^3vQiQIdHU&%o9(ALwqDeF9vA9LYW7^ea_NH84b zvNm^2BJP6_-AUGClUA69S=#BjHe`kjz?W-!D%sSMSRISbOwmZ4V`oL|jbsF( zx1)(oD>juBb>vhthMq<3NHU^CCbHm`GQK*>&5&Iwq!*x4tfpj{H=GRdYMB+q%_#P} z$1%h}FqWncxs!{f?~~cz&7IwHzdJ6UVWpVvJJWFR_(U6HRZ#J8cZs+>o~@_Ah|dV3r3~V+{ zYzI2a#P9oLIR?FqcMzMHj!y?xo`1c;U>@eF|J8?n-mjYg$NQq+di=F{2Pvbt!VVil z-9Fq!rJ+h8O2f9vMc*8u8Pr7MCBLQ>tV%n>EEMi!PT7cbncYAIid@Zn_0`cXU8>Ei zjx0ve`VO6P7;(mYVVjQJK1Ebf{W$|po6TGcasrL zPJ!2!|Acto(eo{1G3mlkGobkD?;7A|BNEW%H+KyKLpWj6S7g1<%GO0vFyn!ha%?X% z8xzS?bRFK+ICkaKquheB-Cy!xLxE(He0R>1u+g7jyc&P1*MZoQ24@@lV`tFukK|m0aYSV}m zJoKQ&PJW#+;OrP1 zw<)Wx2N1gJ3O0IM)Ix27Ch2u zd3)Jq);(W=&W52R8tahr;@pza$Kau!Ji1*rkUC2*f4yCd|0Xl?$h*!_vV5_rr6n0? z6 zA^IBRSuITO5Bj%S>o}Xb+BO;`;6d$HolgE*Czg0sB->-<%$$|sxkNMTqUj}&5yW@G z#8FyWYucR+xGo}QQs;8IhW=2o_Q9+$Yza;|`YDDxzA2r5)an8)lDMxt@EblN3sAuH zr=YquyZpv0l|F<5hy4-@#O;eawr1yd&wmw7!3Hk+GS%1Kxg+rm?NG`Crmf5sY)%BdHItm_)kJsp&LUmtQkvronI4D^?l>EElE z`U34cuCo$>wQni{+h9KnV~$>%Lu0s5A5cJY9|8%?Eh>+)GRETrd3A!{o`iXbQM`D@ zo)`Yi5nI!Lh+UG1e(wH=H$}b&t`($!^gr4=6xf|I_knbMa5yDxe6Pgd_ufo4;kO zV`9TbU+0T@Du$oQIek4T!9>)@oc!nu$=?DGp7xQ{)>y2tnAx&ga$+hrNlUf((C4C#LP7O+(UZb37p-oiBWc-X}4J9b8T zXemA7_{uGWEsa3aU@Zq;W#0z?n=ye#H5?LZmdT>?0arznjDxb(jeJ2@UP9+?5wIu8 zo!-~B`IrzVI{ca`Aggv(^#CU$=efEms%uNdgc&v;Hq(FQSVvp?J#xk^a@Ms&h?rR9 z-=<7I8c-a7hTPcU1mgcpVo(Sadcb}01<*lW;;Onw=s?vj1c#&#zfbnxur;R11qhDA z;q}yAOwlEurWIf}@AANCpVnb5 zkZAEUDH3xcv`H0AJ}WnMQJgdl+x9RAteb<0hWeAQ_pd-8URl%iRvTTyOnoz@eN8+~ z%Vo;82$REvS!(L*^?WU(BR)WhSgLsmbKp^7-J%hc(qD^fQ{SrKiQDi>cU=4hXD*;^AwD% za@%r?mZg}P=bQrDBq`%I3#f4y2S;Ms8shlYZTwW5t%0&j?jSUvQn>Iz9ime|Q)9ISV;#S)!_}qayM-t9=EKP&9X5yRudYV!WB+d-r zXc3@Ftku|c0)gr2LKVRfY7c94QnZ@BOBsF5!whH{(uqy+UC#}?v+6Ef0<$(CHqIB2 zTRFUgAM)A(13RV6EFT8xYR}jur#m9tRHI?cC(;`9F9Nz2oHY+N@_x%?j z|EA)$Qhpj!8#Q50r=@{w%`e4zYDx~?978*XL#1CHuom|XA^!3#A5<{K-M3QN;-Gw1VrvkRTCrHDwp)xrkA{FqjwvQ9csz3$}W9ANf@7fWqsP6 zyn*7IwdQ4vW(f8@KGuD}9Nt>IVNki$83_#W9`W<2!=+C2gG(ni%VrL5SP@gaS{!O| z4X=x)XV(R4Sj50@)N1hdmsUPX;^G(_HoIkHDb=%8q2`msZ-Nw%z68nZfU*w?DvJlSxgG-n`&g^!P}hbfm$y<9CQ7n5*7njdfB=dkTKF{_GLy`E2T zYFb8S^D$QAPD*%SyENBb7@cSkQ!*$c18S~Xl%kk@Fp(m}YfX>Ml^K@LD7)h+gIi{$ z<^}YIp74k*F=cP}+akU9h#LjowPZTS^eG*0uN>HVrGQF@AcAUh<`01YCR~c?I;Gx* z)_ykG%x+igy;^_qKtcxGXrQ~fLZH@7lM%gWL|fldyPbZI~2eOA=O#=Z-l zf}gU>s5rn*)W#6@N3@V9Drz;1b5H`1M>vCt32_*TuxBj*O^%LfJL!t!#{*Wi4K+P` z2X7LLk`nD!zKEFS^=S$gsu;2h*XH+jt3*WG+iU_GitA<~fWR=q2k$=3eT8iUN!6;k zbD@VZA>pT{^;qg|)<$+0{J8Do(V|IV8kaQl!1CbTFf|1*&3$-gUwNa>BSwp#R_gr22^Z9L(~fF%UDG%Yt_Gc6Js~{Klq_Ai=~D=2OwV&KG24=H zcc0x;iQTF@H*W~He@ICO^mfjIh|3m;^3j-vOBMVWs=65D_THt03irozS*oh$^LY9? zV`WZ5uDQULgn{*h$&`S_Rgae_NzAKnao5bN{A*k&}}Je_%o!Bu9;7^Av{| ze{p`W&9cFpHy*07lLws?RmHI3XXM%5+kZOV0oSNolH(!7XL*jl5bhzbC89^oJGvXu z7>f$sgRP@3N%4!uEWi)1AOf9F1j5WZ%wk@^+Fe2QD`CUjUur%ai&kTos6$`O9lwwz z_yLGp7V2KehXz2!6OhoM)el#YAu_5Jv^DbRGqe6-XH)C#w{-q0>*NaNjH31S>*2t_ zlJt$nTCslk)Y33~R2Vw%n#V$TF*Len=9ZWS1P(7tRyUMf7A6XqDY`f*`vml{dV$4_ zg-eS-F|jeDjGtc`V_+GwxxVXcJ|SjYJz*QkJnLt3h(ba53q*nl(~tXw!gtv$YY=gW1X>z`^(y5cDJf53&OId~ly zObF>tgBXvI*AhSBr7OOBeR8wIGbTOhJ*p#18Gru%?G~4;x9Q!WlwOrb~5y>I*;QDpf@L-TR;a_{rw6|@* zZm;XR$|0ckk(>{o<IrjpN=GEcc7pGK_NA7T()k}sHr-c9AAgc-Sky!^-ok&nUCXLY;=0& zUA4-%5u4@ZyIrv9U<3q1c=zGr!_Q$AD2U4+aw3aO7BU9bswC}}RnE74&f5s*w@ke` z7@__G_-j)kw$m#!dMa2}fovr`m|{UG&3`CAcnQrx<}14x6eHN0EWc%E&@I&{&f0b` zvKNu>(P#^(g_l~cHl=>zFzj6uE3vyjE-mDQcsly^6_>?ZE*FO2qpvGZ)9i0f$l0!X zO#hn5XySFr7FYj${GALVwijl*RHrn?%W!D$dRkfHuY1+sN-`g{RGW!2e&jn37uq@f za)`v1V1gD}|M->izYUfl`ztTZ#If-5UWn(%b7B8cSQP_OAq`W%Ux6;aab^CpegH>< zky9u6DHLnfvot&9J-%#9kV(qiTH_6b_Ks$bzt4|X#FIOTT-?>v)LN~Y2l#p+n>TslQ1U>_d}SO{mVAf_lFvw zW(SP0w>m9Unif3wmNkF=i>>zD;rkq69ZT@95kGpOj2KM4)}wiFQ_0Bb^Feupk}j`l zU!F-{vAgQv@atU8S0zc$J471_hUQ?fP#bXru=`8O-?GaC8g~EF(#MYH%Z1Pu14=ue zz@VwHs50sgUIMCM13hq%BF zs;G8M_Mug=vEMXwj<}EkCy<|G{&bR*2+ZVu*s;}a0|fy^&z^2NIRgXiQ<0Lr)l%iY zPf^<80IgltQ;Q0E9VhP<#m~T}=ev32b)DAk#^2cklp*Qbvv8!Sy!fA`{Mq$@?-4hN zO^}OSXT#b9dX2_B2MQ zfRyJJ{vU(>pJwpCp4@nLmBZ9kq~n%e#1moQH!f10%qNXA>2w1+>51j=#t!Fm4UMw& z^fxx&IUz%y-~Wp_{b$Wlj~GVl-!SJcpF4bVi0Wu=vAV3FtOvh?0Zns}?w~AeCNfCd3pFmeY27ifyRp+H`OUJoI})GfAxiTpaX(C zoHz788YFT$A>8!G45iK|BqmNpaEUqZt@e!%4P_M{Nri8m`Y$WNe})RywLUKF@ZtSV zgr@Y2jHc-y!)tFQNqnVr%uLT&>ADgiA!cnp88jGKnc>W&YyQctYiA1cH6s4mD89PN zkRCHh5iCP0kE^V7F#7fCzf_X@WA$Hp@xS!+nlI|p|JDLH^Yr~EPG0Xv3p>B7GBUwB zNb&#fDgTM=irnWu|J)VC?eyA)``?H(|L2dqa%b9G_(_aFAce>8IcYb<$<7?uoOGi1xx6KemF z3;fF|8t-%RA|K7W0`4My^LOz~^p&yo->#UwSU?Pw#657r3jWo&WB!j{BEa?4;|R)) zyQJ=%5ggWOty)^L9pzArJ;Yr`$9KNS{ZBXiKRtQn!LX$8j`n#Bzxbn0*|$hsY;(^T z^ndBGfB)*L8N=I|4vlW_nf?%NjAU8#*hLr|8~Tqs=Ht0mjmKHLOE*^(x8m^X_*AZ& zUU1)VooNKoH{Z4B#y>W?s|+vLKQAhux7SN>x+rAoMWzrH7S!bf07c@T_SBYOHG-b7@!>d2qxOs zeu*w*=mr=wCN#-|H}}Cq>ONGXYl(jfY()jKh5q3GxkFw4`tb^>p_|^6${dYgDk7r{ zWLxI?drGl(T9qIJC7{PU#VbS<^I5t^mUtX$2IZ2TCd^trK$w6`avnVfbN%Bk|2lZ) zXI1PwY9F51*GIus=V_I>_h^s>_>ywi}Q#1p+(4X74z$}U(zHuuKBoc=e6M&zC< zKRKcH+eYl11f(>B2n& zuaLPhjW}drtLtoIO2c{Oq(q{aG27Hl z>03vY>v{jYX8W60+hFD20^ZWXugeS(r`P1R!fPP%UI}ZqQ#-|j$6GZz7r+E{t%`Wu zD=3vL-Md>Fnk`=w@{j-Far}u@0#41e{eP5wRahM15+!cIb#Qlr2X`5QYjAghJA=Cp z7M$Sj!6mr+USDiXlbqeJ}FNXbcRQcPw*D}RQAg}*T z{p+UgPumO#(^-%*fXx5*u#xuKrd_#s%g>t9?l-Pgn*Z5daehXD#z=`zB^ifnSYG5! z%}*vRy_@Yzb)hsOXCXSZQAgl<#;2uCK?lk_J!?umjk$Zw`koh_PSxd-P7{hbwby`m zr6&Ko!Ox*s0@t{9+Kwz&b%;JKXKadDB7J)b`crH3HrUO0`WKXP_FAiJ5m=(3`8D@u zt?g_jPJ6YCe&H+)55vnzwxKrH(6aQt$9!>_PlJBJ^MAr=|FL{rDyqaMrg|qsT_-H^ z0g`(hsRQRt9jknOHM5|%o(OdaMc%Y9<_}%O)Z6>MBvahQ=C_RoX-OK;U0OvMrv0(UNnDm6g15b z2-Lw9@QnSRf4N{3I-tbWc39WzpO)?sar*xm2|=kA6}anmN|n{`>Hi;Z3;%a$=+S}y zBdY!nf^)%Dt9afiA>Y&Y&K2hv!C8d@Vom@Yv{*-eN~VNK8+2Y$gD%|7HhRqywRK+A z&@{>SsZGyOt_@y2JI$$D!Mz5?YFt5;luO`jLsWZf)5?=vG(98Bx|3wp(O5EldW2Hb zMzz3pnczeB(z2QJQj6X;WNN~l`>ck!Lp?FExfs^Jb>~B4>dDSh0Z6YE-I1AK`naV^ zdtKF;96#h&&NJJ3iXQ3e#BG<-&Vr3sZb z-`m86xy|Pn49aARXPz+z{!{+7^?B<@kllA$!h_cPHoAH$kq0&g;$+D(7c!22{hAm_p)oIU*2%qYZi)aggs`K!31?rv-eUk|I zF`eLOdFuK2rdUR>TYbSA`Kz#$`>gI!kc)4K-_}hI|K~Lt3W(s016Y;_-%5}DcV3J| zEX$Ovmjz@kp#kyeJV*Z4RCp9S)41IgDe(_uf{kJ$wv8Ua zZaTOjb5Kg)w~`Y{EvKed-H&(yO)V;`|9Us;2BNplxZLF_GMb~&-_j-*tECBGFz6c$aoLSzGr7Hv@!BZ_2}g5@Fju_W6u z^9RpC!MVm9#K`)ujUk??@DAO3QPB-Fclg>!pfK^VFw5*{z4*>k6~YLO|JtWwRVTSl zVKn+cf=x++4n00BpcF4$b$A0VUfQ$YoQ}NdzRNM?KL?hHjUb>sK1jz%bde&1dnDUa zs6N})0}OqSz5e5nNszcWm~0>S?3C(LPD zF)R>bp+$0URc@mXJ5r(&6AoW7We*hNohXB?3d-s0(0YHUt!!lEWWtP&Pzdj_lm~v~ z%i?@X=H12W4SFFAiTN0OT|D7`ryc@=KTyaKRx1obnb<>nD5;;Z9h6oU&!G^xCl=r% z4T?xo{Nbr4#np;uC6N;9CNVKTZ*(NYdp`sM5M29Z3mJ+}^>me{jA+1?)gUe+9(`U} z)?P?Q0(~yG+VvCL9Iartk?0Q;fX9Wq8?343^Jn=F?;>Zq&U(HTbn*7*-19al@2z;w z1em43Zehr~xyhb+Q9FWUKm6gI|xE{=9 z(j6NP_9@d$k{ZXbLPA8#sTleio#FthBT_D44Y}z)DFBRxg*G&oh-%uh)e}+R-#VCe zFp21COQ}ZvXgUawf0Wbgk+ZkSK{)H1sw12z)S|bcN)Gi3Ksbcpn@)!#2Qg0QA;9K0ua`^G(Y6Al65mlrN_8nV1 zJq4tbh<#LSUm!91@O^C_>iy}^T{;;lQY2;gZI-$p>Z*CU5p=QgNO}-}!cE%|T8ZDS zx|`y!Qf{2?-kq{$xjl>{71F`EVw+lG2UW@S@_fiZk~o$~YWL&*o9WO+o6uUe#&sL? zhjYw4AL8x)4jl+6jCzS674Lg@1cM%1HRtW;IG^9!^WV@97KhWKQHtF0=B~sG)9=OQ z&k`9~5X>QU1!qjiSePU*B6DZnnQ(}{=lr{`YpUR7ZOeWxj-*K~EHUHjKkt?LofR07 z9miy5d_`n>UK_3YpShJXwk6MUK(!6zTyv8rP&r z`zA1A4;-BkQ@I)|T0Ia`>8 z9d2F34!?;WhaC_equ@u9ID4Is=NTznzV5${)wQv4lCOnVz>kC|X;>6_A4@a^jJHu=E$0A1>NLf6O6wrEM)f~XEyPtdcrN#Fpbwgq%HWO8 zFwKawI)woi%WJm4QWQT#E6;u>_8&Lt=82oAa7NR6(#@3(A870uThSjKGh~8FD2xB`^V! zIDB3fGzM`X*!;(kzmap^a_S1sb0y}Z%hi@a zl&1Cok>cC4d)#y4(3}hJOJ92iWhCo)X>)$knIZpsIEy@(T7kI2OGRK-&gnEy$-)&< zO+W&*UHg0<2okKrL!hlCg=y3Ad>_`}s(?GFtNtqxm%0Yvl!?ZVCVecM^wAtJp{3+6 z5aO0?{oF~k)3#}k=A+Fny*#MZP=?z9lS1lisK&gndP{ovqFEqgZ~7+6^+Vs1D_J~h zsE3Ewg8UTuP`duu3Xc5$lDjeOe>&4oy<*}IEyXqZPUGEB8>=-WLj z@1f!M+p{?Jz7kWw4dq1~l_Prkq2xh4E3nv!xe*&p8&U87P z9Gg>Arc!_vqef97Ww}?4IFPy+){QKn3 zQfo4%9@qtiAV2CN2C3H3KsItX#8}4Vx657^z1d?XPxI347nkvg_bnl%yv$fdG+iWx zauZz0MKq!Ws2e3|QXOLO6P^=_za&-5)*-2Bn~t3gIZP|_roMbMxoRpB9oX?Z%QHa5 z^-nM>xMhw>ti;!ldQpsAFDk$R?C<0jUiJnEW1Hz6x2oDy0%H`MRSNpZIm>*hDM4sM(FXIqazWaR~z{Qxv zBo?Fdfa~0v$B!5xtkpHuw@>vcX6FaZPs-|?KPum@FYzhFxcq~-dv9EGAN&7grU-5c zj|OqDiDxt7>uLEQCKQ<4Q!}Uvldc*KgzrC%+37gbK`dGM^$f17y?R!6XP zDdP1<0Gye+X_tLXrIeKU@~LzMn8>imEIrw{8C#zpa|VuGvfxz9Lap{EE8^`(QKK4> zN5W&pN}(HFzJS70MGzI0~v%xD9k1&Hi&mM{?y}Hzbqj z4P1}C6T5HK%o?)71x!35j8x^w0khX0zs)@DKj+<~D9Er0ql7sEiHdPqG|b5gw3vrz z4!$`;FD#6)FECDppZ8=HUiIn}6ZrR?Pqcf;NY7OlQc!pDL`cAINjCK{K_b!ZUzRe( zG`;4c1XdQ}LTyaKrpttPD%;=hKV|xrmP(pkfRO>@5sIG~4o_ts2{I-P_2C5JjQ2ba z)uGNW(+5F=@rAPVbl+86ffYCmee^Lp_$!OWkTU&-3!VONo^Ws869fG-?jL_S32X$M zR+yC;&9szSNTh2u)xX#lG4c%>A;RiyDt zxpa|?Nj>G$W(svgk>N!$3K4;Ir+w3B5vO$t3(UGths+Md+Kt_v!ut(-po>oTXU6aA z*qf9T9PeUHv4hr9zHePTzB%!J&PDe`T`?#=RnY*60u@izsF?h=SnLZT(Ro z3#dT6u@>OhYLVCXr@FFT7%{SJbA2$V?oIgOOPfNex;FLUaOQ=K0eeW~pz~tu+G-;i zk>pf<;y=^|rhv;SpTFrU7JlcBD|6cCKK+`jzSHi%^<@m%-RPdTpAxW`WeDWKr6_m<~V@+*e4g~r^_w8>hGRyQ2Vq< zgF*Hs`%ND4r5?UmJ#ydroK^WuMB)>T+-}^(})}A@{zcQ?8 z#g}Zb;h%jfyFM*Au~Khe;=5g~<48AYQb}DzYB8{w9Df-9a5&k3v}5`^Phq(pqZ8Dl9X-(Z=0HwX)QZTex-=QnGqs_bmi_4=Rqe)fxsw64claEm#I`(DJ5e$ajmeel+2oS)VX-r}z2jvEVB@tML`d_(f>02iGIaJXqL-o(n|c z+2W9TcwRvig@iEZ-=^%es~SNo2c{4I2}8*Wdg9L*iaPjE*YZAOH9^I%yKDg@dSs#1 z4yS!j7Oi2H@muCV6Q0e57PO{`!b^ZwY55+gX|$+yINI_S%b6@VA88o&cV^F#TrJ&( zZl79_b*)feB6#Q8+rp7s1+IuWc03%fJ~#ti+QVIOYiJx1g9p%49Vb43s~Yk=TI)V$ zRI5fp8O41qFuikW+Z55Ykk@aTh6D9Q%oQQB( zw*#rjQJne?{Lf)6razVb<^99sixf5?$~%-NU+$HWl5r7zpNpmPP(LAFR8CdQ__IzF z@pd8Tdf(=is}DN?`s&};6EYM-Xd`Hb3onyGmv}>YT(aQBM#Hj(ur4-!e-5MXV`4vb zZd>vu(e7~>kv_0x9VfvWW>G~YA=~=-Xq(ZwZjm(gGn8yOAtR(4${zV^fI)URUL}Ec66RH_~RE5qmANmkW}xmSOtqKce*Qgk1y0>@y3Y*>XpG9|ah z?Z+8G73a!s+CR)tSh0(6*~LwQoUvv)G03BMaoJBd!FsIg!UXsgCwk!Wk>LSikw3N! zyJ;T_3;6X>TAJ^iG$HVqPGo0A+5J_O*x;RztdKof^@YoeK=BS;3R79JQu+nVL`u#& zYyz3WKL{Mv*RHcJr?D!x%9mc%Rav+ATP3f#bupcq!%M{}FAb{Phe+>&rST87bHRyO zfb2)M9TknfzMB>mO~ndq~G&`y@Ab0))Bm&#eeasM655;U|kB%dM`DLv$`;t`*3%v>)C^RR#-1?9|x z6ARaZBBfG#BiEYp!fLyo$Fw}}ImjpOgO^y}*TXN)8>z>e+M=37%Tuh;L&1dRz;C<^ z?>~cn7?AFbhQBsGDD}hhO?dEt5+Q`r z8;w}y!G7X|A|)=BG*WM=EG+ngTv~3Oct)ixItTyd={Q$WT+nlf#x*{ShjRBSFeN0K zS7x+IvUq-B8>kSB=P^mxDT=?qeQ(Qp2+L^Dan2=o9iRz|gv2Y9hiK(ra_p50a9;e2 zekEXIv;WNn1am~`&IQ>QNmrm}3Cwgh!*zp)5ZMq|e(!ik;EofEQEVquRek0Pox`!w zH}3Ossdw+}@wiolI)r)zrpXh@USs4@DzW^g`gKZLWrnX0t9sG4lpi=1yuTCPst^8I z*E|G*lnk&Ag_5G`oy|RjH&x~RkiaGI3Ky0a?>BEAde$)p8P>n&ZvVY|;2`3_oY*ZZ z=8z%E))Im%CkBq@WA$_atI%)0uz*$m843;@o`Si+BEg*lwbm-7xKH1QboB74)88tu zh@{oSrRAlSO{sEJt_;X z4PLOe$gyV9D)#>*Rx=I`Qq4UbT;ZqkN(f5#E6^o`b&%?BQ0#v}ttclb7=vtpleVC{~`Oe*N8$rZ-Yn`I!wO#>3x z?u>zWSs&jt^2=)G`^wUfJ*oW9*P;#CSovEtHL6k}dg|Il={=}E6$Cb(JX?q7Xq9SD!P~Y^ zHFS#4WjgE0Cl~;k^*?>L%JM(r3MD$SoMP^}6U@*J=X?UcrX^0rnVDwSI3nNd>SmyE zL0kv%zRd`JW<5UOhT)4*Z$8JC0S>}quYp^l?Z+u~B0HiMB7&nq=m*NriIMQ# zjp6`~?H560Bvmj{meMY6R_Z-B%>W(B;b-cLD^f@Ll=6Q)9{@iD2Jmj62y`B$>)39_ z<3P}6bz%bTK7i>B^fb%mw;!Ri?pfMSsW3lbfPl-`H~uPCW8@7tLFLOj!yLTCoths; zo_$AU61ljC&Eu~Rk*stU$?++adnCTi%*|eimkesV`FOdArqsNQP6XURlD6VfT2!NB zfn~le?2j~I7?^BGV6u!&tq>4_Eq#$>x}c>`CwCXja7N-*xsaERz6<7zPKoT>A3F7{ z`FT1OOKbIIyY(Yn0YVcBIb{6!i@DFnl6eO*uW8+kymN{S2B#D;Wz%3&Hd5sjKmB~YF^S|rHmsv~dfP7W3FH62jr7XRXkFfURfEeYg0K5pl;_$$>V zhkbW2^|+uvx&T5IGw`k8IV{6QT!_q<3etARSEM@h9Q(pWn_wA&oWW7(&yY1#ss*jO z33RB)>1T9nt~pItP%fr@ff9*BG)aaW+zo*Es!l5(f8PPDsQEm8$cYHr%3T&#?H?1D3Vj~r-*8B?Cso* zJQtA=nelHq!&f>{np9`NA2&156MNB}{%TP*kaJ#zjlgPcy5kPS;JmN08_ua3@*1?o ztW?nCl+QMqwGbv*UDvmtY9q5=*4lUPk)~hy$f)08Bm3#kU3$WdCVSrdR#~wNL)x!1 z)F*i@2IwK{;AiwDhybei>il`SU%@?px0@l2!4I9r^xN*zxi&F`zEsaa`VU1Q{GZbG zG3P6_v>!`Fi}fxag+gqidw-3O^n}h(vvzETf z$DeP3$#~h5pByziD_>W<-iALHbyUyf0Vs@_MBj03 znpKFApT>Of((amW8V!T+&*LeQo;aH}@6Ea%8QjR?DF8pif%n+GD{xGw%p9yFGC@<` zg7MFaX4u0A^0t|BAowk;%G7>(w|pUOXk@lT0e9{DTAuqUnY56ew4vLOOt?G`f+(Q{ zaIg(r&M^OpeQfw4jEnblfYvvXR;$jS@wT0xOr=p>M44$*LoDI7&*R zB*=DjL|Q-omX~9g%1_cvLQga^PMukLX2sV>9P5)1s_d3l&DJN_QeH+8<0A87ob#ro{LW;}Qtrka^%S6VfV>J?6pS52vM#0Y{Mf(Io%n2Ns&Vq`L z`CzVuCM2>WWtPxci)2h)U?LI6;4+c(=Ud(G?^uLA>J>670eDsM5|Lr$8-OV^mH z@-{etbK7iLO(P#el|FEO!IyI2)VqKk(;`Xd zH$jr!S=P;)@8vk7rtz0h#&{bx1NBiH{JRkz$lze_-^=>n9%3*DTu$3uMfS+Lpct)F z0!~M>Mx#Qw29p(MNjMPXe-(T0WQ)+yEYLI~!n)~BOTL8pO&+pD%iL;fORlPGMM1=w ziq$pqi#hHyW%>|E9(9!{euEZ6r*g`9$k&M%VCGkX^N7#X@~?#qNCYd^n}e%1ssh5n z>-6=l96bT4T2PZT_*DXWCvoE0^)2Nt1l|}i;xZ(SB_CyZ{-U>`Qyl_56m~VJjF(1E z)Cl2(;oIVMtNnTnyM@38=bYa7-peq&<~I?O~vkOCoEj(v>tLv@|qIw_h`@ zSC_>*lcZ}k(D!?|p_K6|)Vwk6;>6mV&Vl*<=R9m!B=~@yaB$3$je+FnEKi1+BFH4C zuW{2BG#!vLR@=9l>EF{HpNxB4s5*p?0AZb~&(gK8MS~kWy9_OC18ZC(1QP~0F@~dM zsduk1G3Dnih5b2e*kt_ez*q#j1Z_loIQf`Ap~vp3hGHhm5RRp<$oKdcinTSOr+b<( z6+l4Iola{ca3@pF%G$D-!5l;S_m3RET3hPiU$~we**-}nzH7!qtHzb5*LD9=E&!{o zpXewVG|jy|k3(BW_oXf2zpa+gvWQSYUuokHMR3w^14X=-=&)!SnLm*WI`K?q*bzbh z*Y7RW?tP$e@9C>M!8Xo!k)Cr$tugBy86B${3r>t&4CtygacO|T(VM!X&fLA2GE)Zd zxfcQ&D@UV>&!+U1@M@AJoQejFOb0G8iy?~z&^J>%C z*}d4Kr90+chU8p*6!q>ewt)_aL`=Z4Mrud^TW*4nk-sN!w3(q`5Aki;pt0s%eTusc zOB1nG_yy--e~&XR`qsNpb@97xvNDD-B_>j4DN5c{;1yG7T+R`DHcgB+(-+FkcX@^x zH-hXba94RP16e6<5?vE%GE`Owa25j;tb>_RBTOFL68FJl)w-C-*VQSu{{EW@eblm0 zmgu7^WrU}?dUCCP%LMcJmj8|NTD@7Am9_QiR2I)!jyt5`^wa^W`}H;TUj4zY2^!?b zunVY64Qf}a@jo@e&ONxW+%(#vqYYPc%BZdv-=dF~oVPG@s?#f*m;Kz7d{H9j|2( z6*Ibwhvoi(4a0HUru#xTnP+2vO9tGcSVT_i!H=A?C`W0U?bAQDlMGbbw-`|hVMAU+ ztO!yWv60qOwRhnzJi@+L29jTd;({neE@@lx=e+NWn`GjHm!N#B&9s5^;#R`r#v9-) zqyd^2=W(GZm@2}`I(mI{f%po;4dRj*E6EK-XK_YrkccBN8SZu_g?jo9`c)!3M(xlu z`>%Y$QbkjWoP0sDdiu(f4u$ho~z6SauoS2Es1Q&(uB#ejzx)yYl`SE_y`e4kI8u zdRM0jCZo7*)a)t`6pp=*C*tlSJt!k1WbcMj1dMG5MfwzAd3aJdrW z2=S^d_ID6sEFNFZ!X8)jVXj@WLfiSLV5(q^*Wzu<96@h;tL?KJ)lY zOyobTNL~E zL$3E`!*CqY8gzWcPFY#`?!5CtDDGQ>iz-X;Kdefn7BA`8mqPRRW!~3`wd+Da*F<|j zZS`_$grwb2Iwr3xrbMLcpb}h;8LTizf}WIx7!LygW>Z%KATjm=s)I28sJp*3D^D?Y zH?~ER-z5}U+(hjhu0rJ($+Sq|8Z;pq#%^$Vedwykt_hLxVZ1C66++^%e@CU>L9Vmh z%XBNT6$&2fs{)(&8m}a3Zn|HZ$tYrnVyM^1G7<%l29u@LVz0d=Rz&f2$W}%47!Bp# zzx(qwf90&J;#hv>C=pE(+>+aXxa3!?;|$BkImCQawev?F3B6l;EBO~gfV38(^gGMc z{T|B6D13PCv~xtxvI+@O3(Aj^K8x^-i?5gahE*`?Iy=e1^^XDxGn};P_3@48huc{b ziBu@W^ljDV=%EsHg(6Q|f{3Rva}1YDo4Ffu$B_F+udZ+Rd>*S`z8J&fcuSGJaqiQb z$P%cbunj-uZKf-?`0NtfYy5X`%hV8Od$ry9NAve9sxot@=cU}uz4RHW`wK84D;}8K z5YuA75aly%?W9=U_Kx)fpY_9$6}?soRx`H7uD41lUX=Ha=2>MsWL*G*SuLWKJeFq8#J{yWDJxlVBB7J+0Nb%!YKS^LvQJo94>HBZ-i6>E*m{T* z)cisLubwpQZ~4XNs<=*Ty6-&isjdT&kw|LQd*nF+CxoKr*EWM*3SU)>^(1K#yYg}h zwY^n=m)+}O2bhuH5hj8}aJMy66C32|_jTO2PZxgTMC;<58QTdokd5GjMQ4ZHfCsQ$8({ia!cy5*vm}evlrORX~3c ze5Yv7D;<(i(XUeS%U2@%wZz18l;lUmesq=9l1}zMvcHV_S zedeQ*!-yY7RP0%*Z>Q>nPHKXLrODFx9K+*+)=SLH=76#-&UQ(TtbC^k@ zf^@s`G(?(9Gr(_=+a^w&BhfM;D0ht!b~We%C$LI_{WtMXhjtY)vp5c58i9$`cEpV- zhHfH3pe;JReQ2Uep7=6##)Z1o&S5Cp!ehJ8Rro1BWVgpBHeiBRug9BoEqCb!GQv)T zfmklQlA?o<9{$32K)T~zX=_Cmw+7nE8N8w>*Q|>mJ;D`?+GZng>{w{<$!EEl#oKmC zn&e=Uwk))3zLQ3)OrL=YJtJ1!m}P)k(zMntTzuiuOLEIuwJeWgP2_-YXjLm1s9Q1s#;W(Za+oo zJwbQ=J4EiePunwqJNhzgAj}pHfd#dK$!gigmqV#!NOJ1cM@}pZ;fCUGagBD(TiU26 zfHjKs^Lmj}ZJr$fby&ToV23>lNdIPt$1fw21+X$k=y0A+h>$jC5X{9;v?|9KN1)?zYTt9U7}vaJhZK`e+5O}RCe)`oGwrYo4E_-S<%ce zn+nW+u|Jo1fihK`EGSbFDAV7)*xI55r9@(81TY57-%pQwqo@6P-6nmX`BY{`G5E^4 z39T(?I><(OCkQ3KBV_Ak` zpgR}*>*w3nNNnO#0psIvLWw7GX!h!%0wZTye?+-3B&73%M~iKtm8omJ_sf>$sG}^P zdFaDANQnin_EQmaFOpyG_wPb$?XJa>hedJhBo1D9ch4)2D=H1cMD&O!S_$f~6P#@d zG@RKevwL|bkvt-zcm_<;OYTXNYMO>AASPVoD>4}Tfs<6@UM)102$)cXu$XkfynnmX z*H}Q$m-Zg&li*(DDzjE(Uo&p-3NMOB7wU`%fMK|^E~{6J`m1Z~on?HM?qV1xmEdyd zT^QfH;?Ff!>E~S&D@)w-sElS%0bypf;x@OMA*ZaA83rZeO-FQq{v5y*cc99u$Z6!W z`G)JjJ37d6s3UklfMk63cP^S`b z&9uYnRqolB0Trim7@8~_&VvZ;$l^$tG&cXBn{H+JN+dRAsReA3ux6q@KkkHAFpkiJ zv8j2`j*8h*fz2k@f4Z}1I4MwF3OUCX!}0Qs1%k+mWAtV8?9{<~?iF}8U13@r z3NspXv(qe#+!;b+gRZ3u9MsjqPZH&sC<#*HnFXz8078zlp-ae!z2%(OTBoh2vkyd0 zh$-^(?v#G{j9W@jd;YF0Uk!mr*6`iB^&w*!4sdj=<$4y!L%van!7I@DY~@nWH*3-~ zH?ACdkC!Ha-+B?{`PIfM$LCx~8bL!bcn4yq#f^vO$AI?Y-Jf#9)H-Z0|J63;xU{du zi3wotfreQpi1IPblxpr8e0w!Y&4wDS5c!QxC4_SHKw!K4-q{$5ps(AQJ_lw<;}$rP zN7#ez7g;G&vVrPo@nnfGZarIEAJZ{UBm8cu-~-nZc4BG!QTJICRI}^#fznK}VUu{3 zfsw~T$7(AsIg&FA;P5o4cHOaelBUn~ZksM(c;n9hPd6AkAQ`p^m z%7-DNW3^vJ$SmsM#&C%U_Kemu7iVC@6%Efq7+)$;I7HRVmAP0XsKXDZeQaD$RZB&4 z6_@c`Dj9l4nTpM~Bxd{ z5j!cWVs=M)es%ASzW?w#T{hbky3d;rgermGbzcO`Fke^xP>tZu(QZ>H&VcDYcn(!f zPt{g1q|D~fh%^(MT~Bb?&dQ{!W|wnTRsnx;ZG^Z)Iuz#!EG*n`hVx5PgUh0B2L{-_ zB5@=bqR+$u1s;FLScLv2Q%HEhZ)%DixVZc{ZBTX%$rpGi>yKb8Ddzl! z48-&(9(@bIO%#lg7d-S&P!_fB#eXi};TQGkKnH95Mky(TV?wuCJ9MMwwRNMu3Omcx zF`q2kS&(lRA`9+EMWo&kMGqSF#jKXdE8smuokgicf*(a=Qhay@DxS94hL5)P%ghko z#VC@4)Ke^#!F*(vC;)KOcSH*eHh1TRBaZgZiqk3tTd;az zX?3|eObeFttV`bPKUt!U@ZlS(4j*9>4T!jPmWJl<6?FUbx=*S2^;pu<#WP_WiI~BW z-FOzwTpULpc^Z^)%Z*h2KP>>f2Oe%stj+g7)%<_-ABSDX!vU@ji{ghAN-yzE)XiH< z>uObR3v`d-4`0aaT#fvM=FsH^Xpd9R+(+94{c6~Xh27r zAv5aIL}FL1Q4L;YXV6tm0p*h!h3S>Isni{sw z)5b{$s6GSa=D!k-r7u4!HP3!me`~!6dVA8=)U>#rpmdl=@U2IPI)Cm^!v-0lc(pd;+GvcaKQOVtJ&Ff)2PSe!7bt>9Z*W8<8?0qs&L z*c=Bz;2tQ2%T{cJGg`V&^wYg!Kc+M*CZ8+r4#qZe3ek;T=$%YriqLZdWocjbfGmfG z%)5!n*(5Ci_YIZ0Z$m?uSLj6J2UOO@lx0yojDp6$`wFfRq|O#dHw>f(*7%LZDt{Eu zXH1B_a*25P6eYD%T(Gg6eeNs9Ss!!3S)9lNyLUAA$@}axl|oy^vka?3LiHojOYiX* zJ9aF3ilhD2!v9vu*s8OG)I(4|krbIh11cQv@ix!IxKoMe!Gr(2a01ZVzpYW+Vn64+ zwMPVCwD00xj<^2w)Y&747`WpmxmOyTF=eJdg4Oes=uyel65nkpC>0JFYLdgE*s`}! z+K56EennA=ki_i%mBmDM)aW~UMYR9`pLwEzy=;Bj@J3?6=%cSgq^wtDcjUKqrDj-( zM;h9^$D$A`gYUd@^u;k>D*BFu_6@Nz;ItFi%V;LBvZL+g8ff%DIS+Y--mfCI2(A3# z-AP?xBg>4$N&^oWz}mF_kDk&2@BC*j^-7jlzFh4Q?1=*g5*$_Ft~>UTCSNjB8tR>b;7L zE70Pb6fwpdkf!0n($$pN;eA zqh=`{P)8aaWB(Dy6dwrZjxEYefD66pYl5L&@>eTz3e@yow~eKiwpC3 z?#NN{#FM^=?c>P`Mv0m4g-Q#vBdi4l>GM6}2P@dGYLAWY>?0yrfBmHtTm2`vL+&ENOg%gSR8d_?M^)N2)0^FNQ|C%$iz&kvWBK@FE|Q4=YrUZ;)MN{}>D z?cdwoW#i9!*UQS%K)Sl~b6(oj>S41V7eIc5ys2pi(WN85C;ip2KlE7$q3!nhoaGc& z2j!XixtuCpOMy!dTA^$CGwwRDcBw*ZBF4HClT6!=FC$FXcG@(dALwNj`Qpl`lp)(q8g63ld)Y@=l1olwjrTK-bQ0g7$ zlj4y08M#KMqP~iBmtP9?Ye;dLhHHQW;N#EQMLsDKZBqMGFzc6^VaJcmHgEh*)7s_2 z#S-0b2eRB-NxOQZoOLUc_g7Ti7qX!*wb*!SPEWKBTp^84X@$D@<2n~f1Zhhmtr{-2 zN6!!4b8VFlib8gql;OpU*Ya)apV_it^unsGhffmLLcUa?P zFUN9#fK+!(=vtxsdeRH6$jyWgeDZhSg;Wt_s9F$~RXIbEF#?XU)iM46gPL-Jsi{Y& zW4ib?^fZh!E~rb5;ZA3W^?>!;XE~hH}*M*fE{FY?zZg< zo`VA;kZ{`1QtQSU!G=o=6jdXXwzFsh@I_ahHsX$pdb+CB{m6M3;} z@dD0R3-M{(#4})Ybsa;Swu$q)QGc>_QPY+mCV?lXTBatK%QH2NHd=beNLomG_(uST z2R?Z@7dtnkk39b1DzlcMOd{muEg$7#LjxTdj;~yQLpIqO)ZO>RKxXT%CAaq#=6r@4 zhUC76*YMHMosQnqM;gmCn%Iw4_ftD5FGrDwFz(Cl)GSlu(&V%xk+-M^O;$aMb`-;p z*0PWfRB`JWH@L}n*bpU$0?Kh_UNZGbXRxDj1omE+GQWjNi(M{ScYV?T=_wf)uov5m zJiZ-vaDyYbYMR)m!;gi`>A$lqO+vZ|yLk9jia7hn1N}6x*K*R1x}|GA4iw=@f=soD zb614*LC5e5T&vuXH`-=SgR0<|@{*9b!UcmIL7@{0^#+8JX;UQE8I$V1_T%_O)xe%L z#>b0Rl(fPJuf1oGCed!@lyQA>rIFpH#N&64T-EoedgMo>`yqdllE!p5zXZ;eHR9&8 z%AU$gK7eAvvXMmm;7(bnyi=v2YrQ{?_ZG)fMN;gOkc9@X-Q6e%=KNXm#r%;6KZbTH zKUS>r7dxptiPRxGFYI@-e8v}y_ceDdf4n`&wmUpoDoQ)#E0-;`B6Ka>ru(Pi~H0b=6)~Q)pKe6L;{wNMkd9Xl?rt;peMpiK?@j!ha_E~ZEKDIVd zyq6Pm%He#1;wSDg79BDb-WTH?izB*)b5 z9XK)rF3zuloBrC~^ zjTNh7+ji2i?T$OPZQEAI?%1|%cIf|PHA*I0 zu25#TFFKkcmk&6d3HaG1gyg97o0y{>D{gEpi#%(GY0|Bg=CcY~;2g?QO+Z&(i)^P3 z!GhB)+l#`SIJ}9rS94oK-Z9=a9x8sWr8t|+IIoL#8f=nC#Su(M`1;SAW3PZ0zs-}i z&%DzvitHy%%4msKGnv#>aDS_k3ur?brmLDwFB&;YyTCyy;8IE0M%+OlYn5GR+=)nU z#N?M`Ndz|_8EQQfUan!)D=`!hCbnk%oimgSGd>|&_|bvGyOv0LB7(H_`C#ee_j}&-5}ue{xQdEi`(D_7o-BDmy|Jz8 zd+4jM3s(@guc7Lc6u#~r24MTmnf zn9rAg#!Q`BF49ql>W+&sIPkydt$!ON9@dpV)0=&9r?j*)?V2AjBL%BhbZv@<|FP55 zO8b1-aF;Wlzdz=bpTNabP)>kQnAYqdsrlfX4VXlPDHfARA@k;eiq(xp3i;ZAOml_j z6#t<^Nh**g(}X-k6f2#@f@CYkt{{#PO$u9pN{#~kL*d8?EVs1DBq*oKYo=s&<^nus z$0p}nzZ=*UT7Zub+!k%(x>w0A;H*LPAhX<_)W5~iroI2@?@Rz0F`n@&OO_Ho`EIq# z1MlfZZ-N=p-?qZ$JZx4flN|3MZ(s5QxUvDiYkU_0Pplbqv(-Y3jUwDIDoXq5(-oeC z8BKp5s3NajY`?*%=x8Ldmc57M7|>_!5y+mJ`WyOI_Vt-(OR>#~L9hv(3afTf!tbs{ zAJklTpH|dGJkr=zY-k^+4O06X9338Rb1l*MW-i85A+%%&b;i3{vC5bA3~qn zsg&t1r^*He8YF4omcpJMs;F`D5>W9XPS3f<^K17A!m#Eg znSTx@{zBh0t|F-ni#QQF!^(cA=^|>V@SxdjNk3CSk2gD2pw0Z9xrpule8|1aJ)4eC zJfEvtHyM+ZnBm4&>M-3GFstI@1eSBr;p0$kJEfkxNY*s1UA02|o0;|NRQtI*yN-zc z=p_S6v;)LieJteOKP6;*rHD7XZS{7{jzkOoIb_{Nlt*=BgA2j5N$|hXD%0@Xs>wxp z3~dk}{e@h+=9`79E^mjIw!)LtZf|*?FL^|teSVcXNOfFBO@2j^W13Cw%@%3QbO5h3 z$ar161@9OVke}bt ziXsc! ztIH|OzY|=?JLPfY^^O~h1^D&inWR(hQ1R=DDs5lW|4@SVUUR7~3b~-;kkm~hrSr+1 z-Q=??HcMg+40=33vC|bLQu_*sxOEj8cim z2at>thsYY!QjqEYF5Z2Py5r1r+%0U{Xl)eW^6x`2;YLXY;Ko%ob4^TH>VpvkQIVVe zGOGqE9NCAFr6-tO0(S3 z(LG%V9kCsMC$?oY9b?tbHdgUz_?;3!!tK(5G)6$z@!kajEAz#j&z{FC&1pq`#+@1( zb-@5iAF6706TOqV+~1w2`KAfl@h+hl2r*5+Aj2bM$V)sM@uAN}Djzt(`J888&)&_h z&7Qjwbi#*zNKnJHbFLZu@d)2}l=<4fFe!pb9~g8N>jd^koRw|xzi+julm9!g!cFQ= z2q8&i^y+L3??}qXoRj8jxXmE0fovh+XlGsxD9eh=`+Yl@X+L>*e&H(I2zW4?jbwy^$49r z0i`I)UX zB~bk#=5hLPt2y)8Y*UQzPO{0V%`D;j*-%PDXvCRMncd{1+f-pi3`GNYsY_;sjCby^ z27D^SyoNF6V&)QInC|dWMX09qe=)jLGJ=!*sqjX!u&}fllcFjTTD7>&MG18$bp-Cq zEnCE)q5$DY%YIr0#X6=oUnIU7WNrUptxZ1owfTU2)LJDVE9A4rU=0&_#U#Ervqzh- zqOhDbcuinkMbaMmg0d}`KsJFr${+EqzHP3(3TViB+-1{BV2(x& zabcGM9jB#~yULzdCE3O06j=wI2Ng}uO@3xJ&=*(7aS0C7e-1h2|H3y!cplY4^GI*Y zxgJ#j>!P=2l`c_COp9n(V)tE`;lwKz8!5psV^}&{0M2(FkysiKob+Z zQ15|^iSGsABbF@!xu)G-X&S~lT^L{sZ-o&_3mGc9op%|HC#;GEs|xN4ng)L>u{N(S zhuXW&qD;%&MQ!SHmP;@@5}h5+)Bd$u-Aw+&2pGX0(-2pz(p4*l&}Ol>9XJe?Qc&vy8M z)11Igi8pUSgPnF1;A^v@v(%YkkZPRR7W7kA^IAfH3VdSO{ZxSUT`r}0^i#`8XgF~m zit2tl?h-wKI1&bfFR{@^KrfW=W<%`LIA4-mBpEz1m)=K`S!#PqP46JwJIl#(mO1nL zb!vWF@#w|;Bj^r~9xg8iY1WuZoOvGQk166y8B9$qcDCRkyD=R~SqSdi*5leXb0WYt zW6e4t5#;dOd7m43d^Xkr1jWqVp%j`TB4(G*HK-LZRakb%?Z4kFDghxG%^!VF1?{l= z``d4oc><=Ia7a7s1Es$m;WTb~aTrcwXW-sw**;||NhoW z?wqdM7~8qAuW`pnHP3|Ti#$B0<|?EeN0ZCNA67KZmP)3*Dj-eIEOB`qw=d1U}|2xjp32T+JQsX&#LRj;xH2+6ubV8X++)K1pmH14gF1h}u6# zJAGrwc7wdLHM8Z##@8K4@uvLcseUfdpzU6>%ZhZF91y@!W1$so51*(MF!Jc^%e}jd zfzP{|$B)VbD%ZWx5P}pLKH#;+Y%mF{YVh`}@53$Ok6He;h(!&;MUH{ZkzT=R=>SHj2W)lq~0$S+be!3loRQX zeXFF}I+ezt$1;;ASbHUR*6HlnX~AfPnMVh*kv|s)6J85c`uQCf{V9f3d6VyUmfU5# zXuOi}i(u7*rT*ieGkxu#xt(L>#vUn|k8P==0bM%^HotYe(X`YnMQ3uQj}jBZfC`%C zk1%RO@LRvv5wYazpe+NVrX5@3CI*<4CFk}=x>CUfG@Ruq_9vd_!cav!+`vLfem_;b zxndJ3fOn>0+K4L4(H*?LR7NwY6DNsguGsWQ7{$XdXhIyFQVu^sTBKFNoufMPKH6j2 zB{sd!(U{m_+UGIzqQA!L#`a;1R1erEl58QQHe7LoAme{Lj4p1ygD5czFK`aVG#g#AcX^^Fi^53WZPm%_ zx*Oi@9*4m5tMewPAaF%7y5rlv2D_F4Uxp&=MxMM=iEL{{{}biwBH}#7#cwi5jA#6}E)1_{n#2A($ z>gjrSHdx_0NLimWje- z*yp1ZZKAAt^^w^O!dM>+$X1c>Tl*?M!%v|LpgFrn7x_XrF~3DIQcf@WP*aMx*INWJU-V2RN5U~IMJQ#Sx`L4v`XUZV(H!RAq0AeC_S;R zsToFbg_cNe&xJtRRdv=-96)BzRq_przSTa+I?1IMmrA#*x?aIxk4X5aN9Z_&(u)UR z46Ee=l(dTDZWcB1XH8h~So{;hG80(J+2M;o_uzx>CcZ*1a(;azF%Hts{B{0GB29){ z3-CVJ}=$Wy#T zllYWyq5cABAdivam}V;@23f(7C0OG$Pq?=!jk0XL1lhk$bZ^_$J+w8z2r)iO&fIph zy_{K$Y!xo#lFBHZE6od&Aqmmt!!C@16K03#+;aJatrh zViT^r*@$S6@NyE@XQ`B}C>^ zo!F7`AEgK!Wwzo~-gAGD&9etXDC5cM2{}hvj6UMjrYmW+r4GILBMmi?cBy9Itrely z)T$uPKYDRJ9z3!Ayx(%+Fp2>ZtlM9x3gi`bo-yA`!S627zIq zRN-NNI0ptHKi(4aj#fr9dILT!BttH8%J+>f*!vIV@w?-pAHx#%dg>oW$8X+)*Baky z4Xa4t?kftfBc}C72QS+F)*oNSpL%i-fmrN*37;;yaFK-KzxRn*Nhs&jcv?u|!SA_a zi{E@jr@f;^+F_?`Eh_aPhdu*in!Ltd9y zrAn%%^P6<)b;@VKuRFlaP&kM$m}vh)y2{+$c=cpSxVwdWN6xvc8nL%o(rV8xTxw`@ zQ0gOh4p*)cYmZ@UJK_Kg`yTE@z?~d-!~CrCuyrL{(HMRnk3AN0bypxc^Sr}|1l07C zii3u-#0Z>OT}M*bZOBh`mh$_4&OF%qXYU$}5Lfxq{g&IZ&T#WPpHbduo6G4t%i zC(<|LiY;Y(9MR|ocuV{f%D~x-?^ckXN`IvbhkVeZ9KXf8={7n5K*z}j9%n6#vFcD~ zCH+G@LYQV3pxLa7#FX54Eivq>6}ZW`(Q%*jUlOo3cyUltO9o{q|KB${{ybkA1x#e}eY=H5|Qk+)|-lFsdq3dmHnhd;gE&)qQ+N z-5nHs4jBH)O0fx(?2}BYHV;-V-#f_GRI%FoFC5PYlsN!9Sd7`aG1tHyb~atE!8(Re ztbjPlI45whHU-+6$j9>WI)(xWigd;&U9nJdDD4C&E1DCHsL*yO>-{Et8y@B^2!8_GnHj63L4By+vQ9YEU~81b1G`lZS%9&| zUxhujU)<(@LWsZ->|LqVbpP>kKFIs5PODoc7ofJ+>maAB_Hz&Z5x-mjIJ_}tfLvAO z2yTT6nhQNIjW*mH6@Eejbw_yHh#B8gcq#NbYe|3`qD8C^;Nc!>%pV;7h+>v)@971Rm>6YY#PQ!!L}AU5l(tzA z=VO;0uI`dTWZ4EM+*!(!#G}HuJOj$TS66C%<#&!>b;rj&PjI))l1Hg=o|wWDwf&{^ zPV5)RLNrQZ=mSXG?y`jwibjlLlF#OqckvNIS?t6gBs%iBH%iDoser&?g*4JBsvPhA z_d{#?dqUmV2H1}xQ_6;FdUk~V_AV+ zBh;aMeIPBSrqV&q{Fwkr!c7}yJD7ctnQP6@P!S9$$Li$Kp$8JbpMUTzR@%$J{)rlQ z>uT%}Z=nX0O|g>D@3s$jx~f2XElYF*9FRQ+%t#og%5)}83Rsx1=dZK(Zt4s_`~LGJ zTHzb|4#SMCj}gW^2zakZMp=NrB3t)_R^J7nyHqt%w}&@lmkHpbF=I6lozCAnd+v;P zHTYy;#r)F^W^U5EgSBR=+osuG4!Ez7Ejcob5XFKfI2k4XdHUZ(EEjE=AiY@?c@BN#zB~5yz5h3eC&5i2oLj$?0zRPpiO`ka-k+6MRzBd_mr8Z1W9o*GdVvU?WXqnVFE7K6~&CsSITl z(=iMu&h*v9m5yGZBG@o>o+`l?u7_pwOs9j)8|Hbr`qx{2qfw7^{A}%@;HlO6q0eMgP1$WLjyfmo)~lCEu~~Ge^6axij_T9EP2>CUrom;Jo40 zxU5OQ;eUV8`SW&81r5+teUbHPNm10?jl9WYrh*X~RL(~3_ZM1}i#wOlTd7rKE)7nS zqOi-c8YBO~>F4IU9%p+^XAJxG$D`mXUb;?)kLWhKTRnkVHsWI456EtOP z{ROUcp`V|LU}D2M96wblw;A{jj?}-AfTxU%l9n#&7&B$HQX79)As9e9>A-ko!?;6s zE+xgoc|3@E32=%0|5};=6MW*?0VoTCe|>(p_&4}meP4RHU>};_mly&zd2K7+jJouD zr_;{Kk3;$0T1n$cw)gH%L>K@`Hdky@yh>N-y}sa3NEQA;ERqM)w}8+$Z5SN~DMQ3z zi=D8lYtq}mJu)Pj->Fm-Gad+d`Ug!K)umh0;e?5Xx5xI{n4sL&Hv$%peH~#Dm zd3e`?5j>!b>N`5-DB*jfX#3?bw#0_KM@H<*o&M;bpLvW0tHgJk{8R zx`#vFmY5suWMTyZ>-&Hu=lDCD+(anW#!gxER z$}I?XNua&5e_X)~g}NRnLijW!w>SyHX~BGKo+m&!u4xuM4C$ft#ZGQr)$rq8?Vk1*_VIY;di>}xNCBL-{m}+nJMvmn)jBC(vp27e@x2}U8=rR#>04vG(C0MX^Q+pVS9ZIV?_;@NCTsh zkL2+nGgs+M)uq$A4qwt7p@pA9E?~$JY!mb})Wx#RTf}d6lks?Ea@0{v8HRGGp6zO2 zP2|+2GRGl+~-de ztKhO5-dRRZ_s?9wf8rzoK+HuirSX?WEpL>!eQVxh|IqT6G z(ir>~og&39Qf(HHkL7ZjJqS_W=1yb0OueACQEOMF@SzOE=Xj14tYhWM`>N=xn}ftc z#R&OJEQ1IXB=ljMLb|k}%HQrd(_;ep4W%ViWSa$dba=Dr8Q#Vp3IGlO149xr@;$KI|GZC0FCX9P7 zc6N57-eGBqaH}KFVWMy}A)mRGdl#3hxWK$}YpTC^VtwlX^9RZbj{Qj#at<}n-@g%W z>w6A-MciPqK-% zShs$K4Uo#uR^@R`6+di5xs=c)?S`Nx)k`&bO8{AT(wGtYp}(@u(LGLiw->ju0n#$) zZmxTLD|?LvhntPVa$w%AcBHCHlk*(?yws#>fX!M@l0wUj!5F#BBZ6IbgI9+Wp@s_( zaJct{Auy22d1(<5zyV&%8N9mCFeYv(3>L;@r5N8gT#7b-@D(YM{wdki zMLX8&@|8FSE&KXskhYMY0H=ILc}}H&j{a#y0Ty}MX4R(s55<~s_pXodc;%y2+3cy& zASQIgzfxdQL82kv33@pk5Y>h#&5{vN*+uWli;{i>iNgpbS_1qyk?a_Rhr`84<$wR` zGK#&|RMuuckN&l~<7I0yofMVEYrF|c>86|}t8ERGN>`4N*yCYV0NX*}M-{VKv>*~_ z-6V`s_K=7_*of3L;y2WX@We7HoARi2#+)aU*2KbShQ>gx$OaZS$u~>5g(Az#a%JuI z`rl=GCIq1$P|XzRt=LD8au?1?%?T}Dh&Eq0Ux{m7GVjis`7d3I<)i2k9hD)CeI46* zg^c9`-BC-H>Fg6Cn2c9qCUlcx2jup?iSuu1ExKt>gOWTSBamAo`myu+gIO1ZyhlWi z!{Q8*XQ+I7;tLM-Ieq9lL=oPvB9BKy0A-13j>)295o9nusPzgw36?loN}&wqEw-N~ zF-8QX1}k-0y2+9nNvBVi1I52H1VXoh8{v%3o)YK`rBi^||+zbQ^$>U>KvBj}+6E>An}#*1r5 zX(Vbbw>Z>Uws7YkWS(b0tcupfLC^yvg_pN%khCv4;y;@oj<-I4!jGBxI1bdHj|CJ< z!}S$OKc9B5*>aR|PQ6YbF8EeVJv_jIOB|7W#&-h`-kT0Hx2A|?!XN3{6{sVPJ`Uk$ z0+L_Z%6)wtmOF~rV~>z1&07j8)a#(m+0!w?v7vG$-2iq>V%s|lPA@tv?2Ua(QxTC)`22}a6 zq5|eI*mxoBr7+U%;?GJfjeNW;dH0DhyC@@6lfaGSJo5v7rbNJ*U;4dbQ~g|+V!09M zn{lXjGswjLhyN(-rQyBO(``oQtc~LUBoVb2S={|VH^+d`ixDxDGJ)u~@c~bgS%`*H zlCu&|7ain$f8FH~u>S=X62c8fWqcI%=KUGwuged$g&_C8%@RIEM}ju~^pd8So17p51?HoxR} zpo0ZOK_y9|0I+U&3-@8F;9EjZ>XC1`s1hq#Ue$pw-*vW25EL6c<#`Yf-uShqn5GHp z2DXWgHd8~cR`|x=2f=b#U4qJYLX$u8iSWNu_aUpjWt|Jyu&rwPTNrxKeiZgn3i5^u zzsi*1CeY(Xut-md)clK*YV!N;)EGjGEzccG!gtMdn{wi<#vMs?Sxnz9r#(Y>>J3wd zJfA;H=|EvbAdJJaj@2lImau=p{-I!E4~7FSGr9&mz;hDXMbYxm)W^3Ig3(F~0z1ff z+fe#eGQ68vTXG`gWAE>h8A33i-*NazfOyj7qnO}7wbOcjpjI8nNdAdZk&A|l72A0c z7mxS!O_b?aOETo$#0+|c1w~_c1Mq;5oY@x6PO(z^Zynxd>SqQb&dEmT#&<_1BkiWL z{ArZoe@}B93&kE5K2`(v0--+H;6kb!7_Y#F@$7AQ2bkeLgf+C2QMECRqj48u`uCmt zLGV{p9`NB&DKwm8so@fx`RDD^)B;cO*|z1|BOC1*_f8TFxUe554>(Izh)w``9*PD% zk&Y!PrL(TY7hxo$xDbHTcN8Kl7qJb0X>R!a!*gfyrNc7DjsMsF<$rL;Cq~2e+jK3& zJ9F7R=HDlxFs>1>&7@_?VI5)R7;&7aFAK)Ed>xjiPi*CVz|k@n3(r5jU_LCOEc_nG zhINGC-;F3%t93hs_elTmEe{3QxhF7)@LBJ`#Z)SNsa+PfTXT%=1Rn#T5Jg&8ZAUdj z7RpL$FoRc*WYW}sj|A{xOS}D*jD(yb=_m~6SoQ$1zKWx7=Q=oLi}RQ{yLpta4-19P z?R!x7G^BmT^^^5e9~NxG?hS5)hw^8bMrmB;;%ziyG?=qcxe!DLCrzo zj9rIG8l?AEtK)h23iv-Z$6AMD)oLgj2#qq|>fkf;n4%$62*~3l6szue2SL8%fK^(8 zon<+09tLv0$k&+_R&^~~5=J#uZPdpZ&djPl8~qdXrD+SH2&fBzV3Bx-eomw*St)Zm zAPg=D!V1sBj@IQStcAXETj;c(@(jXA2wMEBx7|LiKmLZ{hMmIX`(QcAJs``VZa7(n z9Fa3lLPr)y;mV2R_84&MsAEmtmGp>V&WJAqQt`;}Q^MKtzxbIHM{=g>XUkr(rSfCI zbQse%(1ratx6q^`c)FmMxZ|oyM#30zTw;`Q3$0=G*{8mR45RRJz=dw(H zGVi#8@RkKg_!pdX3aV+{V%1hkz8mpQS&zM$k4zCX-_NOaP5^Q=#jr*Sf7NT_+8Of} zx*`87iv^Sd??oC4-Q4~PtFujsIVNXkg0R$@q9azNjMzMk)qM|lL zCdL_l5mknL&Zpy3&3{`-k9lYoFu?C^{7mI@Q}X|hYq4%>u;}6(Fr_SinI2a82OVDf zeX0EhcPp9nD(3399%!S9DU5$KAnwDS+stpkFns=}ZbDk4@^05`zkKlrVxKj%{)0UY zFCuDY5#Lr@xRe(uHq%4BfX+~U}eJCLJ?1l`}1Z=Eol zb>*Hk>43vFUpn_oL}}gYCyFZUQo@x2`?QYM!)_>#6-mr378((*sPoTu4%csF!rRXams9KqhkN9bJU6^t zup^~DDey3b}y@KZ(h88PxUlx zNx+6KiQiaD8pv99PL(f=VU*@up0^^qc3CG`iz~Pe6U6vybem+hz`bp>E`gy$#K1N2 z2zuCn-uT{l*82BP!yiAD$Fz$GguuVCL7)cjxTj5x5X3rSZVUN_SlP!R?ZI3KHs%&0 zE`sh2Y|b8Cn8Ke$EI(3d{)%Ep14f5b5*tb44Oe?fKZTq%P%diz@X8Z=`*k&&TeZ2) zl_iXgg92OVhu-$|UF~YJ!hC*tvClNYcU2~YxA+tLBbl5ENxdJ5jC(f=R`?i=7qfAC zt09T}m+kwn4#EKpEoSvuhM%63zmlYc4sTy7K&+@W^_`_c%Kut<5G0Mwe&jS9(!yZZiar@c2B6rN^Z6 zu6&6ANO?Ri>G&W5{e@}!4ktao?O0ZQ!4)olyR_yHZvA5`%AWh|KXE3PAbyOPif(@h z3^IQ2AttdiXpVT0DJZEdCF}f4HG4S%lj0PkaxK3mVf;LF8J})DX&ve|%LOc*fH}gS zYOk>8HMTHL6vQQ~frtY9ySFe`P6*D4Hz-9phozT4P(zjsFNm)5gUO7M;V~%AO~?rz zT)!nX`I+sWN|gD`lcHTK#r~tc{2>e7qTVb{(wJxzSWa*#j4$M%3MPJhc^o`8+ILa$ z#8ZrDOf=|ew?e)JZ+6_1bcgCmUIvYiW{tyaYj^Rv$PV1x2EzeL8a+j!B$!UDpBQeo zPB)!}ah6~ZEu;e~BHxD+6&X$ybODhoEdoWv<~wKOh%&U7j4UZm;k7B=;`a%SMURwn zYDLQFZj*6w%_Fu+=n!7o_&K`m`4YBywXOf_h&}L$w{E>0vB;b0DpLE;xzL=PtS+v|OYr3T6e9T1xOmYP#qM5CUjN2_P56BJ%mJj!xyCAm%+t;m`e)24C`B zVyxo&N{mMMoy8RAePFr?|G}g6`jET|Xp%EouAF7Y# z7VT}VRgyv}CQWNOfp0ZNx7YI$jRuiW#5Uz*D04>2Db@LPe9jla3rJ}z8q;h32`lInJgR+y$*@2@uTV(5nZ>%TJdPN_1WKIsmJAUm=4QJ z+j}Zb0&c``Qbq%0GlO$VeC|v0Z&6&~Y~4sYEf1ai8HZtjY^2Zzgfp0r8H~mDa{E;U zAAci~@gIaS+F=@C{5M+4Ft;5cweBcXV#!|rBEqJKMeJdS*twd-I)Q=`AA@ldTA(dn zS>8?bfPcNh@e;VTwk_o0)Z&hTnY;bN5bg_R9kzP_jvJYhrdKfu9KAy z(d=_+c%X_iO<$I^3$rx?5E&qrc$q#=c?B@B!#r9j_32 zi%BO!97s$CwQw|yB`(3L2+^}LRVQm#M{yoVx)?~iH$YQz3I1;o5faBCh5`|ELvyL` zP-2I4_k7lr(ErFd`*xpi48kBW1k|U^9ha_y9`zv1f*E5R3EOx6Fisa^;F=J&*4OZ>l@1HxtG_E5zmr4(J~ ztnG~76igw{Pigef8@R;sabYx9LQLW3$)Q~zevKZf%*P3)%Ja6@ti!|q6=lNj^UNo4 zGzdf{x!Y`Pbsgj%I8~l;+40(ftz2_=Ew6tL?!;n;gsLxhlS>aj1?NT6vk^q(=w z1?uZ*L1#%!3n3hNHGy-%?5T2fTgleo2VC4HH&3E_Ewm&7FgmSuB;Pj|1LX$44O7GG z_|$og2#t}3hw=ThIeS+|orl4_hS`oQAER0`X#=Pim2F&8v4+o5F8Qm#-H8^$2GyP_&L*hz#F zEQ$(uwQU&3k9H8w>)*8~s#m=a=2t zJ-m(2)xiJl0x*fV9hMzfMH?X44#4tP$~`4iMA^K)GF}(N=8rsnTBj+ z{`V6_({*BUa1(YDI70bN=z$nb^&c;2lJT$lM?yj|nu)4+Qt&zZ>2@cily?v~YJ_j* z9$?c{u&7bn49ra;qn`UwBwOPRYT8zL;AG@B5W-S+J{q5uRG zSC(>@uDAE`lmD>BGol6}h}`~KR7?ZQH>Dryn0sK*uolvl*W|*q6rS?^ttN+_?cF9Z zhE*jSED~v=Hm6#N%uG=B$pLeOC1_DT`R;I?PfV#sT%t3<4R8lPxEu+K2qgH3o0;cT z7$m;OqN_P}V}{|-l)(hC;3PZJ>Oub;-VA!lVg?d**jnljl zZ=Un0T3UUiV?0d34L9gto~`Kx|5~>07sJ;`SG-M$t6Tv1mH4VV`~0-@yo*RU$7iq( zIS=DRIW60p&Qi+)U$YCVJQb#0@T67*BF!F~SSJJG$5X6AHoTa0OQ6agYI2w$ox@n7 z+y4nz)$P|PbYQa|(9?UqED8rIzQNVO0ZMrXRIK&RuuTQwW`FI?h4Q%~zTQ z3=PFMDJ~PJC$`fz8Mf6*)AloVO^D{krep|Zc~+O!Dfm&*rzgZCUGqB$)LPd;UB@q& zzfP@6V$o|ZlRKB@mgvNI@PA--l|9Bk8^01u1YzO;rPRXC$3;v0ag(Z|0IY8#ux;~@ zGDz*=9#9V?cD&k2Uke^yQ363SM^UsB|Njc41L_q= zS3P&gmz9W1?_f`M5(Rf37$csNCnlr9DR~-Iww8Iuf?UZTkddw!S)X8@7QH&@MtTW* ze975XzlY}@NeucpQm^~b_#&|~^wEoYdjU6U7&IeEWHw@bts(m*iCfy?i zi>B5Ya*roZeCv&0_TWDiILzs{gyR5K#1H*V;UozV6j<9j>{`uoD5;BhZ5(C8vK2f8 zH-sCCmQ19_67sE?*u+~zs8>;%VO4AEoJ|D$rj0awt&@@*HUFEC@ChW0qZWsTyIV}d zvHFUzSQM5{FtG4>3>}+-w2%^$gdny?G}l8^sSZYH2n7kemB%47ex!%kZNeS$sf9yE zHKc%#n}5TJnZ5e54dj@mz5nAbiTeKSKze~BpiT`Hr(=Jvcgc5Q(Q^~kOfryI;_r>#$Qak5L)yN-Y+7U7_Z%w3!#CUg^*U{Y ztw&WThZArH-vt8%b;BA5Wn;{b=}^$7tu~o@`r>}O``7&@8RD;yfEKOeG_e(?f#MJ> zI$Nc>-W#aati%^wlzez0MLS?9soySfSgLG>5MZ#P+l4`6Z(oR0KO6+dg;I2gHNzjV zkGu8L%~D$?bV2=6!&3pH%&r2&zjZt~Nq0PRozqKmZ6m(tE&9?+Tk-x@xVbXTaTw)B zaYqTdnf=66QkIfMJ;i?|Np&kt8~Qa7Fp|LfF&+-GFS{XDN=jt)fjA!#_nUHqTI5MD zb^mx;Vux^;HJdTtrFGYM3Ehv$T^PQ?8u3r+l;4ZuZF}y>a2V6^)R4~*;kGbdYP0Ng zkTpo1i`~GmAEp~tpev8*U%$4zQ!~E6ZVAM{#CQZ{uB?< zt-;1oll}z+@0vYW<8=&;@lU)S#2alvuw(>T^8;2nt?kOyZRKE%1sC~vKo>^^a5}D% zyKxD8arGdf98xeCp9?KC$AqOzw*dU*V*g&S800ot++h=t1YCuPu%z;}E)XjfN@_=I{-`*1ykR88bY zP;J65_HeC2=Wl;?qDNsmQekQS`^PWQ8J7WzgTmaMCJFE_&l5V%(5FMWZlWgRq zLAEvvj=15@-#d2JrzgxL?KKt!zuVRC@^tB@8d)#n&)vrD=#fHsTAauq=OYwb^Tz51 z44Di#SI-YsX+7??6oQ#`@(@MWTTDeOp_3C!G3ZJ=HT;l@a|S@P>QYg?qw-cr^I1ud zxdV>g30t?Kl#{?cZCs`R)P-gG-(gL$(et@gA*LbfZ+O4_J7WKFiDUDZi$gnLY{@A{ zPf_89mLGiC>wQa|QI^Id8FDn_1=>6%cB=OkT}%#8l1LNk#R)x?K}^#x-Swg|adGf^ z#vW7Gb0k6gxWV9t&p@_P?2>8Me*S0k#=F@3>RtZ(Wm@qX{)B!9iR&AjWaz(IvirV9 zWQ|$q89~{UEVe&HXB~D&56{At62iq%RB@H&bg2anoSCamRtg@W^!pS>$a2|--*C9O zZjc{vTCD|W?6#kOtRwr$(C zDrUvD?d0Y^=iGa4TMzqXxAnB$z?eIG|wI}oz^BQezH76 zyS?pP4Xo5C<01CCD1K#)jzQXAKuvCGaM0RQ#Nv`(JHIjTiG79xj+C*t{q3FUbBGDZ7S4k>Yn#Yq4sW)0%hXo#yk;PH-!Z~ z1M8oMc+7A6O=;c?RE(oA`z{m}W#!@F0I@wfAOq$gQ}X9Crn9haOB3qqY?L z@dT{^6$Fk5U3b4?uAnKJ9QpuQ7^>fgtVx@1c&SFUv&}%Y_n}a{LY2Y1OBsz)dQ&jy zW%_qa$DcW@xqETL90ieAtB?9AbmUaVd1CHLo+VyiH!CHZM8Y}}+$FHvZfQ?n`eCOn z?hYUNNro#fw2e5@l%I!Q@@C@h!`5wUDhm{gZb@e;(k)Z5(Cwn-On%0jxR3ln9gASz zosqX5<&Kk5)z%-R46K{^D}}4Yq$7lHDHTvFB>NH22p>6S`WiiKnN-ts#DBrji!EV( z(Qh}45-MK6MA-a$SWwi+{Llp65{S(HBS}^rJFISrC^ZUXoE|-*P;mC1Mrci*iW*jY zvUuOOO@B2wzW8dA*QFx7%Vx@w3bnhd@b*#hsTi>>L&i4RZF3Tp5kw3!xuP$I zQzr?F&G^0n-6}tS7AVzcTSQ=4whyrXdag9LkTQDdBlus91V;z}qz|SI2M?`Pc{H9T zVX;uq(PC)4;`nMN>2WAXJsd;@N|+WA+@4eyA{0Ve&?PbrOJcE1Dku9i_1lX^;Kt!{ zxz6|>SzDC}1E1I9ipk*s5+BRf^Dz6wWCr`iiYwyR9p6_&T4pB8*2krbv}}yvACWYv z;rC-PKBkI_ipP$xKb(l-Pc{W1H`$Mlj2ykY{iJaL_5enqzXKzjqe38eA(u9bj+z{}Ij@42wF%sPl zd;svmtNMQUExa2P-X<8Cn^;E%$MKyVeZJiLK3=hNB9G*1?* zL&wkIxpW*w^pAa$KZhP)2N}iXkV{EzsGEQn7Rz#bgIQ&4#%nO z`P*p0?TDsGfz@`Q=F35n@&A?d09KV6uO-2HY#1Nsu46vTe)A^f0%H9;>bEE;9Qm>pS6 zYCtWR|Ea5l7)^tyzMM6oYLFdp#UYO@e=vG$re(&(LbsU|Fr|h%9d{4ir9fj)*((oP zFdUyLPFKbkh$pf@`b#ICB(YN$D=w9QqRDwOg0En_OF})Il1C?#@fhkp&2w;ku3#uw zn(P?cvVNO0+Gy4;p$71^_OcCPKh}7dWA;FV?39|3DYW%snr9Pq#Basndz1Q}P^p8| z5+?)J&*=1LPpZ2^gPhJgUN+MU6Vcm>tDCC8dJnYkXjjl|B(6@hDd)_n28YuBN;tG@7Ok+^ zJ+E8o7@tN#ak8i0XKO2^p~ldM_+P=B+c#ev4=S%zLH>zFK}*J#yz?J(#uXSC`C z8po3&!Z*etb8dYp5%o6taxR-0OMY48B95OPoH42`gz@lyd#br8oW6+IJ0{XHISL7? zT@FQ=FXKB<(IrEK;`O`*^d_0ABGOm9^D!16f2IKm<@nbRwzMe-8pS-W05T_3Y*4Hy%#$>(i&;O};s%dMpQB%X7 zQ2V~Vy-BO67$rgfSZ^-<NN zG`S#vb{m63IK<8i>>&P^Y8j|^5O>Q(-ed-e|CW3^6q4sImkQLGjZ-X58ghA8%>4XH5hrof-(loNDFg6MS6{GWKWt?mm>s5MW$+t zF+F`MaLf{V$;<6;;|3sZ7e(lzTTPkohY;nYd2U8j)5L?A$LNt-rJ=Szp`&F3pR%!Pc? z=dI!Et@ivF3VjwRc~YVWZhqf+?1El2kgjubSJB7}r6%$qAU0r%ND`l&dN4 zGo+kFs;lyEl|tor+;X4}J(=ts>Ra?5OX6kS(aOXA7^BRDi5H_|NnQaCrlu$aTT7BO zN&3wE%maF8A&txSm!5eKh;GNkQ&ywlx%`GF5|1}?1Gb*SWnO9$J8j?gg~xra*MSCO z0MXxV=nRGSFkoHEL<4PPw)VA4-QV>Y{BBu~3bBf{B{c}c7JcY6A4LnBA~U6r97g1e zvr|arC;p8FlqMg-M!ZaRz|Q%NjL!OH$_C@t<^S9xzhOT>fUcS7umH`F9_C6N{&Cl5 zD>8ZzH#O&v4;`X*o5%CYg9n*obnDS2f6aT%xTjSG*K#35MQyOE0a469MX8DTdiGlx zM*J{nBUyE1?%eMmmAnDa*WWbbn%uRo`w~9Zo{zO2t(i6xJJjIJj`6DH3hC~Wh%r!f zqpU1pY#>vyuci}EIP{NAJn*&fMi5|NI1xHLKL8G4{@!e;i)zm&gl%xP=?U4oIJJLz ztnGR?{8_S*01W;;nhJm1ipn1xKc(Z%ej|*jXT3k7HM{#-^<@~12e0_)HTLDb$J>xC znO(|5Hp5H_|Al%vB&k3vczKbQ`AL7X5*jn-A@8?WNgJ!G@k?~Qy$;H2pxG>mj?d?~ zln<|gwbw;*{&iB!&0m#CF~0ZS`$(iz6JuvsM3hMb1$;>grTG5fc4Rv~LXxvXW9xs`x;dj7?joU;L)aGsmH3G}_NV zaQ3qfJjqj`3v~@UVqe=-oJ1FhkBZFhBxSMmSbOTOHGRD+`Jc%`gqpE*y5<$N3aIXn zjRBr*5eki{UU(ScD9L`eq^I6H{3sR}&Zl&Zczro$6aD7+>&Z-}VLUap<%;_>$ne-` zz*HZTR;}8;Ux#&(1j17v=8U6V5)jB!kiv6gQ|D#Eh`qn&+CmRjJHd!7CR~ZNYX`)` zS{_msiJ(|AX?CG3Xl1x#3DljQb3Kzzv%&XseKdj{&}|!t1}LWdg+rL9d6%^Jis0Aq zZlCdz*Zn;QHwm}g;fS}o_kV6OOA4mEE@tAq9M=9e{Q}XeoF4s`oGzQD%z1k-j->++ z{9>$Rl5<6L-f5r5|0l~W75nA`QYdsy zu5O-+wS$s1H!#O4i4~Q267I|U+s3NcFUBi&6s$?OM3mTOp}GG%vxnYDw6_y|HIjW8 z@f(-Od06hww-9#p($U$o0m)DyOsEMV{z>(xp1uf$lcBmBMCwV*-%iR5u-larr3~>Bg&zu7x722|#V7~S zO^AH@6-=R9<~K5hv2&VlU%$9R3=nd&)sbNZGVvy$g8q{n+EO-lT$4Qv=(m~F3@&2kfJQ*-!c6FNR zeAtvuI5%StV7hg=ccCIy8-9vzZF{QnC>D_zdvo`>ji4}gGah;$`Fh|>?f&~wKYE#7 z}j&_e)x5JWz=h-(1X7IX$+F$ zC4EN{cV2|LexPXmGV1)!9Io6%xB(3wXaTjz%> zwBrn)0|t1usw(Yc9pM+el!xiYiKzfYTs{^JSdu&_gE`|UAo!W0p{F{33|Xc_no-NT zvx490BT~eIB)V))w|n-K_p!(=vByEU`;ey6*fykO5DKY8tmzEv0I5MZ2vk|D5b#KH z!dKN8?QvKBpa1D=W`hSg__|?*!Dwdu(t^Pqx+~jPp0SSQjD^}|N;hxA5S-3-BQ}|2 zhbWTOeiJ-eo3J0Q0x=L}uCXkW5Q#-~Y}RLLmblQ7xr zyeVly6ndKrFvQO~%}bGbT>Za#0>*c$SI&pv82;CUno{ik(n+|Wg}+e={XeGzZXEs~KVqYx6o-M4V;Plc7w%tVOO$P# zf?rVK5_Oe`T*Pn?5(2g^*!&xkNTRu-nW3>(d0$aJ>{M#sg}W09V7-S7#?h*;hLE|3 zJ063GulWgT!*6Fg6RIj@ct}?ZC5r&-4R^{!ps~aUuroU{n_Uscu ztF?z#c*R$Snn*RI;rN34@Q29WeUYxwpm0ycc(Ac@sa(gWKof6Q>`RS*WyDSV!$z-% zvOt5T;CA`1HAt#kVE39P&$64&E4DllF@Uh8FzvU?nQP^H`-l1?nm0B%gwsiTFYF?(1>6m-)XT8i zOeFQqEe3e5br70@R=!^?5j)?aO42qAc9P1ps=B=&&P@>~G%fc=+?7J*ZrW-FfcecY z(=!@Q$aWBK5URarWTQ$pmdq%-1$JX0`azW)PvUrbzo2pr(KYbg$FYf$vuloakR-8$ z^T(*taEHzm4Gzd5D6Hs}=<5891;oC?HY*p;yUs&q4TT5HbSHZ0;VedO&iOq3@7Biw zrMW7rphR?#d!=tx!LA>}u)1mZ;C^gT5IA)c?&vm@|0(*n?7-!I;<(m@bno1#Sz6)S z5K?bUyJn|-b%5{`M-kEYwzl>8xHJ2-<+JsEvGrN?GQjsfFc9iNc>Vc#^|kr_e#FP_ zb4%f4k8Rh})n)bhTJyE~T>8x>&wB196>TJJEDKZhfWx`<*R-};ZAEq~t8oqp0gXI1 zm;FZaosaw_b4QlncfQK**Em;CPc zHrJ463p6p%w)Vi?affgHCMYK_bI9lpwm|YwrZBMN`V#uPOPN8*(KLpY2+tzBMS&%0 z9vXH64RE2sXjwoxQZ*nwO(aNSaX^jt*I4h(oc9nTZ$ z;|4&+r?qifYlhY)n$em5D6q{=>!DpgY=n102IIMw(LekM*2fQ~qfTX*D(KBt8HAI+ zX-q0beEl@7U+hm|A}J6i+of1aM7H!cLxM7z+b`b!bV8!OEblwzRSV-nnZ-kMJXM6L zec={TjOE{O4wD5QMC`yNah;>hvCZ|!`(c3Xj01)o@?&JfO{#TFtW1vy9Z)39m!ys+ z_zel~R+nUkqX`ay@W>mi@%yGwkZzd-gzcCFKQQ(1IJYIGvW#S}vh5uRb4=JWo!0l5 zQF5;{8AmhQNR0RH6)nFewQ#>Ac^vrvw6Z$J-i82m0UO~?+T}-&FYW(@Ngg$r$l$EYHyg;pL-bqXSgIe&a`dith z$$W-}%XI9Ls(i3I{BQGH8O?B-Kn~N@Uu}5!F|%4Gz;R;nV0Pv`H2=P)ab#Wux| zAdw5@2jCS*xwSAf2t{Jh^2qHRHK|QLeHeDzLkzcf9vSZeqznvXf?y)v6_`q&zFu$G zVqcS&Hp7G|6k4WOM4ofugd#nCnyzVTS<<#M^BBpuk7{N-`T_ZFdGKQJpX0=TKM(zW z-eU*}f-Q}pyy{1%ag~KOUw|6CXh%X(oj)MvWuP)6l9e0m`_OX3$?WK+t14q;O?ob+S%EaeviB=;wAjrqwuZj4gP&+OcfMkX1S0-7Cvt2LLyle&r#U~^ zBy`+QC|LSe*w}*@h@-H$x1d0&$i~K)&j5dH11_wl4!o2rnkVZc2GLw!W0(C}xO@=L7%*yZUO)ME0hekb$L-t= zUHh#JP(BIhL$Gl@pwFsIe3u&*fbNQnf}b%b~RybL1xteGRiOnGK(II-Amu9 zlW@>ipxg&(i-7h2N-R47BEnUn$&g#vW12>l@i7ye^2z+U*FZox<5*k(aPZEGabrw_ z!ex~Im0KUsp8;|Vryiy~QG5Asa%+JgG6XKM@YS0cNA;=hMLl9|_q~xTM}k*MazyH{ z3kDx2UkfkrVZ>&$d@M@0=#U75)PN`8Rv<=nJFNj{z ze_eCr)N`Gy&NLh}m>$7X@H!E3YjCf`vo+lk881@SE?zEM8s++0qc!ho6%dz5hK9Bz zQ0i}KZ{UyM3@u~3U{i{zlpN!!}&A*$?-Y$`@ksemenE= zJperD$A1Lvre%h#fRZeg)XqgX-|u=_vDe3c(4NsVwM$y}_2HY~7bpxo4|V#Fn=)XRiKR)yq$A2}hKACHS=lgIIek1hhd_ zSml3v6aKX$Wk>q0sUkZCH;S_Kw{Mjr<-}Y9??3Lzvv7B+qMrXy4s%Ilo<=u|+2Kz4 zma&b-qW=Qsg}RIFoSpjnveA{2!k5M*9fh`=5DOy22F+NiBNC#M?|Q=9^(yF34}nB7 zAq;T#coC7Q|BID|!1lT;%HJqso`Q^SJ!&M5lY7pUawipH49B%t=h^Q1#lH0`CJ4(a zJ$Vmq*gyBJ9cR8+T{nI}$%xfj z=6@6hC(JPfB8wC7Bbw?RKilPJMN@b4kS)j&%^^i3B$6_^6=8rEZ(^|i_~Vf~q9!S# z@2<0wJ#Mgvy}8B+P`a3>-kWH^_j#$DHOh<9BBfhh)l7kq=qqxR15?cSm+G73ffh1n zj-vLPR|994UV3OJ7CM>edt{_9<3@p6{m-KyGuhzI#O-SKVz#Q;o+EGih{~1pjd&tH zvt6DbPO^}{m5WE<@-6x;Ld9f3IB`-jNlc~4Bql@F+5`TvFt(({Sv;p`9j7U9*a=PS zU~FBQgP@rkj2s5N2RM|A9Z8Ij_c)Eqr4S+KKa(YI>%dB|-LFFvyP#>8i&~BOcAz=a z8AA%blbdZpoO^Dj+S#jLcjUJBFRrf^-=)65%ql7Hb74Cret0zWvOYX#RdLrCGnOQF z!*Nk1u;3R${CR{w<4?5cnJF;|{v(w03`H>DaZ)hnFFVU*`wBPL=eJ!5_5aDQb7eSv z_h`hKvP23i%ANkq=xr&;p|C-f)mM?=x#Ql~EG~>J)@O~1+WkP;P{_qIEt5rZJZ!2A z=uzqQBav)83OxWpe%34X$Un{NdCBOho4xmhoV)yPw=mq@-5o;lJ^P(pCO6Xdn<6#- z7rWB0;Rpnd+}498SGWtc&AE_wRGSYVp&H0oTrZcEBEs%rVc~FHRt-9Rk{!8( zJ*AAT&?%i zHOnvoW8AAi@P6bgX!=Q)cC@81KS1(D`?CA!dISO<_|#zX_zYHe$QY$r>qsR0IY*}W zW)lhvv^w@m!{Uc3PWxk@{WgeiU0OXM0@RJgTBqP_@wD*Uj4{*>K3&1g^n!?p>aH8I zz>oMoGhq$t9ZtG(UEwVHPjz`bzBa?0^w3d2+ki6FloF&4(_s&=LpS==1c8 zPrtRcGu7lQwTYe*y(t8d72`e!v-2(V58E=iQafz9iDAEQ`hhMyVAN2c1b_vH>FDni z-L<7rcpGB8#)YeEtW{_y@^pveDPTJK5%4vnJz(>x7j>m}1HSxREid(C!E^yH}hksIFxVK59+tdBmC3r0;Prqno)gy~j; zHBR<81&%+yIzAa%m`Z^o)*b$L{e86fhD}9HTs!sou}m2CDjdv6|KWVG%42{Vwp*^CjYemRgwy=Apm zU5jpZ9rWRh{$VIFg|`a&C7~nGdQ!`UBWeLuA3Vky+{avw=uIs_(_sZ=|qcoq}E zODx7L)Uz6TR)&Xz)l^kEDo0mW(?2@v>-AUHZX^-Wmozjq9+{8YfgYP1CT|5_4*uY- zu{j69=fXkneh!nMYzx9P$Yl`s)$As`0|*3vj$2GYM~Mbfip`9BWV?SL$@o8L#x>wGfMpCz;Ql|AUqJ<+ zJxOb$fsXRl$Z4^X-wp{Q7olEe*nEu(qC& z8k_M9dA@LLSvK61mpk=nlj9$WU#qE63=pz<919{~n|v(z_H<7TrVx2MBwfj@Ecxqn z!=ZTH?6AMZEgNBbKw)`;I9lZ90g45 zddC8+gKi8ezVlOx!k6sos&@aSW@8zE3{gc(?yFyHSv7NRC`^EJbytjxat|La{;}fp z%?msV@blxwLU*yCFzpxBAoQ$%-g@SU=}d62mx|5*`Uso~aAntF4Z_iCuf zeZQv_K9ckn_Z=-XP1%=Yvedml+?lsk9fhbq`S*Q$PmgjR`L17M1~7s&>}LfT`?FuDx=QE;&Hs_t6a8Df3r z@B01wzWH@I0Hbf>FXtd{!f4luO7F4+3K=7oR~b^kTQi}V5H8(E@{G+nD_j>DBAw2e z4HI96BwqelStwjVfPv3cck|D;9tj=?o#_ADC3HqyPoBfV$=eM3nOqK4_0()sL0~`L zF-j>2emDGP2`JxWv}ujGenk4*Mw(c&>G5)Pba!8UAJTabdMV(0C7EAYadUmw`8?2> zi1B$hxEt|#9|;+G=7;#4_I_+I7)1}R@TSfHV>qg@h);t7I6)rZc)f=1XO~jN{B_Wi3z}9 z@#)`iRz>fz8w3&4z`u}fL;cHpF0=@J{vCl!-12ib@UQ2 zgohtI-8%)&s8Qbg)0w!p3~b=aOc>ohZ!m4ATjAKLBugxNc3N3>+J=BGq+M576>}P0 z9sQH??1(?i{g#^}5FEg*({uv=I1!nB!6ULvD76*42QxlxKA$>FG)2bFg=4^&VeQWq zQ||M_-_uvKpF>wunOU%E)v8MLC7qmQGXN(HT26uMTFMTJXt|DwQFR19Gt@Wg;h28W z6}Ii~U@E94qXFh%w1m(DqcXqhOhHnCdhJx40$CX`UIEgUV82UG19tjA;BU=(K(ayv!VG#8^@A!v3kxM;QUDoGs_zhfj z&08GusUq)tjUSfL4>I>w!*S@GD#5J&ilxlBd9~m-$0Fz{?&_B{wn&lK-%($E@91N@ z)AkX(^=WXb6&|)sI3ItF+Q(3der@Cph$WjXF|4om##!#bMH+|Bn$13lQ(yu~ARv1L z<*z|o%$anJfrrw^Vt5|)=%Tu6M?dYYZfNQ4+h#6uR9kpu&E4W)&w=2gZo??(N>+}V z^eWO`Z74OKb^01VuR*9S!^j}yfPJdsxB;k!tuA=53b!7h=Nf0psN^q>! zBTKNdn+3k-rN~>prOxg>DI;+mwN+fN9xF~7t(7B1e&OAml9ujw6;eKhrSHU76k z3nJEZ@!zrQ=YQDxnFNTjG4ILfLXwgKbWVw+wCVh#RUZm*qrlNaLl6-Z(9G5VM;8G9 zfxF5q*#zewE`q&RGjyOn3tyH#_b|$K8hYLQH`gGBW(L^Xmi1}ur@9u4N zB}ZfuQt9~TYg(Z{pPr$HleK49{4O*`p|pNtxT z>oB1vhaqOL#--ZPH)gE(ue2RCYd#J7~$1rHD# zFp&uXAnTpFYRr0_$0A~#ev*8Va31&>4{&JBogv_S*fpPdbWAr=&SiPtSxhfYWRFLT zZLhesZIBxA7q9ae3RL+7&1|bcPE7Q4vPpCGc(qo=N>aH`6O$i=JY|UmRXwc;u0 z$P7d!qul5cAprxQRzybKjL64L{SV#5A=4_WxaXx`!C?zhDi3S47ew(WI|COM#D)%T%))t=Mfd!bQ!Z%~{-5byZRK0K3AZA4G6~L*sO^ zdUem#|2jY&wnM==*!_|3<;*Jhp#^y#6}1o*Wlt-uyDF4lzlBC^4o6dZFZ*>N9K2jy z?yi|v--1~?#T!Wl?Jo(~gFvcq2Y_s>`<(23&uL&^ zfJeSKL99^UBmS9JgMt$DtCpzec8?Z8g}c$|Gi0RJIT!YKDvPR;kN&0|kYK6~#hZ3a zAb>Xpj7fY=egxrHh|-zL*AI2vQcYqzyGmf7_Bf2W_%!+mhVHe1sowi(0c-BWc$<;f zUaOpAg5c%Jf5Y&0LH42^kY0}BGuIg~qfZELe^OHJ#+TUo4iLeH%uHnO6C%tY6wMR& z+zWCsysyVLY$PKyCKik~>X@_BGU-3ApUhIXs;CElEd(l@dvzMllMXrN7-9|_%TGr8 z{CppdP5U@nE>>G6YYbkFe_XiaaYOV2nHgoFNqfw~H{ezOtr4PV_}6^==cw)aS@WUo z+#2DXA;~`P_o(nKfNXnT;DakWn|jTu2vE?IVA3Sk|HA??*vNip4YW3^vyGxEr2O(rYCC8=6*z+EG`C#T{dnjU#AU=i|CagklDIa{ZWNDk*3jyr|Jg$;(L4A(})KIFzKb?VM|S|uY(pstDb(=%Ov ztrW@P^k`mqwc={8_Wz^zep83J0Q^gy9VNd*tEAOEFlL7J&&$jK*9y{sO+HU9J|>?h zIiDxjz+tyz`mbAhX%#FxBOrL9k1FR?9^c12AFGv>UkUd&T$hdQ-0tfr6#V=N($LqS zV1Rt?zo)(YiQtyqMM#{aiF#QImlJ=L31Im7xGCO2f6%@_`td~_8X)By@iL?3t?%I( z-~=}+i>w)F>P>+`0*tUk+0a=4Q21M-6Q@rZ;mtVldLxuJu}anwW0Gj0g`UOY7n<^C zTt%i}YP~2^5e*^aKz^)T|p*lzOwavh0Lhx=qU;)t!)P?eD> zIXPLWeZK=P!O(sS28{6JiE}##hPVz51oZl?JoVq_LFNDslkST(k-BB3dgjn-}vRoz>!IP{G*0wxzWZR@h3JkRpJD>JS&CrXEA% zB6VgOr7WEIHea;g@nM_6=p!x%VF69l!#J+zm#0orW%!r}tgMR(W-a%Ww!EMaL*cIH z?5isL{=Qg7HwE75Fj?#fAZWHv4f!e`3Me zbTX!SH#e8@{UTfRQZf>jN%v|9gchS4a)Q!Z*iZE*+5*?D}pIDa5 zJ_ZT$TFo?edaHpmhQwcGcTaS7)J$inD>_oPxKsd+;z?;oiH+1Q+g)>mF# zTKg6hML^YN-4$(g!BzP1hC7gT>EZAu6EiQSRI&V_I=_`7;_#>)&^^|=BoOc&(q2zD zb_wUY(cls_-pb%X`={o0;jEp%j#lzPNkq6`HG~J*gJ>1ag9J^e7nuP99`yUClpaht zq%#l5i|s#^apa}d$F|E0r7ix_)YOz|Qq;XShKkDB68x&Icg z&y&<*bAe;zPMX_ze~aYGb=_Q*9<>6=)?-D(&&V7v+@T$ms!K;v-4ahW6QM-#9AG6l zd7%W`#)1%0;OivlWMmHFk@tf{J#0^wbb{OqwwtHBc8jDxFL^1UiRdH7z&7pXnhPw* zCmgG{4i1R^FAD$}#y6A>DUkCb)L8&HeQuKIA;XyiBOA7B|J%ZMmyE`fwKI2W%obsn zAg}616E^G#HL(R+6m?q=x5( z!PsUh-{?RSERN0KS21=%2=XZ`{4DqpvE6MxEanwKk;dq#Uugm$6M?<(QoIA#?nK&W zEIGV9JSYlT{!p`eD!JP~uQovdbtf&mxV`F~7&u2t1{x12?mY707 zhKZf&G5$7`lVudVyU_dZ6R?2Gk;bA=VNPwBv27VTOc=Kv$0Y-)Q)dpe`A_?iJOAt-;fyP^sm{h-_?W(uG!tFz({S zO4L)+TdFH_Hm?qA<*j))NsF_GIag8Z(oR``_6X`%`yQBSLOa<)mA=%L#aoq}-l4!% zb8?IcK=i%T?Y1v2twEZ~EZTw27KEvk5m;8J5QyIg|-XSNGAc&zE`&UiiF z2fOU8^G`jJJcytC8jrduFgnS`3MMcwUVRfGlFqqh+#P;xeXqK7RM13NVC)RFXScxT zx005h3puVQ!(>xzjASE72jHskr>P&5JI~Hsc6>!)A37ZAvZ=&FFqR4bx61*BxhqA( zPKct2UIa0`0chpx(|*-Z*GLgScn5ua&uJ=Fl+Iz84c(1nqPlo)^A9%&0S~tJ0>#bn z2-;pKI3nGdP8)eRw(fuh{8fV|tVkmJexekdL8ritM2KyWDHSQOS7(OPH9A18Do`$; z`%D20^h?)c8ds4<@+6y9tYlRR?3sR-LHufI`5dA|bPTj6*l#X^Z93Zi3wGgBt`Qp%>~FX-s&;SbDr*(s_acZ^)o{ zvd~G0I1*E|X1@Nkh*anHfTH_TNwp(}$QBYsS9;(ls1SdBG~Zl%uosKLdGPCDHW#r2 zk_E-E9^PdbK6g0l0)A9a+A)`39l$~)P&<2CZthF9z$ag5!#c;#$9OGdl7iHSB(U}~ zkY>w0vCXDc;HgS%Lp8^xjHp(|0Kcn(Mb1Lqhk4Q+9G>S*J%XK_Zm&Kzl!LYwQoS@z z4Ash;`)4w5(chY;@WrSmk>*-$1KJn?vYyhD--sKzOO~E?za7>Fe&XU7Zt=NpNfh!J zbr*gz5(#y?pVXkP!o{hFJ10?NC-5yX`(;)KCK~Jf&BhqeiPUhN&b~4&%l619{(@)1 z#@B@wx<@}{ocfdJbNx0p*2p_db_30i5s$K(ml z>M!CbiDjKZPh`T`%RELoi4XW>Si-O3t5M-u&<#(Qz!qWZ%SR)KBG{OeP{uT27b`x31U7vT05~GNg!3~DbEQl|NhT#@FX1pZ4Vid{%x5-B$UQ0!xlNj8zo?IYF z?ANtocsPZOqdeVn)76i@IuH9zIoq)iPCCnYSh!%M|h^3=I=9juVn8|2&fy?Rf zH4B}n&|5taJB>UI@I0%Xoo-^dm<^UZk^r64x1WtM*av*(-m#Rf)|1C8c@iW&C$ZT$ z`}gJWv{T`xV~1~82H>(Tg5jdWw5%F7wgSSCqPX59?L*>;j@b8n3IzK$NG3lz=F2Je zfTEIx_%CI*KbgrNgN!VlQy-^8-Kd4`om}Zfh{uLDW?AKfa^mtYRUHTm+$H;g`r5ph=#x&72bH;h%|v;ho1g_SM>iBb_78XtxA7BH$Credb+zjV(W|r zL_e-8VGEU+279u^O=JkwJ7-IvnB|lxGbVxK9+-ib*_g-XG8&e+2loZhMVn0(#8tsB z;!|id?y5;v%-+BURz?VTzlIPH+>6Ku&zst0*9m@Ns6bM2H^e4r&UpDjWA1y8eIi+o zPk5ZG^`z`j0-csFI(nh0y`~)0Cm1y!?QD!l*?lfD?(gIn*Z$&y&e@UpepOyVgz3a; zzauPz%=?hbdUW`T)}Is-+WEWS!H!6_KNZ#52=G_^woec^37{8)p~c)nh(nkl@e2WW z#nVj^$CvPR9F$}`X6_@~RtlqxTOM@;P2k+xWvs8_oWq%_{FP!Hg4}2lEkE;kk{TR~ zT7fRVm#@!%^Z1B)@1;XDd)YDU<~XSyL^z6K%>6njK;=i>+X$-bEgp@O-x12NOq>yO zw9r9{q%w^_ez<=~#3v;h8f$=IMED(5&y!Q9UogHF`nK(b7swSPwe5yxj8z=U7Ab(b z`FNV_9SNho@~#z)HWV1 zG5Qt=5mcqbQ+rtZaz8pHBUTOQ&oj2T`OI5|cE&_>){x(O7Y&`~ekSlR$^COV%du(C zOEGWRs%fNY;?h>K7n&>TtTd5IM~mb##iAgaaQHjYUb}9}!9o#9XBJ>Y3+-Uze4jQ? zL`Sdkdljqoysk#=EJWj<@1ClW`Ey=&ArvIIxqIg57%JqI1Qzv8l^FI~{pwi1DkgjJe~;w^V8R|+CxYMh;ji0bjSZx8~L%`%&rlJ0Je}g89qw;z-qNqbdZaYQGXa)_z~Pz0wC85$f)H zkr4Q8{6*$)f+!UG1Dubfuy@vj_Sz(gq7jBxq}*o|Ci8b8L3NdXLHhCOS9;hgHFX^u zdMfiIF2&kKNVKU(!0bY6TL7jL^V^OizsHxQ z1QM7| zOIvPrr*6VQmXr!5Yg%1@JRLxtxoa^r0O? zLB3I9tY)gS07yCt9;Lwp`{mZnPD&EG8;m!p`lU>d21xm96Y8 zl$(UyTS`~W`BkTR$mmGlOg9L`A1Iq{EV*3dSPz>`3|5I``dv3)#@o%@anT+^TwTGw zix`b5EMHU?5iN`hCRy^W(pWfBwyCM0`Bi<@Nz?q35F6qCtecvkddyaL;6bOlCr_}e zqKI;_M99_c+SH5Ga!W%R-HIeBIm}72S-`UF?*B0L4eXV6O|ui*wrx!&6KBV^ZA@(2 zwr$(SL=)S#y(d0-UVY~e?CaX=UcI`zs=7LSPXJGQ<4;^uam@5P!Q5wXPhITWB3gs9 z03%=ZNBY~NYexbsNUm=!;2qOg9}raSuuh<6n5$9aFF~gt7XMuJ)YSjsE{meNQY_ZV zQl(bP{`I{5(Z^ zgtg}{+4g_Qe}2=U1Y{g(gEu_>b|WtoUNWQ{^@q2|qt0Qg5Uo{vQh^{MXV%~GzVhmG zR_4W_Dnf6kI2h}5r(riOUeHZWr9OC*>bUkhn|u>`2KC=T2(zDp03$z-+nG^vKh&6| zg!ap%Gx7*ofXVNgC*_CX)T8Ui^gB2D7BH*PO-@>TkrcM72)Y}s0Jn9G$`P{_~YWr zcGLEv|Sil`C{|qY0f_Q&cRUqJR^{BjNP&=vL2KC)(!{pDEv!Q~$(KpZp5uxjXQa|AC>pa~}`Un5cPNe~b@s-l$pZb;^0hC&XMOr8v!oSx) zK#`Z|_kjPXM%Rvl>g5@4kQ2+bXiQ+6up1H%Gzg|r!XM6}GC2AhlD>oME55irS)TOP zk4Pu#)>0lS5>6IqzYW5agnf));!x!3RQXS-yN=+lAtiVSoe=HGAW8U#2>&^Ib(8)~ z+-`75SO)@0*WIUJEW#DH?7|uSn~h}BK!`aL_ai^B2>u-nlwp3&HRsxKJc8I`0r?X* zQav$(arFWmUN&McGEgI?SgP@mu7uX)k?fhj>lLqb6?)Ys!oc1&tXcf5sz3PBorgF^ z`ihb_9cQVjJ4T0XzSP&&QOcu^xY*7&RTfm*RvJgxu`Y^dBB56z?ug$t>qQcSny9*t z{l=>dshKM8f-3wTGNU0wx zywOer%tmgHjfe8ZE&=B?=dL-m*Y_UQO(-D|jwRr4EL(>7zsmx?VO=g!PA`BpkGBwj zP9&XYye>b8X{H$tXxc~{S@l-kK$lObR~bBv3d94UY;<6r z4%8?&vPL~gQH7gQetNT8f`Oh#>sAYjVz?V@*S52jw^nrjv~s-bgA%QIt^rgQW#_l{ zOQmsTx%c8TK)uGJG;4LGsQc=c<+E7!G_1Ln#(sO%Tl({Rs8lnLC6#6!mq^15wWDQG z!m~p9XA<{Z@Z4uu7H5SBD-CDl;~;B(!{C2kJ`h0OFmxT%s|Jp!k)5lS!nBLz#j2&( zYfF0;3XtJ}+E)BDrr|XQm)BUj6DDZ26pzML3FT!)zmA&opX%^Q)Nc&m)-p+JG-DWK zVAW^>%pd@ktYTxDnsp3?0Gp8oRJ6FO&kDm(mubr?SN;@@bhr&Me+O(X#|ogCu+3hB zPJUAeUznAf2}F%mOEP)H9DmAyhjT&y?kjq5*nmC~SBC@kEzA&Cj#oao_Ww23rH2LG! zV-BzD_N~7}%S1%AxDF78%1oE=8G$RD+I5RZlVmI)3L)sbry;0Y*!MIoArrr+tNL1U zX(Zri#zsNvt2e^lQ1sZ1_1Haw_w;xm+e8$V>}INrX5u56jYEbz4CuPPoiVEx^8gvH zu@ZwsdSp0V?fE$!V3vq{g`HG=p8S2{p6#C_J`(h6uh|fHimJr^K}bz=*Cj;H)~dg< zR9c_%L687~Zxt2CdG#ycC*kCEsUj)}>&H@<)|>t!LJzj<<{WQRWDrKafns@)xYnTN zK{)+x0Ix`~v+>juq>cx#rUP#`c(1hu!XO`I^*daC7w036iHUn1XLWE6rK>y)< z#7breNgn0Cs&QO2V^x}RL+@@zrlwj0QB1{U5fIU@$+6(cCZm9Av5KUzxEK|y*aQl zpzh6}!6(8liiH{egXWssg7dWdEG*yB`}dIxvlL+vE>QPBBvUENx8(oYiQO-03YU{0 z`NKinN?b+K5vYCDJ{m8Ei<&h`sBNSX(V0##C8)4Ovd31aPR7Jj!fvP|#UH5EAS6CLZVv0DH(gzoIeY2yN zd}rPuW{%HK|C*%aF6VQ-3Qp*_@Q^MbH+@wiY*@OvPPRGiQ+CS@PgV2i`rOh^9$US4 z);w;5xImrw2Lt^#J|cRN_fBn679~(TcLEdLx;)U^R@o1TGydQ=A;#kBdfq3NU#41~ z<6Ud&zD)u@GiI1qM+|@+<{0LV66!MpOxx-1&!(VPBfkh>22E1o0tyQ$*x_uV>7n+C zP>55|aX-Uz6zXr*qv=z>YGY>b9FjiRP?p5xZ(BvhK^*A&4CM*TeMXFCqI=q3T8)-t z-ig78mnC|KGEk!`58S!(=aOsf+I640!wx+HzG%{g!+J_G83Y`aFu4YC2=%Otmk)yE0GJwb&@&?MQ_AHQvQm= zT0+Q9Y{w)kAE|jBsz8M&xJXv`PdkRAZ_qn#A%qu!Dodl|I#!C`L8A>Q#u;M>)L}s|ca83TZd~#{?B+-jY)AAa ze(pU%s-DSmRSq1vZ$}`_j{kzr`UX;UYxrh@GV_~JO!nFV0s^vJ3={|X9wDCKY*hG} z_~5O`r?)rx3EZtE)zeP4TNkVr1e5(ug>(~w2T^`XUJpHrkGzKuO_dipY+EH>*$p!P zW0>p&K!Z<$CWdF+hMZKqK$o-5G~VZbcX*T`#w+<=q0pD|N#+cIY`oZ( zeIc~HcL*vR-=U4sp)IzWrWSjNyfvHtSOGzJ5$G&HB7LwG3LHLEm;$B;Au5hal=sAs z3un0HF@Ij}T~<|ifE8iT+`BIcL-ya(AV-D26bEU?D~#4HxgUU&`BH&{Z2{f(0uv?P zk%`CQPN~#GGyWkg8p-56ri_Cg&ojZTh}>7L6woJlu^kBOo@U)PitAf7Lexm54Njaj z9m=?DBbYrT)x?_zjw_?EOU+i}|M%PXrHlDF#WVdLyn>1p z-B6pu&Z);r&N3Ovp#`PJ3~B14L}KHLTvs5D{Te7`hV|x|l>RsS0|n~VxRZ~lK$w{D z3nf-9-ejHBjxTZVZgTg<-EO&%FStfR5_I6qHS89FhmIKa_D)?s8)kpZjJ&*evP z|71fEht(;?=`s7{WE@l_y=o4~7i7~nHTe%M_r(*yfQ-JML0`ClL}8;LHmG%kACfx_1Y`u<2N{-S>m3N?%vp21 z04${Lq%zzgr}GH%uj{-&)nVkpWV}gtC`{3&$x^VfZIp-HIb{Cwoama1)Xf1_%6C7D z?K)js4$D=@LSj=ydlnQ2?28nMu}pD7i8}Ff*4^3?{{WkWCoj_uFhzc&Axh$qkY(Vw z6Ndw=@dOnzZqdhufz+*rd_V`)q$r2!#(i3Vp9^O#g0T&I?0Ai#7~WT~bt8`sLC|_T zFL6}45O)ob7KfNXhfuN6B&9iiPY5NwV@sUvAw?uG-#Z9VIP21qte8 z3m+~%sVcs*zGLCr%wIKXK^588r^(6;KZ(s(erc6Ol7OZ|%tneyE8*znE9=QbY9g?v zg&Th4MyU$>@80+8N}+;>)xf2OW4r4SI(%W_p-S@v#Vs|HI;m2$#faGOUl(D8t36kt_pr3*ILTr zsHBw9V=wDHE{MZL75AJS-c~Y^_C^vq&LS~p+N-d^PRiRG^v$VYXiH4WrL z!i^&A2D%1bLT@>}h!z?) z83lRpC^DnM;1kK0h2{*4^a$ajfmroptAc)nQ)!~;@j?NGQ|^~v+@lU*+*XmffTl_G z*hg^p`Ds*4a881^?f)URhopV@vgCPI-sxe5m$)Kb+C1Z2HSJBUhe<0j_FuZItFgTT zsf&xh$PGYFCB?sLHA75LRxqOgH}H9IdTUdq(k`)t4dlK| z|BX3+cA!an2Bsd1xw ze)(IHr~I^qB5c;{x&)Dnm*$}`$|AK6=U?SSEDpF2BU^DhjsEm zfl6%bm3!9z1BC{l>mr8hgZWcwy|UgD1pC5XF|AB^<0AmBt)p@Ft}7U|AuHsD zTRNjnnQD5WuWe^?9obGRkL4TY>3AY*^LMn9dYZCU6l;Sz@zANp-s89_$Qe!i(iq|d zjf^6CEYn#ISGVfmf1TrZy`#Y^qXGoegq8y7c6mZQ-CKefr`-erO*;gsOV{VvoG0;) zzbM9UStAr$0oZEP*JSRlS0~MC&g9eH)!k)hs{Y@5Z=!PGP`JM@wEUAh^O{khmz-c8 zPc?8Voh`eHt*$M4rGMO~vO|#;K?uqI>D=7z3jg3j*L~GA6MmVNE$Sr1v9^x5EsuB9;L`8zQ0AcDTwDz)MuaEIQ3d z>hcP`3%XucC|jP1w+B6V*CN|wP?)rlfn^exSTnapUmMGzEGC_0s2qrOzp8imb+3lh zkF8I=k<8*$Hi95)Cqw#er&{y?3iHO|kl4qWdC$=URW$eQ=D_!NTD}%Wx-xDg1r3iY z$*a{nv8;ToQ0Y}gRFP2MsIkx^eF|d!49CUm3kmZgp36O5c#7wYn_4EGiB}c<0qJH6@z$ zx-LJ@t0To2c;>mp{>_~erjNUb?}4jC-Nw2!3bPsQ%FiZB4hs_L0i6nkM`J6@R>EqS zFD1c53#8J$@RX6=8c{L5nI0dX^+Gs=PYH7oLx)lnkIP*d`Z@?rJdmhDaqlml8tjW! zpbatb-!l_8=4+^Rr>K@+R49hB6y=ilC%M93o6+A+~25}#r@EXy~BG67_y^&<& z1jFZ`Zz+o9)Vuu_lDx@wZ^Rg$_hA8-B>6@I$<@wqxPV5pH$#w94ij$UwPX-$O< zLO?shqUzhoeUQtS#L9Ru_69PUbh4nXp2m&@$`d2`FhKt@$`E6(7E6iRRXvX3w##ss zX9m(<{ypIr2?ZVDS?eAOXH`3k9@_BDWqwi^^)}NZK`|jURvIorY5uV183Y_~r$KAL zLq5lxe$VL44;!=UPaI^e*OB|nNsO$ncu@{2TYvlH!%rp%24T@w_WCFWsL*Le?z$Yo zyXeZdA@vDtY4vxn=~zdZ3cxp`c!**nx4J}!_5Q%JD@B)-ud~b|1-*b7#3e~zW=Rkt zmJ4KIQ}2a1l|ZGFh+mk*LG1|)mXW`KH0bzv4vFlQZwGw4$4qPB6j)kP^5JD!oX4dt zNg93^PCjpEsOCLt(hIBXhPb4CwMVeHL`C6)C0158FMbyUWAG??U#Wnu>mvS%PH0?Z z^-M?kP{LP@g){i?R^>m1u{kIBO3mX~JGJ_0-o2;9&p*GivAe)K)E>P5c)s$jnF^&$ zo*+uNhp=2~#4W9;WCv3z7!Ys+qTQX`wm2j8^Rukm`6_OloRl3D_C>e~rY}6FMVGBp zN(~Rqsld~)VUFSB1&bmPP?ERcbRt5MyPGo4U|#KFc+bq;xLXr*!aM5h{C)&sD|<-R zG7FZ6B4PxLpi@_`uaR7iIY&D9ioG;&9eVhRNO~T@$uNvyhCN%hS0DSDv0bK^h==rC z7PTMUZx-rqM^p3g6}496s4+*7<-VakdaeXWc}F9aP6rSu^0`X)t3%KEm|Wjje4eKs zLX12~<&RxcPoka1IbdDW8QVI-9t!nOv(1F<8Rkn{B7UcAlIarKXO*7VDm$@iEwgtO zD*^@gbMsBaC9BJy;t6c+W*$yh|5uQrfq3PFCJP;g&@-@{k!pKBxn*coW`}CoJVftq z)MoBEhEfj27zWn@Xq0fF1~XnOF(Urp;*h;?;E3~W$&BrAYCqs8d)8{^jI4$BS{{Z+ z-IcJ6pSzoqqiR>Gxk zvR!N}c8a0;gxJ*s`}@9Psq%Nw;||>WZUlT(q|USt+y82duRNQMe6p-*M%{4T^CRM= zxz+t-7##pl)z2(wWFsFgiCr}Og4KhHYwbZ#$|yu3KCBOVD0JN(;3 zdPe?$FYhr}f2I(DesVJ_K-^>I@-qepXrfn&v&9q^WQLC;KScx|*q0ukbQ@wCY)`tS z4m~1BeNR*1BK2+&7)QFm;fOAlkp&JScvj6D9-#jZWl|mf?Ym4|(F9Be>swldK||h! z6@zCP7@)<>D?$Niw{S^A<$10A_-ej1y{~CoHQIOE7+vIxIk663%Y%5-VT$&|W5GYD zs>XU`-OH~JJEqiKNva1JFgYImo4TLwn)bP>2Y(i8k?X!$#DToyZX`dJ5jC=fMoNl4 zoA=ZW0y)i%49~{J=+>1x&m`Hz`9!N`EDQkus=WV4a5ICip@1y)tXgQ=FKH}yc=1HG zP1m?`M$)`POga6yMn!mxnNw@-RPN=ray720d{M|9Tj2`p=(CCi&+6 zTrZ@x#}UAqkIW>I!&|jMd59692r5)Z5Zn>36j}yGjWbg8qaQAJW{I*o@>@zK+9nPJ zP0k-R4xJs7^?B!=!J-NaEOd0+Oidir_=3eC2*%;>9yHXIq%7Y#at90&JWLgGZ*M}N z`^O*IDe4-Ewdt>b)G>r$kl0=$RdQUV51D^KT6=4ppecCLWh?o1;3SyKSRnS}!{GCj zorqY7tDe%kiF+H<6(juOGNSadL6b-J@Qbj!#w48AsKlQsH1`KVD)+fnFnd+Fgvi5RcOr6s)r@ZbU85 zJVeGap9JTSYaHj0@LMFe8te6?;shn{Kgd0mM2>%2a#~)bE6b(3)DGUkUK&Ua3uB3_ z?Faws=>MBz1v*K0=2a{Rk{ReU1)^Qee3kz4dJP?-3B%EO9Ui?>XvwX36*r>dfQlgd znUmvhSGy_Wm3X^@YdJE4roJ0P;{(3^9`tr6V2a2aPW)ju<>f(7$UdkjsiW!y=U|LQ zb~j_atCC>N1$+=E;=N96pqApYsy4DOnD_ya5 z91^GAWlJ(6=wJ#%^SO{W`L_Gy4FSnPZTYt1vZ2rxHTsJGjf+a;5!Bt^7zuZonl;N8 zr@S)68m&pXaqF&$&Yx_N9#Iwp9mw0jGr_ap6k%z3VW5GEd3q599hZ+_xl&CTuZyqv z0fkrN;-G=VYl*-HB?9#KZMf$P64WlL9PzSJT{pq~YFCiyzQ@_(`C5e>{;kd0pS`y@ ze&ZG9(Ci$b*fuEfy5+5dJzN3hwD6T=^kfi@h75iVLxdu8fl%(Teu#ov# zkaw0Sg|4d1v)L3E8r|YBXC+_+XI^6%aDIAfU)%k4mx+j6>MCnuBb zTL=`Hz@ek#6OLYU)zDxkv0R93FUC9-$qT=W#J#j~D*Eg{tjP~eN^z~1UXK*7e6_k$ zq@ZzUor=tE*9ItJY^0aVMao7t6Qxa{WI|j$DA!Mf1#{7u%98dMT}j?-XJ&x7;P>jy zX?5^8+dB!;)93(6l-z~wqGseBoc-B}4Pvvhu7QTzkEag>_K2=f_RCb{E2glf+$#jE z%hrj)Eyu8NLJ1+lQP7onQ05k8F2umcU|Y!qG5=E*Ea z10dAFi(;S=7Wx-@NxvHe*I-%;BN^CTC~5*0SYX(2H93ZrkU_N2)|?Lxl!8zg>KWE( z*4loM!=WKh(!2LfXLk-hNYtNE4ymMYXOzE!oADrnqDlOAUL42AWR#)1_kyyQ)xKc;?w5_Z!Q*et z*>+Zo5a{H=l|TFG;z664u#<8JUFM#qc&tt!MDmE6$q=bl z2b{%6hI0~=VyEGG8e$v%zkXF8x(NwXG5mQn;ba)Jn?NDdE~ipiU97ni+g@)E#&;iY z+phQRPwz#+?1`h8&)eC5qDBTP*B4;T7v;jgSKx!IM`% z>Ol1%WUsPGXBLg65a?$&29jd8AqI+~(NrN9vF-QE#EEuWc+pJ|vY@e3(meZQ0sq4$ zpeB~G*FyP5>(XP{fd}%JK6dXJR1j)R8Ic&kY;U^AKWr5 z*a`-i*yPfd(Syoith~+{(}C5ABfE!}D**_3Qu1Se9drSCe;j5?0E@fGi@!xkGY?vM zsYpr+9T)6WCEuV2mY^;Mk2I@qW7zxpvYoCAC`!(YR;g8#%c(=;&U=^^qs3lJ|Mle& zg(;O?{xi`rHst(5zDROq0UlKIoB3I(BV?0tWKu%y6?7rFdX;DAfPNq7FE zE2E6>usP*8R&)LxtNFWev%14uX*~wY5*Icmq~rJV)xDU=&%IEs2>Sfya!zz*<4y?g(0J%c8gs|4-aNig7Ai>bux0`zz~raJNb|2r z!3H>7Pz2FD%$Hn9tW_H`=qwm;+~4U##h)+jvxJs0 z9T!jx>l~bsJE*uU6}0ykLyv|1L~^(2aMS6WZ9C35P@dc>t1SZA%cB=|1&>+&95Glg zgo4op{ahGi)Sv`itEX+go;TAz(%|5Viq@KGv2^IC?13hy4B|CNAM0#oP(2Z7WDfM9 zA#G4f;)4xmX@Vo&kI0-9m&oVCnrjv-fW@E|S&$cD9?23lv@SPMF{g}xhBq+)Q%KB}=Ts_m_^IwgRRl9hlPT*#cQHrK zT)!%egjRmXG!(FzWPo816mA)ZnbQ7O)pI&AXW7P)^3i{1UE%ejd_Lo;C~f)9>&32h zn12b3{t(9!=?uk4pl!HKgD^kaC=O1KXffoiX86=Oxb%BDA;|E)DZz0?t;#7|c-x&* zj$-Ed9A9lKosl2bauSiMWU`{w8=!t%V$x`mb@-@~WBdXz*^2Gj&ieHJT%&O53dXr_ z^FCV=DWjHqp5uvh=Kf#>(o76^Nn4{^zcw?P&d*$3yAKHrC4IcEx*qGRtt2`B)ytU> z5Z5f-!xH&jw9VlznjaM>QbC`@pq9N#2E(d|J;fC@DY|$~KmU9cSRL9&q0x;PG7zCp zMdse@ykuY1ecYO8V=o3tP%+16W!^37cqG22nI+?n^LnuaC~246u(4V_5?Yotf>sU{ zV0hqP++3ad2Z=R=X7`wiviQVIjUguSUXe?gyDE4B2blFm_N=gtzE6g|Y758k`QB%4 zdr7X{FD@;myk5EXp8LKh>pf!t;d*c2KHiI^QhD4zv#-5IC{P{5xc!Bbh$@qk&}6UF zd>_?vb&u{2|6FnU>~p>y_xB3|OMPETuUdW1Ti=dbw|&;TU#~jlVi_Jx_eVVqFj|_2 z1BzcT+#mPsk9Z%1-y}-km2cd-TIndP!aXCmQv>q;6mtW7_G1q}{J#s+y-LtP-+r9i z9d{nsYd{Xm+1l8i1qh7PK&K$aOP1cyD=PLidE$vz^fE?t4S@B9f;>fd&?I!p(o{NP zxOcG7Y!r-Rb(i~a=EdM7?)AnYpWTIb{lXy{Q0${X3mu26weu~#@q$afCEs?9Xw&O+ z6c@gc81T+5g1_{!F%uJIS#u7sE6;>_wK)_RdY{$yzk^@pSI$Hi^{dvMD0t!85(Z>6J~L>YP~Dd&txH#Y{`tmK1g4m6(OP}~{gJbZg`5+dn#*)d zPp|yuBE=*rX@M9q^klV&fl##uwo8<#O=o-5fCOd?ayw`J2y!PJm+!2>3qd6Pgx$O6O z+1mPJo48{$Cv+uLMAohGG!vwy{c}T&|MDfn<7a;%!e9N^E_)SB_##k)jesJrCz+eb z?jyjr%yEy4vAfMmh3$H|d*R1fgwx5WgViP)1^2YnXN0|Mc6umFEtckLU7V_9+-Ed8 znBuN;hfRZeU@;;e?TAH}lR2SG1UP(UN%R(-^Vt32SZwOXOtC+j3PG)>`XBkfeFPzM zeC*yroi5QZl%)^hWwg09=^#wC z0pXuArO63y?1?k&Cm#PHj`D}fE?!F|!AV5nf$#HKI7y4T=YiiYc~JSB02#euGtEh| zygE`=#Z-Y@@j%T)J}Zvtaes!}u$Q*xRI{{&bDhR&lXDfh&Ki;#N$3Tk&w0tm<_28Q z>HqD+;{1T^lP3Z&{1L9hR#|xiooL(!?(w4tKiF?FBIa&w)>?W9EuT z;>oiopzE_e_mvCyPb~G5l)k*YoY!`a#1e6z*?+vb>-Ah-S`(4%Y_vP_845_kK54bu zWNUIM%xJ6p-LL|SH^O_^xQZ3ZVKyoTXUgf-lXQddNlj`x_8hp1`1!i7C_r9RPmW#} zZ&NJaw5^2!f-Z4jNv_SH`*dLPu#4+R84e@NYl{jf@_5)1yi}}psT`?82a;L3Hi=}o zx}c4uQRMR#a2&-ipXR?BlU?d!n2t6>GqTxMfrwXV=67lw&%$ABw z#supyaQ8r~{uU71Bi->$6sBwP>ChQTg4En=Yt2j2`DH9f{ry#oH7Bn5m-ciZIxcdk zTi&ief4)x=1M<>sRegY`Bcl=YfeYVkvDbJYN;~7bv5DNSGq+a+m^wDZhq)yQtZ-av zy36q`#?eCflhzoU)mg++x!r^H8rJ!M!tU?J5zibKCmod3hTx~LSsZY_#@PTKdKjZu zVaKJc*phf}r`MiP^@85HR!9}!bRP37RpEI0xvs5dGkVj>+2eGcW6EY4D%crQ+EZIz z>VZd!=-`Z^x=dE1X7gEngWpYM+doD1`pl&>BeEk|);nd>&M)ItDe zrp8d?h!q8H$;hu!HRB$f1+V?}&KKTGYFEP5w${@SJ=|ZGb2(H*DfS!wbt}uchE42E zEKU{tAz^O~$qqV#rPT%CJZQFn(&N6-`C2H*^6ZKEUL3L%3=CTnk@#447bMG?ELCXx zCG@DnX5`^MsEYa0OwW;}(ADK(zmtYDeBr@-cqQCgP#k6UUZke0748Z!BQ;F^O4zl?ck4_iNQE2-o-tiD?U2E)l#-Eu!B zz#6}0Mlj0uC2t?%)!Xmhq95Yj`h7rcV{A+6Pe)Z==A=bO0|vxeG>a0$aP8zCvBo1oKNG+H5OH`w~@z^o_tW z&>VBQ&xW(Bty6JI*UV7eND{<3g!hDA`E3c<$fL`-)f6!Q!KlUOeaVr?=v4&e3Sf+^ zFWB(WI?I^6kjNLqY*uJDfQ`3)Z z>vp7^fK;cSyI`2176ZWMPQdjg7VFDx1|>fWh$4OAKmsgXS~6~lOTpCsc9S#TPEB-V zDItbeBlgmb7eYg&O8o^Bvzt5_h_qe2U(Pm+84eb_q0-*KyW22rkpeug*p3N%u~zBS zf|O6vc+tUOGQP1&arkbe$w#hkBy-dc2|CZdYJl$!av zwpdu*DC@3j^N_oipr?>&PT`tX=Xb)|W?Y@&FYHBiR}HsGb1!WrtqIQ0)CzthaMZZ6 zbh(kwL+t+R+UZvl-oWsy36_J);k*F5>!{9yzwgGpr>c17(so@;{Uh=J9~Lti_Dy@h`V@j>zS-OLUQ$Nq zd?!WtPfWu~YTs(3E-P1zABh7#(x-)?;ai3-a59|hm-hZsx9 z+usp>m+hCO*0mr-IYbPnMTHuBLj$Obxmg(?^( z!YYZ*O?ESG#5SHRa! z3XyiLWqA>(IKCea4H6QdNYsrgxGDQw)A`_<^=0+fnMnf-zPp)~8$UJreHJ73Qx_cT zFh6#rCY;0$7h2$IGeWFeIEch$!qw|>tXoYZ8bdk*3CH1sI90+c-;HQy+b z9XuFNndwyXhICj%l@6*O5{yn& zFhP;Gi`&~pLxqJ$03_U%4g=!0mK6e7*2Pcd*Bn09O_>y(Vz@XF9+Wa>ZGBxxPUih< zvgp`{L9YSz(KQ_W#@M`TR-c9*^+h+yzutU}PvYf7hRCBCM$-Er!g#|!3{YI-?)~dn zdduwtHk_kIZZIdeJp<>~t$2~eDHCjtuCF`1Cwpx_rPJFfHaZlyE^4i5@q6X~W!AwreQH|LRK@~N z#($hGCr-{z7YW_virgGqJ677$)-zV^QE=Kr+0ED$Z`#aI?D9U=(=jkg=U92z1_tAF zw?;|XiOz906G7{g4{CRGr8FRukc7J$McZhl!#YrBR|-f@({7YCQ1utODxM8RtRSMg zQN=vsji89U^}D{HVJY0y2pE}=GSk3;BCQb8@2*&YKR$FpecTa{7XOHhRbesqW=k{=5-^amWPH@Y}&2Pk;4=mU#cv#6s zJ-n@>=$pom2ES=n?fh$b(t?#vVpcz|!e1Vo521>F(a!ohiJp9TM(Dnoq|{0;@lz9~ z_`gXcZRt-AH;(VG3wVSDrF7xD{;v9wQ4`AiGcZLguWEpNKQ6Ek+E2klB>LSe^cdQE zZ?O45A#7ux`Ua02kK_@!P=B=8daAbwOW5L8p}c>qb;*0l1IR-L&9LNI#ebWMio3N- zQOoff77_;sLl@bvwlCLNBivc=AoaX>~U z4;VIrLXqZ%s3nf2x5mEcXeKl(lo(H=I1Dej%*Mz^s&_H%j%L|DCLQfrk*Js)Ym9B~ zdLfjF^zo1l@{v>!zp)-lf*84(V9psp4r5+?9x%^MHgjD%=d!n2bG`cV z3|^4wb^bl*-}>aYHgDz&Oka0vBA0t>I!6)wWb1uuk*fODF86un4UxcaH#k3dHN0%o zKK=Ou*2>d((SgAsCNr+%``VG&#d68_IeTpLv_GPI>vULM`SU5nVbqqN!@*YcqL5WU z`|}roWwv7rA!K8priy9~*_u#kVJ&-u#F1Nl26uHoSLR z3d>z__vqe)kv=p)>9|1y8OPtV#u3N zJtZ~u-m7w>hSR34yPKDjo&90s8hQ82Om^Da7gz7?QSY<)Zm7ELo+#$**9`b7mlc&T>X@|kD(EkRJ^0_@Yv)1-mAF1p=Y zV8*~FY6X@EktAQ(N7DD{%r%Ba3(AR$n54ixM081(#?zJ==fhnqv1Uflpt$})Z(&G| z2LyCktbHF+s8QQ9vJy2Ana4S4?>7+0+7)M&OcpDjqT~r@&lQyp8B_ZzB~Q>T)I3 z*Ai7#k88_h?>k9c%WK=_xVEcjEDBF3gD0CtorWREQ{|uZj-Ergel8{7_8{&1m#k>G z4e5l17i~|w9TcpXKKgN9MNpp6-KFgJOsu;d*a%6Vw8VM;4k{5mO~Cz=cKw*<9V5R7 zRwruiV&J7SAgNJA`+QYT`y}1eV^$pm0;c;%m=oKgF4UyaNbK1!k`E!DC%QJ zdPA^+Tx3kXmok+8GOT$wBWk5(5t2@?y#*Ba`OoMNu_XBKtJ!DF!qa)V$VWD+C{^q- zo`YCZgsF>CW}(CU@vnGiO8zsz+A!@wddj^mj)*UNt4zIdApL^eMu<%YD`Cqm_2C9Adjy<3}HlOxFJRdWe+Rv{y?9Ls} zuRgw{YrePqpA}ITz)iicO);|+CgKfm`m?-mJN|f`%#7E!vcUb%^O36;wc1LAKL^Kk zYbv%zIbuNb1p-yR>fAOvf&tztcMmy|T_ocqwLcG_QB1qV$!+-&S^3y^9w9F#!HYyI{@>&K#hVMc4IMQtp1zfXXj<*dR>9K`I?%Ns@u(BQ$& z3twu?4=Q#lU=X4=I+FOa85^*Xt|4OQS>Qu3-Hui^de|78wQ$aCNAB0YuOF-t!WuRWeIH_jdVQ*w78n=2 zKo}ud&eptQ(A|pydHDB`qxK4xoH-xj667_sS(pWeIEUbF z#PR^-;kLVJdLW`p*1y^ZDly`s_J&5ObC&2>KGMu1?t)=L^DczB@|-tD7l?oBH2hse zzHJIJzH*X>3P$P3;Kusp=Rn=(z8z567#R&Bz{BIeJ|cbIAn}rXWPVxg%Z=UaeCt}v z6fvw%)6&xelDxxgZ<9a}MzSk@GcE<$X>|x0l%3cpEgn!RxSSsM&uWz_7v&ZQFoBu6TwPZ3;(#} z<*%$_dnY)=8?R!Br{raZDw(Q4oosZ*70yJmpe4l;vN+EhWQYJKCAx2?b)@3m+5{Hy z-YZF`7^Rx*1}k6{VMKc?hJZMBX4~lG-ZpHD2eYdMFY=??s6`l$syH;97Z-yoq5*<9 zLueyC`UA4$8E5zz`ck|T~-n^^3>0byaXQ%b$Z!-g-f_&ty zy2PN8Vd=E6(U^xxk}+mIbiW*ya;XoeLVA>#?@K}LMcUrwgkRW(8z84;DsLZlP;I-+ zKI7|E!U31Z-$nBPm#$~ge{60Wxms^#$y~3Fnj&R}Hm87`8%J*y&~C;0?Y!qUK940Y zt*RN8y}~I!l(mSkBReOl@NBGI7MTRGdexndb$PBmUOaS!^C$ONVbj|9^4pC+PkY*M z@`lnd0c#Z1VmHG4GXjvwlRcZEermlG4dT5oYGf2etiesGa*T%6URZBpsm#GYN zh$=l?3PGoQ19v!>wFrtZ(V<3z%iU6&=I%O_y1F_=>6w-yK^cs(f~Umk0^N=ha)yS6xg9-bfbMJh4M zI&S0ykGuB1>HxWW@45N-z2s@bY=ox7NaJ_tK3`IOpHmSVdNqt~Y^LJpdpbMU1^0}C z1j2l`?l-^8_c;YdIi$;q-rPoZc7s^|A6I7?)CSkBZQLD-JEge0TPPGQQYc=e#oZ;O z6n7|4ihHr*?he7--Q6WXAbdQpoH^f_{K(JDWcFTr$#vh08}HY5yRbvBU4Q7;_&@}_ z;F5nT`x)v0r7%Hv<$|P-<$7&&t*3$_r_VZn-I^}+`+I0i5m99bf+(}5LgMfqXetVc zaz7hCErDPEoL$<^A907K+DLoNOFON5MB;UNL`Qk!!AdP<0Aj$F%!28Hixvh3ScCX? zoZ5)`O$yzvwXr(m>?5v3z&fE4l=}=reDgd@pzM>&v6j>?$%nOwsYhlD0ppWhv}-}v zS_qhVKPcTCsYccj%D#;;U*V+h<4=loDsGtvJpmA{wa_Dn%47VZKNTr82o7Penn@XV2k)&y8u3# zLbteQ12boMJvi_~xLgalTjYxFerTkP|?vw8A+ zBNgKty5QDxsxx;-SgFve!ukt1IFGlV;%7rMxs{*agc0z%#K5a|WAALN*_sRyD~rZ~ zJiC2CsU^wj8zp8~JmalUcNgI<{YLHPX~kVIFw0(hbGEGw$wH;G@R^-(IkuzAyJZHK;gN3w3b+Hp=Lk;BYb&CVpM8-bG>3@t4c4xppona5`{pe z3sB3Vcr(5?K%X|t=r?AE)|J$z=IP0|o3sbZCw@dletD&&#vw7);l5Glv{SAU&ckJb zU>`1L7MDhlVxTu7aIH(Ss;N(95fvw^2zbeW~R)q7Co1}Qg6iA^6KP4#R5UfA))uYEv zQ(sY{s#yNvg!~nXa`M1Gm=G57a{y=fKC~M6G#+@&dA21#wY;9QmA$KwQGlSlEC_2*PwN@Zsx6%I)Xfwvu9WS z(La#D-|gwvIjAWXhh_$!qCw+AdFvTP7fPqF`Sk@`O+lfad)-#DMfb_1GhGcLWTn| z_*i%SCMq<1jI_^|bFBIU&(mcunE1UmCmqeuv|p3_=tN9*gmshEYx_hu90QxM2;uSqaM=9BCqhNd=H3T4p96K>K!caB}e~VBj2F7MtA*qB!3b8jAoPJ<`hBK^%SC z@Uc7EDAiokVs|{i{PQQ_pfc^Dg!o1XZ)Vv6bR?;I+$tIp$7e9q69wO0l*{n;6XaW! zp(F>=V$^6UD8|}2B`JPX{;O;E7t8nk0^(NSG6#8P+P40BEVpkKwK7O4u5B6Z9MVoy z0%g-B-Nh@(VZ!+jU;Jj;m-aJ#=|{NzvS0rL_>^_7Qd04gL$QhLE5EJU`W|) z>uBVfN7BD?_W0*GY2Uw)|JCq_`rR9Z#>cChYdg#}$c@&@n`hK^W-%}D z4_Tirf+sw&bbbwL+@=OSF4(g>G&cC}ax}1N0^L3OfVUm6k{&jgBkUC9lJzudnaZZH zvez8~9Rl6H@tznkQjB+$d<21x-rqdWzqEi3^X7wU|EO5E_D90jq*mTk(cDo(W;|du zOlLy|x~pj~kE)RImvN~k3;IP$+RrTivAZad{eH`fFW!;=JipGxwBuc&nj9qYtNtr; zFc`G_NI@tR)?TM0i}Z=!A(zBQ+1BTVGT_EGWBtsm7Z}bYE+%&Ty1NC|DW9hyBr1Aj zqN}6h*Z4qCsPn`JSWFk(r5Rcd`Xe;S!3FOYi6(P5aEw&CHmZ4`%kTn8Jey&#OwR=?<-UYKSp$aM=HcxN5< z5vGC_pij@u`NLnym1f9rE)?%5TvbsOAL@-I_gR*}CtVwRaWiRP=MxPYpfi215IGSx zb(6qKpLVq?34LU8j#zriuAODA)MJRt43X#1sSNs6QK%`^Dd>ePM+_NxWric4fRc)}cVI-N?>XLnZA;C$=WN9kb!`k;?>1IwbSyv+Hs*+SZNG%}u{tXM8g^#SqWxf=gGAti5YvdykaEMH4^kzv~KQWJjWj zRYB#X*U6%FAX2$<=C}7nSi)!E2`3qIA=4h!B@+0Mdy6@h%}_rn3hpagoXP8#OQmiF z=d>wuQ{88vvZ}zx89eX64wFY3&>@Q=l>AErwPW+amp_i;&pGI8+bm-o6{P3_k4CfyxixJ(YXIn9y0~BP^6Q)Ewe3iO8!Fk zq@g;PqvqWe<$qHqwdfR>5Lhmk)&wj_P6)5x+eU1tso&Pw*V)wotxDVv0&&5!4P4DH zP|ue@=#CWd6%{dp55yI;SwCI!>TJn%^qd{ir&xgN1n#`&G7aF_p=k^ApWcN1$b#a=wbp zAA$z)U+yord1K4ZD#rl}PeE z`9!{zW|_pLB|)LP7O`HPEFoQf23GlZPU%yvg&6c=vXCHQrfz5qc}G zAewmB28+u|%+VfKs&5YQlXzY|$=R`!GVl8hvM*NE+gSsb7bYB^>mnjm3^Lw)=rs(C z57Dm>8r!)333EYzIPs2J0b3d=0uM+R8#XMaz z@nx-`Br%Ez{{pTjzlyuIv_p%OA0VzYSBrJ4ET%bK zOWh>icc*(&S)M}eK0UWsH;>|Xkq}}-Kk@SIZilU4bnjKrfgoUG+kRb)nJR8?LF{S^ zv_J3PAFUEA9;_8U=BM}ytzHTU`TE`+LhkziDLq~v5O@3um(}wI0=-OLt7GCf=vrq? z#^<5bY&GRlH!O;QZNsgUaFcRT@24e~SjI^E=BnI10v|(G~8DOXe26$nMJP#WJeJ!b09i3YAcg?n%*e zz-6@TDTP?dS9-ptfpNibKy1w@C*GDToslGC`x9frO(9mUKhm@>w3EMs4lB^Tc}EAm z&J0gFLzl2)YINnYsnMj(Op=)v6^_ZqZPF($dcRgFM4*JNj$C1lUm-T&91cJCax!c&; z03vuUEVm}=V7o#NyP{R3w03jUrOp$$^lj8fEn0uK8Pe{@^pDGkHs*x9 zy~i^?t;*hAmasFqte-nmj4YGY+>azCVA0F@VI85nKLzkw(IJ z@bhFPFWUyCybAcnnol`jqyu7gkv2uDYGrt65_0bp$3et2`zhsoriQBIp>S4tlnfv@ zNxEDGL2LD}V{h-{GNsEwGV`TQqa)04N-Xe{pKjIpKQ0NKJ~5T|72xb3WCoEkx<8+p zCGo2UC}msJ4#gx1VUh+Pt@iWE={o32n08j9@H-=UalZ4bhBJ%X=d^3!8!Dmhe$5pl zB=9tT@B6tBv0K+!iFc1mmaL)ON} zNFVERfFRacbp9Zp>PY`D&W$Ip#Pw&MD5^qiC-~7us&3lMM^8?mxoiJ<0#5GrSOKbi9zr zdf*_6X}ldcc5oD8!7X?8tZbm5)W1lok4uyx-t6V`Wb-O|b_&7!qSp1>RykVYogCK^ z>RS&^mNac+v~K8oBF2)GAb0ey-+<8p?5f#&<{ac(YjEQ!ltp0Q*WRmDyc^3ms0c-yq^#W~| z&adpwb27`Pr}F?-Xtri1tIo?ox5%Ck%2#9ay+ogg8sy0I{kK8)f0m6_@7C@o1E@V8 zhLcx!g}7{t3P(%WV>|8~+y5M&_|m`pDEFpC3{ZA7zVp41yHRT{{0|2tZA)LtL}jf6 zeM!I&<aYJLpB@LLGER@p?Kzj|0U#y~KIa%2=H9z_w%iA~($on3jf4I1u zdJON(Ny}5{9eTGyr#{GljX2!s!%U&3{aI`g&x!$w_U+|TA476nZqV>J)AQ90b}wNb zx#hQ=U=`Q_wY41GX`y`4YfmT|0QV!q4-zmTsNs-z^ZofFP&Dw(DV>-ouUitc$-DpnN(XPQ=YZ9^UwLRW3hun zL|D!8O0=_k4ZC*QFfZW>F!zSidd`3tt{qHr7uNHTSeM6;kR{I2hZ|&CU*K?7H*sti zUTn06+2kN$7`7Zoz#igGJ+3i(J5EjYQ49k=Le!#8oEb6LL1Nu72lkmgaNt9h`dOX& zF`r24;dY$*jfkM@hz4nHda(G{=>CjNGsTb^-NgQguysGiwI|Z=mIND<5fi-i+E%~!wiFP-)s0cF z=`NWjvhkW|16I1z8a6<~w$E)GVp+JX#^|;Putf)A#%a#Jq&H2?7`bpcK0OXiy>{oT z=YW??mjlv4*^Ds!>f^OXS_pon@_-KZ zPOm>?I%n;$K~X<=7WIkPb`}ZwOuf=J!D%K9Y&Wo+{vEZ`#VOwYx58TFi16=(%NAQt z?eG4yj$YOuk^L)r#-RPRrZX-DdtMNbPP4|Whv$fD24>!imbnFN>u>3>K9I2=N3>3H z-rY31naxXNdhh&WR?@BELNE*C*|Ns9e(7q1QXg7*x^G@B1j)hrcI$kNje(1qZI&1K z`bpRUA#~q!q48j8mv1CmF3A1-pSwp{qs|b$|7?u%Q+7=ouib0jrI8{OMoUZ2S?<68 zF~dlOxtZ9;)C^f1W%j#HBB2kX9B-wseJ;h|i5>9XSbPa~eChL1*;~G3^o1}8yy1tBqmx`#!@1J5e7-O`sS*?W>;h!GeVmF#rcVHRUS`49HD>} z;gyZfBr;ebQlmfM7bRW`;Ly}L#zD%U3p8~lF#K>(hvux75xPqmA!J=H{n2@(GB+>% zX>iB5ttv~`qW1$8oyA?gG-bjj*4(@@FZJS-VL`GMU#2xXL3A6%GwOC26vI;pk9f`p zl%pOZy^VMkx8xa^;2b=P+r;F#w;Bk7$@W46z>jGdK+$sePq^|gG}Kmq?=J$<9uBI) zVAP(cmc~w(;W9KX0_2g+DOr-52Q!r|4>dwYS=}`bWhcxeM@GpD+U1wgR3wL->(CVE z3gx%b{JFfjb?D{ynqmmT}wMAFgUijiwm&eT|}AW%gc*n zq2fwuE&eS@?TbQ?794^5-aU`JayMQ|Wm^6gi>Jz$QzsLM&uSPH&c^q(ZxJA<@O=jG zfYig&y5kyrj_cY!?ipRUT^<8^l!Th8DE-$4ks}hW=bo^vZjdpS&xFIm=n*A7)~~#R z(AY`k{kJUpj0<`W51&)Abz;Qqq=;pX;J%yQM&J95fV7N^ThQz;ka619a@t_EdTeaW zFQDCB0Qv5LaW!az0nLJ2g)UQ6jT);1d2*FM{ z(8Ozr=h)V}R@rZR1bDlK+xY`X0Pg2ZfvzRvWM81L&(!c^5t_c%uvNwM{ ztQw!wT8kuLNDLBpBf9A-3$HE2&8G`jwF!Ykp}Ubo<5|KFQS+zD##K_;9PCiTzoUCT zEkA8sjI}g;vC5)IC3k6)1HvFGraO9!Ki$6AbsG7$EU&^QEgkOe(j{@5eWluuMcr2C z{b2$i*z0_xx9!>Xyipx?SFa}Frn}a<<^M{Wx)II~U)Niz$9B=}p3F)tLVu@oApK6h zI0{sxmBul?Wv~Hzsq($gJTEW;XEUfze}1rSUUYM+TQ+5T%Op+Sz0^xd2?gsGpSMQfK2U(eS-0^t+tz zTKt+yI^_0LTIsg&<x&Y1ohzs@#ye_<9?y^zcIjwRuk>(Asdrr^~mZi*MjE z!Pzc=UZVb(FYw;#_kMyRb{^d2M+C%Wte^GHr46ldwj>@FcBK#7&ZjeV9A;AmOq#5P zy#5j%M%<9sGS0#Ig_5x4rLBuwx|dpUQD25;CW1~$jJ0mCUnfmxo>3IXVrMW^+|`j# zK2G9e4=6dCRz$AT?kwAoiB!%6)Ecs8(t0j&0;%^{?VIQF>4rVA?YkSk8@FMpota5O zknh)R7Tj6MEjL-8Y}5`vfxM^x?s=O(ms5*K^pSrO9h)eRzKEy1hduT(ZrzoU;~Xzn zJ}8Ynt104C&_Z0P5pphVQM~{7`pR zMC*?%m-}ib5*QLsAXz8P^P!Kck*{+` zNK*kHpP5c=eN*Rqki~H^lQPn)`1D8exS5`u8epH17)Ivvsc1)@KLj_+tU=iLA&pqU zVXbmS4qzFgn>g-ZKPzIIV+8YV++RbX}ouU>MIWiU8FYQh{(1f>Ee*?1mPK< zKWK&=@X5IR&0q!U&g2MfqC4Po z&dK`Iox$1Eaq{Xq>=M_|Md;80_`IuvJR6!!&E8D&+~T<^^a6EkeytWs-hrO+o92Xw zu9N8tpL0adbIOmevoujwE0k?xT*7@F(Bu`8*Jo)bV_0~3vzI!W&@NWCd6&Mh?>rC+ zW_WiK&e$jfjTFwF@ySp+uD~=SUut*yJH&taE^57uh(80aS@V4h`1HidJ?2AE{iG0R z92X{%UDA}&=IKc94KdLZ2+rf$m0k_y^bM;(MZbuoL%c$y!ImN;exg_8;(a^e zAJ2Hv-QHWL3Z`fINzcU?anjUmTRv1Wn`0v4KjB@X4gD?fAHz)p2pm21sOi9M|+C0d#(wnh~v zo_+{H?Lt`|S)@@d*8-xSr|VnO(Wy(YE>!C-g_lsG8rRQpY-`pp6<0;G_FdGKSfX?qfkgo z*FO53_=QOG;WGKLzA5k z=!C?qH__uUw4}|wGjSNvu=ltp{3%56h-Av>L8Z?;ka{BdAX zoHius%#nX@BlXY_MDzlC#m`-bYU5W&nr9aoN#3Lgy1NhU-mbji@0WgU@XGECXj}Ri ztdFmyyXO@uNQkJX0_ol3IWyQsL_&NF0o#Ko12yGhlco9)q16=i^vmUwTU;^`CmmC} zwCRQSLw*U{fp9e}l`<0_p0U|c9x ztsHqMI12F2CWmk{EmAF!0kP0+l79ZR4_Vnrw0AgXbp73$qj5hae3L$wxEVvo{@uy^ zA3LH0BqV0}A~VD4wB0w{gm3gJ;P4J#kVNqpn$uR%47BujSqlpkqzGc?Mt)kW}ZIKD%5RiRuLQGR=YD2mDX7sz2 z36YyJ=43H5tkX8@aSho0m1`hmF87NiAJP&oJQ~rfm1zQAHp(NSym>{U{4$@^hUpU8 z!^5RR1+zN46-NwQ8Yu~@WcuNiWW7RF-A|eT&k(gT-~#xRE^Zvm10QQ$k#^*o zmtjV}xTYpbjMFTXFyv71p38P}Ox92E`3A#j%vWPq1YwK%C-AO6{WaBei=0+Io0-*e z*xjsdd09gg;^sNvY;&HJcRO#pbX<4BkH6j~QER-e$nc#1v<_Rb-CyY~_z?d>=eb*x zyt>i*{pQ*}ne@;#S)P6C%T=)nG!c3LrD-}|?>Jj~95TpUQ3zdEZY22ya5~cTvyR?A z(C8qM9M}|!5{(LudSj7#JSPk$Z}6m1;Ej?Ljw9mN30WR7O~Vo-snr2l){)|C*-PCi zm~&>Sw9vfty&SjSOTl6&e$sK4xDdr%=#f>*cE2t8Nh~5V`>~#WZ9PvD-hi{Nn#D3b zG4i&5SD4T}{;W}XtgNYWt|#R-3iD9l&$Fg21t+~_dV7wf$V$-aaK}|O<_DnzvJ;O% zF*b+eL`r5Qw+NeMqhSvU{hquY>3Y-}a)>l-T63nJ2%XH7ZO#5pef52u#LkhlcCn24 z6k7zoNZh@!Qg4BUpZ+Ud)pY3y6q0=-Bq_`~OZf4cyVgpquc? zk&m`Vru~$e$1``zs{Soa04JccvJ3y5*~VUgL?dyoUR~zsSmy{jwVYA}i1L7ZWoP8L zGer{+47;*~>)I~teuRFg;T9%lK!})^Q8EP+V$J94?ZUqg3wipuCeK%}i0Faf7J=)} zf}xJ%==h&mvM4EhZpR9>UPU9WI*u@@_;x=w zCX@xkBfUsO74)PU_QXUEGy(~i;m?xbK`2vhTJwwloECH!!h2sEsr9Z@i+{H6k&g1Y z0-UmywPEc5z(TUZB-awIk8w-Gtt#t0S%k9{4fF*KPxN^+pVz}&J(qYMXPIs=fsubp zOmt_f*c*Q~PbwsqeQyuC8MD#QS*!3b#JLZJZYHKH7VdiG38WGZ*iFG9dHoz74oRf> zMW+y(>AA2twztx|>-<7u=eb!HdG-?)*GfI+CwOWMy`8U(Rh0d@=zFUxwF$z^oIRBt z%K&Y+zHlZdpthlPC`);E?eba6?}x51b=;iX87zI{GR11)*bkIng+_V48z2m5M3I?` zkc(io935EEj($6K)3mdiPth!@J-WxS9I_v5Cm6LzI`d=SvI8ZX!EX3sj!$r-I`Y`z zVkqdCg8CQX$}eBYi?6O8*ZZ4RBM-=WTZJZZ1QX!TKZDms&l(7EG~ic0d?qu31>1sBY;t?< z+;yz$In_IR{dM(8;KpBgwI>>I$b}C`VB6M1hZW>Whwt5AyzSz9XKr;&;WM`j~QmJ62XMUFjcgW_MP z)qHR4<44)Cn@NUbhw{ z+fia8IW729<`j)!TrXtrH7i-W;kxXq&`FxbR1*x^XKn7%4w$dIkM;p_bkk-@wx|ch z(g}(n5e%6y$n~m1sh;}8F_U^+-p1DGkT@=n{-6ll)lC#VTru4UCA!AAJL|VeBdze1 z#J&0V7_P3gBM+D<=}T+7$4!u8P7fUbU^1R=;po0C7n-;>wX%JKkuP!BJF!j6>C}7T z))oSdm7mW~7ooP>{2utta!Lh>`7ywujXi^Gei5L}Qv0FK=$$Z>sAb#x2TvMTjF|A8 z&QCwsVy(N;(ei42S?$ZuTnmy}$vJ`7(+SU8qoEdjOW~=f?`om~3eb8qE_yrmZY2-o zb%4To2erCstGC~E903{P#;|xM$rmg&ak3~R#|H$p+`YOWq-3pm6fg6g-3%A5S|??I z9W0Fe2k^7zZ{F+22pXK7sh>9!lDu1CGx3{!-g$W)+?agWJNnwe`;kR0jjvUX1zy$HrivUGi*7JAwcW_{LB9;0~nWc?ks(HGe z$fQ;p9QxC>;ta47*Um{72&`Zy2c*dGvJcX><z#T5|bzRrCKQZ za`NC2-z3ZcdckEQ^GKQt3=vnm;(40~5n4j} z%4bG`T1L(vjVZFtoJ8lBXJ#x}Ux^6^3_B$o-xTc!U%4n{4r~PFDahnwVUng3T7J6r z&V?4|nH90w&Wzgb4eLk*UQG`rd_MY?IqR3a?h7P{El=^H29dW zSa(g;&r03!ig&*u(HA>+csU61eG#K+Bup-BtuemTUEFl~VrhW=_t0WU)mSp8$b0lf zPJ**8^~(CD%k1Rj_j(2BZ4NJK36N!6Qgd6^r-)%FjPTRZ(2QM)b+3dR9?sJUa$?_t zYK@tX^b1|y#EcqCzQ7?C-pww+-#Tj>&g_5dS^rg5eL?~ozxlNm+X+GL7TQha&RXXA zf?z}gJ=0rcMv?2&sli!FTupMP?G}Y=`KXp&l%XgqUDhMJlLGT z-uM-Mum4r>g8iF_3|Gz|Vnj+D(fcqr{h&HA*E!t}O))ZzJ1o(G@Fq?0mPLBLA>s`O zeVPlxgnW`zWj;-&E>MO3(f3AI+{TIMpDyh`1k8a2(#MUvl5jPQ%WvqtB~M+MfKaL( z@%&KwAJj}@yhtiT+3FtYnlb@>!lUUSd=!A?KYMLZO`Bq)Rjxb%f${m>lluI@EHod@ zhixp>4{)28C-};-{*C9pvyw;J1v}`i*(#zIO0?K>&gIrdBTU+EosH$}82S7R&C~<^ zRl*SJ2R!Y)Y=gI4PyDJ$4&rvGzXpat^@Sn`Ggp? zANlt*h~GOCw-awWsJ%<#MuRYt<@AoXm8XPabRDIjN?gRBfc5 ztsF0OrQh96Tzlg(_>gY^tUby*AtT`n`vePB9sP@ZqpQ z>}dH5XG#*`%R_HH*D0Z$dBy(;KHurSZ@VhuRG40V>#I)uqN$%-vdS%cUWj$4mjpKe zt9xs?uOWZZeKb1!Uiyy1j%>Cff9VwC*fAC#a%(#rd%clm|p)6B~ETw-q6 z*f2wuyz`-KqY-B=xw*t?e`RdhrfCFfy@h;-E1g}B8OS$}H2l4G)_>mV&PnNwkRzG| zQBR={gUsy(>yU`>;Ql6SSu&p2aQ;WSN+Z|ubN%@|45L zZIz9XMt96U;k{m9T!^l zUH4aaKOATKk$K=T!V%}R>F=JvV2clhfst)&$RXp#V1c0P88H*eST(n zq&JEmKFVJ)=z?G+AZ!?&yuae}&v*tsJMJ|ii60`Tf75YTkbADx(KCE0SYHb3{EEMC zR@+e=f2gJ7#V)3d8#<3ZXim#HPs&_gd)?#mKl#=_J@bs9@7gx!w57ZCEyV(1#w#L+ zE1t{^pPpUv3zAj76AL1oAg;P>QETJ5ycewWj=#5kl&tivuhp=3;$=8n&L$*ZMY2Ok zgMC=hk!btj8#HO6&JyB6J*P%Oe4eBT-Dqy?|HN@mGx*UkYN@Dihmf+*_&>y*ha4O) zPH>5aEcUc&^fFW)ciX-xd6l9%O}jRM(K^@0p23xIttctTPOzNqNV)D~9+bA*@D1tZ zxx=?4>Jm~7RU~#L)?Psj8>cqpHkOQ@XXwv&+~ZAj7`;Dk^SU9>FPJ9idrQ2@Jd=eUthOD31l-6|v`}%vZ6*8bkf6i@iCKK&H zC-}1mlHn-N#&}x1C5usHQo3oHe>tU43gjAakIurEsCiIXicY8UkYieRLZ)0xyrbTP zp22?m?sjT0hqogrZ^pWA*H+~tNuX6;r_ScKuhEK0;J1Rf+?KW_hT7<`>jK2!o zVO)&}*A+40cuDJgliPws?paz;^AfQ|EEyWo+4PX?!l>T*Hm&vC^cK>b=C9s2kJ0^M zWj_Oc%%oVb^ZsAiIaYurerMBd6lI>CE?%!#@c}Nc8-es>Og9D+1u5v*2pN+1Koz>m z(EW8TvgtJd(R+qL?f;fH&IThVe<(~{i}3P{rJ$s61qRBgO6fAFcOs52wSP95CccgC zos0SUPd^fl5);4EclKii3S*4ivxDZ_SkuO6$qo{LX#U>#uNvrF$k&sOoNDem0>~?U zJ{+csalT9;0-3Wij5p!+Nk&K7`B{&y=&MwXwBx(@M*wKi&RSA1HVU406Io~6_I9Sm z#ObX&W!ea*ODnQ()w*6b^)4mOtED)!sxlEPd7$F@qG&z!h2vNq9l_6lA-J6BUdJ^( zuNs>Sm72}{DOGXSHo}22su=5s60Nwl8^8Pa@jF&o@~uCB0v7M(dhUsSmUx#LM&HJ! z-H@66i#~Qzj-~e7)%QWq$n=K0v@Pa+d#Yx=HQ9o&mLmAM9nx=RCZx{Yk&oZ~O^!`XNE=qKnV7xfOeKbe*@i#gr^ zVTZ|GvF(4;q2JvG#HJ0$JU(fHt1W48F-RuqS{OYbQ^B- zJr9st55ifr-jTr15kL8FavCl3oi1rH1dRnv_s!eeI;&EFzq&Ta?n|K-UX0kV>aZc1 zBu|;HUb#fwSCvQdW?E6*YS6X9Of{dT(uWrPQl}G$E`a&)jV7BcQYt5LZsswg#EYDK zn553Tn_*gnv; ze-VN8@8RTFdY4NS=e#wW*p{qSdf6-(tXsqH%D=Yub=k-a1S}Z*4DhfI1vA*Q-bNSs zD%HL@_hfL(ORcf$L7p|IN^;htvHgXe5g29}w7sf1(~b}*k-}YWp2r@|ieOj5bmrr+ zmv~KoPxsX1;796EY^=>8tMnAfJI2NQBTIigg*VTQV}Ny4Fw6`^3A~{~R|r1+k=y7T z^bsjbkTZITbG2di{1C#kxkMA*yohDtaHp7bSNuku((HgXlVNJtcS{y^^H=$HefjN; z>N+(lQm)m0qWl*wh4eo{JER%kp&{VaYZt+(?epO`iN=!oq}??O?0VCFm)l<%PSb)N znW&O^IBCD+Y^TJwPE$ZO$0X3K)m865C1Iy%E>i4mF+mFJhi#t@I%dvMDr!N3!eL); z{yYbXke#x;GqM4Yhy%RS-bp4v>q6HXJW)b9QDTTOT{j|K^wU0gK3pjXtA`{-hmHUi z$ejIpvjVF||HWbcf48>K zx8G|b2ino!>(neeyv4zvKFC|X{MWS?_D7SpNuUP-Ebbz}r1V=noE6|swNAsVzvHW> z_^Y2{nn+D}tO?s02qH|4`bu+dqG5%ZBCr0Xpj7hn6^FO}+^c zF1|{!X*gzJK*kZ(Sam%xTLC@4udn@^MrzVjfkAE{umT=bRQs5z$R4vQe7mtGN_qY> zuN2&kQXl1-K>Z@|RV8O7eDLyBL>~Z+llo>8cJIIHnD0OtfBnnoPUx zhdp8ridfx=LV2B#b*yn^j^$~&()kI~7r7fufn|jP<&U!OI?X$PX%D`}lXuHg6uCX2 z=A5$QlyfGU*K}&R2bQj4IC&O2^zyI|A|9`nb^m`_79#DAhDU2QC4#nKQ|S75l=2J5 zz2O~)Vd>cQNT0w3A_~39emfOAEp{uXSmM9#bZD^j$9b3;XoO-Re2Y2^?@dMO5pO*c zUFfVZ!7^cV%%nuQy;AhK%raeqVsJ|i)p3qH_fyud%@^8ypgy28BE6NCbU65?jdU79 zP<|YwnL6Bh>QFJSGyF@WWD(&KQ%{K)9xVW!tea0(tc)LFJMOnFieG*#tTuR#)z^^`MkgN7TI$qblTN(@%ogv67pbEE)LGJngnH6X@r)#F5%=7t ztW_G!`4XfPXuN-I+0qes>QCPJlGQ0UZ~@N;jiWDT!W9&2Vogct@Gi?Tz*b&itiV1`rLNZ ztRer&LD~E7yrPIMmD_d6gNkIIc7}7j_08K*UYv9LKVu>m!OZpGWq9L(u2ch?s77UQm64-8EdPs*%9R;i#R|Mbrlq zGTZSp$Gw8(s{fQR|C1wy(7tl^e{22p~9%}H0G-an*tAG1cZSN0X2jPfQ z0Rixyhf|Cl$h|I`tNu9Gz!l85DNI|@q>Y&criRR@aZt2i+YQ~{OKpe8q9T*_!bA4UR#0bmzn5VZxi@ zm`9kDSj<|Tj)tON;b_B4@pGLCn@MO2<)_dge{r00q_%9QD-ON3SB*Zc7fNFL>GC9r z?tq3MJ@w-=ot9_=+srf9jDdY|PHR)X%_x6Mj&ts0qoAyRprr%rwkwhHn#aOk3JtpI zC#&R{{Fw~~6nfF<8lIB)Wj-n!V8|}qt)hANrJot3|4#S?i^@84RZm@pR|^#Oh8S88~0-in*_ghUO>H zWg*dbvBQ@sot0+g^*RmNb^Cl<{5%S{Zpnce;vJvev%BZKALsMj|6g52B#lY# z9z^HJ_nQ(PD={QNN84PpjTtV?tuw+-0-z1Jh(V_*vgZ9~9?!?a36%a0C#<$yBv4BD zuH1a>Gj*;hY3Q(jD8<{ zO==nRk~C!JOXX||kt2{IAUqfpFLd(~yI=LN1+ao{VrlyO5VCJNR7<2IG#^>`Kh@sN zxF!5))?FYQz^M|&hJ!U9JM^pc|#_cM8{#SolK3igmmG^kbfU3XLzOG`Fy z9R~RQjCQ>_a?e|G`~#k_w|m-!vF|>AR?m7E$O=#yuLl<$U=ML0#E=M7Y|MDcp%StR zY|snDYG$=cU~#r{D+ALn)L!0XaYfa*-5Kj&Iulnq$0YX#`BFbyz*=4>F`V&C?Q}WG zn))TQmzlK=22=u97k`>_eqIt<>9k!e7<4Ra{vR&FKN_pQzicG(`N;44HJi`oRMwDI zRHyF=?5ED>TVz{*MnDX(pMMke9*II$rbQp`O2wYbAt7Q9@O(Tx`#m=~mk$vTsBhsb zgi-8K0kjnGymayM4Efk1rs&8v5-2&g2qgKfEu)@7N{4wW_&()VS~~LYi_ikWay0od zg9x7!oSP`;k^d6ps7S#;xI&qx6k<%I>n<&RIJDY^9QFG)y4`+dVt^m>BLCgFjd6RN zvw8p&W!`8TLIb$?@qJV)fw@v9ppOu&eb}WmLORql8h^M2(->H@s_lpj97G+=8z+*i z*$6QoMm`<3%_%Oi1Lty5=SYZgDW*ZOxOE4c19!Vs_H5 zb|Pd=2r;ixuoOIIbWZ-JQ*9zou_Qu?DF#8C5OOXn$W#oG;3}WYwx5pwYr1P(B#Z5Nx{zJt7Kkl$$;ut7(JyhBZY7P7D6$uNecP5>w zq_#-8of%EvoGYdT4=hD*NaR={;<%BaWTd3mTN2ChadCp`&~&7e%38|LzbU^-#=o=+ z;(`)!;>`p5Rg& zBXx|lhQiNUZrKd5<08KpppJWV8iKR!Fvm~y)Q!ZnNbSI$pPnafOlNyggf#@E{bh#Y zyeE~OpqMN)n^gx9cIwo0GMN@o_7N23r zBHUg}&U$eW@6ZwOj3ws$S>_C?=n*|O1Q)0CyhaGKbMz)}Fwnsn3h2AVu_;&V)R8aV z>V5C?*MG{nlu9fcuP)t)e|;8f{|i0wam?tg%dOGA5bKSpX?SEeHT>pq+_7qJwX5v< zHue3Pne0awUybg$QWl4^gN??;=2spEEJIQ!rAyY%gvIr44Ja+SyLJKi-#E?x)ETJ9 zs7zn2Ob6-|M $NXo>=+Vt64gUN3LN?#pgn016rHlXI;Glzxi%Yr@OMw6RDi3JV z5!iSg&-&uw?!NFmx%Cvw$ML1<;Y7Rl#EG}f^)L>y*xIwN7c$p>`TBCHy};>6x0ptJ zJWVg@Ac^JGI&1UA?(t>4#O9G_5iYtuTs{W)jFbA6QQ4aAjK~p91mG7eD(VJ?Yw;na|-HL$cXU_~IuvuvB+5mJac|+dzTth!iL3p>7uy)< ze#MOd_1Q%8UhLfO=3=`h@_oaDLeiE20V_$;K7l@EyX(2azj|8=Q#d~EBz1!B4M2~t zCt|LJrLya3i_yjcd?hIurH*tv*8-_dGe2-KhovVfHHUo^rxHkrv`F&2g6A&{*qS@a z!8W8yshB-NGlzzd<|PBrmsY@I>a#f)EvFbgqaY3hOdk1@AeG9ceX>f)zG%Zj;O4&=l& zKS?1YCU&y5wQasw{c|30-!VX|;)j6n~Hy z@|Iz>s{JIhrdry@_%692hBB7n{QX6O`eVfjO_B!@?rDv>+otxLo%~JKa{t=<;i#f; z5-d{SYt!#Q;())By=`W=nA&ktqf0xx_Q#|Y865O3QvY!21WJOSALf3J9>)ay5RAm( z`AHckgwA5Yj_7c5o;Suop-fOFvOGyw**jiX>#Yh=hTq;YGr$x!Vs&mhDNYs4=A?%| z>}S0-@E*)_gewTaRvR)K!?g8md_@A^Qr5bode_r716>WNyY|-;=9Er|?u%QqQthev z9ZS2ST0t}AJ8TQeT6q$|$u?QQiWKDngPQ287_AmKtR^CsXs(dsy|%pE0M2c&60Ye-d@(=?|CIf9>UufPv|{D{fm4 zR6RSu%K)$^8*T9OhGX}xia!5N!G;=W2PEd^J*j|r4BPv(<)`Lu+OZz+kk@-WG#%gG z(;wP->zckHv<1%eJy*)}2+@$bpn6$y?92u{7G9M_JS9N(YI_clRM0!}o{YqtqZ=z7 zL^3^yfX7)v&#Q>7Nor9*q;7*yHLO|6jl+~K4u!<&Y^vn`4+%}((tG;+*OA7pw=WHh z=OW%)_th;(|A=w_t&7nk=;SFguaQjspsF!H9b?cvZo4R^NCs^7r;CA~P&(vr+z3A6R<`ZF=qUHJd7)H!+yc0V3gYIpHx=VXy z(Pl`b>A$>g$ES?>iB{@H76NJ>glbp23Zrzs#F33Kfha zmD>XcrNC;nFmW z>#6|g&tUjP>FbrH!@;gxjb+{R9R{f57(~@ES?u0=ZS^zOAOp(ee=Iq@i0w@8`I8j! zQsnzIL)$wN`lI*HG1|psZP&36vai134d?Nn!^??|pT5x-d@qnKCo#}|o(6aCfo!Z1 zXtVt?jR@*Xws3RtgK?@2>*ZMt(m=nFHF%FpzN8~po1iO;JNrOEM42PLioAsAE%r2< zpx4{F!%M}Y5%ixVuP-QW@8ERKM?91tt&{I%`g}^O90xebjk$t#3c(i5hIkShE1OpohzgAi!3-*?Ky~ z5L#G-?3*E=%?rKRzQX88o+gF#Nt?-$Krvh(JC@7_<863QFWtBa?YA$(e}j`~Lt(62 z%X_=2OhpLIxSSreLF6TbI7d=TeUwwqjDGwOvzu9ySU)KT9p58|1pkp*!8 z^?QmrSr^v@?6z(?y@CT?=ULZ{psp%XY@1}RD<4#tZ#5h~C0-MWxvJsZ%OJx5$%KS1 zT3X6{U+3-ZT-~8r+Z{bhH|o+;R{i(PGAoumj*e{f{)_F6c^g}XFvaX%U21kZUaCqB z8uS$}6h6+XKm5n4KRUXdnCo=@=N-i~9%h`&&K2QLMiV=n93#jfgrmpn>UT2A-L(|( z6|&{|{QP{eSgm(~X7nKWIDPSx$msS?Sc&L$+I~Kmebeto88k@sqU!!UAnN}LHL$zv z=!JClx?Xv$|FyNdI)A!O@732(S~PbmzNj+6v01H6i|sUT8a|4@5@Sw^LSfDH=}O$C zRwHe0>TiKgT|rZF)DaE@eT#9vCI)@v6mSeS z&tOpWR<)-Stkgh|Brb(l%yGMH`Zhy892pL9q@haZDHY~PZXHfdoY@bZT^1#5|4@>S zhaGRjkAMK0&biC(Z2j){M@~M&f<|-L{c=b1N_AS9l$-F=KQW#fdmfQP`aAE zJTF3jA2|O?+34RumLxjcUB{7;gNpw$Rs&aeGqdy1u7y}u8 zJ@>u1?_KwB1VU|p=CC@y<4LhGLgRDCHP}jh?u!OM#m5V(oCoiR32wR`2csvbTyH=J z8@s3R>nH13dcZ3DtE5D(LI?0c3>m*bLDRE801`c=;XUcD>v1h%H5)$NeSF-IhViUH1pG%J!R!%upKgV$@$-*8LH%h$4Pjc ztJN6cSS(nsz?43A`eygTpX8-;p)~-s;kn^^*$pzY743x@Ie!$rDQRt8$`K3L-01O# zWL{$J!WW5Lv-DoGT+9|LT@1yNU3dZyJ=f9LyS96=fFP=hhww7rku-}pJUBG736v!K z>R(wMvw3HGA|jt{QOFSyB60TKlqx@7X$f_bOEANZ+%j& z4(o=p-{b6?UG@3jgf) ze4C-I#@7TZuq!9v<6DX|uj#Z}88Uu~Kp_OaA}LqP{=rk@Trzq?P|-l}Mf=YW{k#3H zgIs9F9~6DbIX&=z(NJ3X-R@6VnK>oPKs!Ru(;PTA;>)VU#m3g8(`z&Cedmlz$8lqr z>rnd-Z)wFD0AR%5l(`YUEgJ}yIiCbRwA-V+msvS|ZX)Lz!Tn`M(6EtTcMp9^q_CWM zS06N54MZJ)c9&^2KZV>#%Ir8RZ>_UUV#LbaoZ~2hv)B2)1}nCS7&@1mjmZFTJkN=Y zJa8Jiq28R&d}8OkX}s%y%4uR{^e#>gYu@_5G(r6W{Xg!-8wu_JTzK353?X*Q`p*Hb zGK8vcL08ffcabRpr!0=l7_YRK=-6au?qpfnV1gX6tMVHMb04(;G>5Yjgdsa^R6FT~rJVMvq=l+Fc_@@EE5zrfquve~_jS zTbvP^$UJ|!9$Um|f0=S;GkbWgu_x=sEx1W4I&U-0`B#S-b<-OmYetnw$uY^glmt8U7K^7(ip4Tcy z1SJtD?TlR>B=OIYN017Zzr7Q1M2J7*XHNZ=*21)udSp0$siB9GyL@t3W{h?m&`Etp zVi0Am*eP5uc1jx@t@Z#MlzIujH%7=iiv$Zwfi!bNv+8s3?Xg0?_-P}3o;9W2!H;ab zd%NrYezEF#d8G{nS-n|GG?TM zPTjkAswJY$xsX4m7dMHO#3w;>1Cu1h%8q2fE@J)f4;ug+TL!Epp6v8{G`=mj)9?ab zUA*(vreS{1TZkw|$p$#o(Xav75B$PsWlEh6TNPAJXMt6RD?#~(Tp|j2(QiWL!ZI{cn1bT`0sT}lC8+8-0oB6ZrsM0&-$(dz=<)uB^LydypOT(}xF_7;CJx z+T->5ne_4TVDj4q2zUvCX2>1t3+4cmC|{o*Z!TDj9-|KFYu4jNEi z+8&2mcto+gt_-3(Pk++s?3PV-8dsm1l+m5Qs%9Qc7XXmX0k>)&718t;t(rWs(P_T7k?1j z{nP7^VH<$kR+Eh%58|I%Y*uU^7I!alx{0we;2*-Z)j7b^$U)-BOlK1~RsF54u59m= zG?tMkY;#Q{6YcD+Yt+{M;4z(fHQGmZS^85RTcDZ0j+lGV;u@Xb&4F9C;_cs5cv8)V zy&jW^xv*eq8%%$R_uWZ1^w5jy2T54e3%>2LuiFH;x$Kfx5;I$r$5exd7 z9qA{84A$N9lXG|^2M>W0+(15NN{S1p8?yL zVd7C#P*J>9t8f;#O`VPdowZgz_k@V+W_O?Xa)x*=TgG$Uajp~A=PaGCjnuA!cdj`6hBKlKm_+JHz4L@~sw%2jmB&a_|rMmo+FgjCvy^N zbE->e1(dzR^d!|^qqO9?kjYj^;?yzH+|c1v6CW#)nJRH-zm!9Qp<8=5_Gi+FdZK*c zjLgmm40cuztpwZ2Popt-zwmR0p83n{7~M=^$l&Hp@cW{Q#ao#Se-44xl> zG#6n`q}s}+8{iL4S1B#Ak}Yup@q4qZYG+B-5sz$z<+PC{doC@Som9$SXXi8iCb9(4 zhQLVse~1C4%zob~3O96DoE9_ZOrSq@gN210a$e4S6O(?9Fe2qish3QZY*TiPOV&4pDmaGGKUTPPN}HxC)&MuL=$L9Wq zapN&uW*Q?Av@iMg3#X3LQ@P>fESOy1^s!|>&v}uAD5&>sZEOzA2;;XtbK!*gmza@Y zqEDix8b*F?SvN~hX0*OH=x}I&A?i=Wy9w9z)erWzuRq_LYEfPk{j^w@O*VaRZ-PQj zfB>bZwDR082-i>|q6d4kzNKI-z?xt!8nK)r){ytFGZb1O`*j!FZBw`PmiB_oHw+40 zmhg5ruK2Ya?Rh(j?B|T-I;gD)Wh;(a4MvoWTj_nDm^r`e>K*1AV?52#a>XFS;#(gX zA9OcD22Y2PivR{Zr9o4n?;;pGq<|Lz)EnmNDl}Jb1V3*uHc|ZhP8Np`7jLEnDGT0+ zIx9APYx(v3*odfg{j|{8DC}0=z;ESeooMkHJ@1dTF|VwHXwH6FU=80}AwQj&g;>+&SOa!E1vvx0WnxWI*sKs|-E%kC~WSYJAsR8n^8=oh%SNn2O z+d;k@<1L;+2s;H)3*57Q*jtUX7 z>UEM<4EQC{IL>0UjJrrfyWWXESpab~c#xt9?BnsCRC(Vi+gW~uBY5=sW$(x|fd56H zyj6;|un`nWB^t%zG1Z6$!98q%`T8CHC#13{)s&_IrZ&lTlW@Ay)4$_MB>a7{%uItR)=vNL( zkaWp`cZ0#Vo3iPis-#3U>v)jZzcT)a@WefNBqHtplFa-&2?1*Y}zAA~pR) zmhTEmoy!E-;E>>jZr=Ei+{8cl@X^htHi%B7(sI6p-Y!+ii51;Aq^tNSBT<2-m1CRd ztVwz?y$scM98^?d2j4e{i(Jwz?vlKgFy*rpJ3DCdV^>df&Se?0-FMzXjR5LS+NI8K6tQ>cahR=(=HHS{;Z+)|HtM=5 z+^QRuh*p*`B>#@q)V+_Bjvde=q3F#y7~EmAg{Z(6C1%hI+;~3UdZ{j8&ox+nIkOb= zwJ?Iz@xf{6*5wfh1O=M$rNRFd)bbOe)ax%8 z&OT;2cfFyBQ5cOi&cUxKEXqumXdpFlZrxo2EzrOOBqkB$9Xa94kTWIdqB!;r(mcVJ zi?D=%t^AZgZxZ*4lHNSp1{Pt?K54IUD{|?pMh4dBa3b?RKTGcgw8u!NqDrbA>`%cJ zuO%+ps1K9OafyR{Y&<0Le@zj{P}Urkgnx*#*`$+_ z&=r@cUB}AEIY$aq***)bGB`49ESJiT2ULI?RZepd+R`bH^`mEdk?trrzRSHPG$X2S z{U_J4EEI;9S@8q7LraLP&Z51DhwQYa@0DApQ&UiuF@Vv1_4FE{j=q_JeimpyOxU^Q zZd~Y3H@x>blL@k~S|#qE%qzE@kRE>?KDE*5Nf7{1c$@071=$4MuT22A;Dd~d2Lsfa ztCjyE5Dx%xv!}L`%Ly}=j}eAl43|+E0Q-Biw}m7rQ%o|b=3j5+Jn_pvicl8xcgT?A zKJyggi_2{^HsD7O`h66u8pjqcj5zitF|LQZF(^MgHEyZRa+UfqQFe|UXXa16@KlxZ z`Jz`h6cJ7uA|BZ|T6Qt42=@wmr4}oGv5W2063=v+z^J5h=inQ{$4bW;$JBFONY6cN z_<>2$h^#tV6P28$Lf{a%_N%v*uR$@d7JpReoK~@Rsg=IyP%X^Mp9*D~R;P|FUj>q+ zsQaaluN(_@1QPDzFlMJl3Og&KmNY=l7*$%fF^^x=%-=5Z0L^bb_3g-sQlAm!-Zzv`H=ue4=cYXJpY4bs%|uC&n2O#g zb0N_HF3_@TWd@#vi(IFKFFm!j(Na`PXjEX_bGpnJ=SgFHCwkoorU=c*3$~oN={_-# zgvh5-oxJsu%-d+)^GfLY<_4b*Ht-_qF4^Pm?3o-9%t-m3DwQu3_LaRSH)TvOg_4Bm zB5Umbt2I$5_@@mThF8ba%irr*(^vCzUwqs)zYp$WpPkpL7t~)ZShd`Ksl%GNXE=`! z!~vae$;q{RohKOj_0Mtu)wZsni6~^9Cl41jWPO=HLy!rU->E5bO~;eD1}a$$6~*{6 zCnne_zRmx{{8l82cVCCex)dMPqR2nc}2g>VHcKmIE4oNkAdX}a(Er+>KA z$ed6;m?bi@jTpBdPrAF2kC6y~=9+A2qSjOYc?#+%x_)hgu z%VE^?;tUAKx~>_c`O9m)b>4GPO{pmyr(HGFXr8Wc(q)E?=qn8fSuCim+ED0NR-JH< zuaKRBMIfg>4rzxS*8B2VA@WzcsB;CK>n~Up)6Rc~lE~E%o&=T0Y?v>}&)*`ok?l%-HEmJOV z1{YQ=u%gkvQH+m}P;ZtbF3iVi519>fUdaxEyUlvd(hAt#QNTCxU>wFxT+WdlDflC~ zimdJk>2znmPbE2^O8S}~jJ;wMU0|RXgAhLWnZ5-}DR?L6w$(YYyr_Iw@ndA3EZ#@h zFyU}!fgLBKgr6{sr1HUYW5NC2{e%M~4SjoGP@F6!@+FcE38qjZWy`U_PaI#5*0}%y z*Q9u9N*mi)jcU;GCSMkTnsDa514|`VC4oBY3Ckq@u;rhE7aDCL2Ks2Gw2YzjZE&U! zwJ{EPQx==xf(IHSCg-1bl|%lt=Eya&lnn=_Gujh)>sw_A&6xG=#@l1BFp(Myah|G8x$SVt(z3a zDi^V9v)(r_J>*1K#e)U3%bHUIojLCH;b|@vDn&{KGn7pJl$%SN@g+*qSX*Lefy?k8 zi*Vx~G-swMe)L$qfooJJzZ`prqD!fuP%ku`?PSIf4h>10wl<3`qa*9E9w#D8ZLyvA zWCGQq|Mc%LwHdjPd!V}QBH2KfE^&FLsmoVg9wz|mvg$6f0&E_*2PoMz z{hQ?>HbCB4V9wz?gAf~=dGw=BzMFUA@F8(jZO65-cPi8+^_b|%$lxuZfN!g2F>mi(l2Wiht&Z$2W~ zoT37H6Q4B*;MN^uLKvlk5$I7XR_js8aOfjVk#KT$RQtDV%%09b?JIq!5oCyq`tw~B`Hzv+NIwh949W@~^HJ^Gl^SYfiy z4vP!G2E1lEseVy$9OwA{6x>foThAws7xuSFbKS-PwT{+LDwDEo1QHv)^H@pA+E+g(sTSxN^K@hM)IKz19$Rv-qp}n<> z5L+V$vnXDrMDlhtTi5Aw{9dX?oc!x2$3}+C+JuFqvyf##T=19I5>kv5f7*tzchrjp$fWDt3d942RNrW54myLlto3VRZB#E#<*U0 z)a*RthknMt1QArFH}ys%tG2F(jAJ5-c`lUnBt;zY#pG3EqPs5BU@5xo=m?$DadAk} zZ0GM4KYqD9l?=o`J51T%HkHxPb7P&NU%MD=u9}@nq7?nz9Yy2!7FE`-V2pZ>%owHC zEpGM_t^j5!&DCFR%P66ziIyWb-C^qpM7#^%zotu`klvQNOJ*xjd_(kJdNg|R0S`g> z_+cr6u=DrmMiYnfUPqUdSvEVSf`z|zvc1uumthd76 zaC%yraza@SVr!%8c9w9}qTUxAk(#8{IF9%>>wO|3=VbRU4gG(wIab1ON2$wR4hnpw z2)N+AI=2sJMn|3d4RoEC-FK|!3hpnd?ntl{W+7Fw)QvQ?%)_8nt920_EapbjskKI( z@;}-ei4_8CJ9Z%kcTKlOaDkh8_4#Ro$6xP-DxpKl5~FX6m6P4Xq_UV(G*|pa>*Jd1 z>Cp3tHyMrBv<7@ehX<+aw_M$N9QzhiC}1IOiX(nJ;OnIPjzZ$TsBcS&`VRiPs7Dh^ zl~t_?KC!hZO@gv+G|b((V^mR3Z3IMiNy+g%mHXa~xWD{7?yH~dkmbeQ2EtE2<*+B) zC=0X#BG0uJwXHdFbt)tEXI(;tC7CR~q>QqXoT3>E*3S`K*5$2t-L^q7H?*EID}QJ9QK7p^;}2oa^u zBhq?(Z$*%8AX~agWM;Xj?u@{io!AW9b_Pm5KN_9Raf%P%I4uzsJC;( Bqdv`$NiMP?d93L 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

      wchhtiR|@3 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

      HJQkQuV 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 Date: Thu, 18 Oct 2018 11:06:04 +0200 Subject: [PATCH 0259/1162] Add GitHub release tag to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0a08c12c6..1935d12d4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![Build Status](https://travis-ci.org/Icinga/icinga2.svg?branch=master)](https://travis-ci.org/Icinga/icinga2) +[![Github Tag](https://img.shields.io/github/tag/Icinga/icinga2.svg)](https://github.com/Icinga/icinga2) # Icinga 2 From 582d8f496156bcf9708dd239065f5ee4c02020f1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 18 Oct 2018 11:31:02 +0200 Subject: [PATCH 0260/1162] Release version 2.10.1 --- AUTHORS | 1 + CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ RELEASE.md | 2 +- VERSION | 2 +- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index e8861501b..f5c909682 100644 --- a/AUTHORS +++ b/AUTHORS @@ -71,6 +71,7 @@ Hendrik Röder Ian Kelling Ildar Hizbulin Irina Kaprizkina +Jack James Pharaoh Jan Andres Jan Beich diff --git a/CHANGELOG.md b/CHANGELOG.md index bc9877dcd..1506c2360 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Icinga 2.x CHANGELOG +## 2.10.1 (2018-10-18) + +### Bug + +* [#6696](https://github.com/icinga/icinga2/issues/6696) (PR): Remove default environment, regression from e678fa1aa5 +* [#6694](https://github.com/icinga/icinga2/issues/6694): v2.10.0 sets a default environment "production" in SNI +* [#6691](https://github.com/icinga/icinga2/issues/6691) (PR): Add missing shutdown/program state dumps for SIGUSR2 reload handler +* [#6689](https://github.com/icinga/icinga2/issues/6689): State file not updated on reload +* [#6685](https://github.com/icinga/icinga2/issues/6685) (API, PR): Fix regression with API permission filters and namespaces in v2.10 +* [#6682](https://github.com/icinga/icinga2/issues/6682) (API): API process-check-result fails in 2.10.0 +* [#6679](https://github.com/icinga/icinga2/issues/6679) (Windows, PR): Initialize Configuration::InitRunDir for Windows and writing the PID file +* [#6624](https://github.com/icinga/icinga2/issues/6624) (Check Execution): Master Reload Causes Passive Check State Change +* [#6592](https://github.com/icinga/icinga2/issues/6592): Reloads seem to reset the check atempt count. Also notifications go missing shortly after a reload. + +### Documentation + +* [#6701](https://github.com/icinga/icinga2/issues/6701) (Documentation, PR): Add GitHub release tag to README +* [#6700](https://github.com/icinga/icinga2/issues/6700) (Documentation, PR): Enhance the addon chapter in the docs +* [#6699](https://github.com/icinga/icinga2/issues/6699) (Documentation, PR): Update to https://icinga.com/ +* [#6692](https://github.com/icinga/icinga2/issues/6692) (Documentation, PR): Update release docs for Chocolatey +* [#6690](https://github.com/icinga/icinga2/issues/6690) (Documentation, PR): Extend 09-object-types.md with argument array +* [#6674](https://github.com/icinga/icinga2/issues/6674) (Documentation, PR): Add a note to the docs on \>2 endpoints in a zone +* [#6673](https://github.com/icinga/icinga2/issues/6673) (Documentation, PR): Update RELEASE docs +* [#6672](https://github.com/icinga/icinga2/issues/6672) (Documentation, PR): Extend upgrade docs +* [#6671](https://github.com/icinga/icinga2/issues/6671) (Documentation): Zone requirements changed in 2.10 - Undocumented Change + +### Support + +* [#6681](https://github.com/icinga/icinga2/issues/6681) (code-quality, PR): Fix spelling errors. +* [#6677](https://github.com/icinga/icinga2/issues/6677) (Packages, Windows): icinga does not start after Update to 2.10 + ## 2.10.0 (2018-10-11) ### Notes diff --git a/RELEASE.md b/RELEASE.md index 871861043..e4da2827e 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.10.0 +VERSION=2.10.1 ``` Add your signing key to your Git configuration file, if not already there. diff --git a/VERSION b/VERSION index 44fbe0238..ee770cbff 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.10.0 +Version: 2.10.1 Revision: 1 From fa3e5c8c31aa2a0721bba3294453412caaaf33c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:09:20 +0200 Subject: [PATCH 0261/1162] Remove dead code Remove some dead code in ScheduledDowntime::CreateNextDowntime(). --- lib/icinga/scheduleddowntime.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 80d7617ba..4390ca3d2 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -181,15 +181,8 @@ void ScheduledDowntime::CreateNextDowntime() std::pair segment = FindNextSegment(); - if (segment.first == 0 && segment.second == 0) { - tm reference = Utility::LocalTime(Utility::GetTime()); - reference.tm_mday++; - reference.tm_hour = 0; - reference.tm_min = 0; - reference.tm_sec = 0; - + if (segment.first == 0 && segment.second == 0) return; - } String downtimeName = Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), segment.first, segment.second, @@ -261,4 +254,4 @@ void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const Va } catch (const std::exception&) { BOOST_THROW_EXCEPTION(ValidationError(this, { "child_options" }, "Invalid child_options specified")); } -} \ No newline at end of file +} From f1597ca5bdd015201e291207a0c3a39761da6cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:35:14 +0200 Subject: [PATCH 0262/1162] Remove spurious string in debug message Remove a spurious " at " in the "Evaluating segment" debug message in ScheduledDowntime::FindNextSegment(). --- lib/icinga/scheduleddowntime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 4390ca3d2..be463613e 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -138,7 +138,7 @@ std::pair ScheduledDowntime::FindNextSegment() ObjectLock olock(ranges); for (const Dictionary::Pair& kv : ranges) { Log(LogDebug, "ScheduledDowntime") - << "Evaluating segment: " << kv.first << ": " << kv.second << " at "; + << "Evaluating segment: " << kv.first << ": " << kv.second; Dictionary::Ptr segment = LegacyTimePeriod::FindNextSegment(kv.first, kv.second, &reference); From 9c1e9f42646e8dc2ac9976719e245b6d9afdeb1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:42:21 +0200 Subject: [PATCH 0263/1162] Put running downtimes in effect If Icinga2 was restarted with a newly configured downtime that should be in effect at the time of restart, the should-be-running segment of it was not put into effect. Add new LegacyTimePeriod::FindRunningSegment() and ScheduledDowntime::FindRunningSegment() functions, call the latter in ScheduledDowntime::CreateNextDowntime() before trying the old ScheduledDowntime::FindNextSegment(). --- lib/icinga/legacytimeperiod.cpp | 50 ++++++++++++++++ lib/icinga/legacytimeperiod.hpp | 1 + lib/icinga/scheduleddowntime.cpp | 100 +++++++++++++++++++++++++++---- lib/icinga/scheduleddowntime.hpp | 1 + 4 files changed, 140 insertions(+), 12 deletions(-) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 777a1cc10..7751a7e02 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -388,6 +388,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; + + 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; diff --git a/lib/icinga/legacytimeperiod.hpp b/lib/icinga/legacytimeperiod.hpp index 9bec5b68c..57f3cae75 100644 --- a/lib/icinga/legacytimeperiod.hpp +++ b/lib/icinga/legacytimeperiod.hpp @@ -48,6 +48,7 @@ public: static Dictionary::Ptr ProcessTimeRange(const String& timerange, tm *reference); static void ProcessTimeRanges(const String& timeranges, tm *reference, const Array::Ptr& result); static Dictionary::Ptr FindNextSegment(const String& daydef, const String& timeranges, tm *reference); + static Dictionary::Ptr FindRunningSegment(const String& daydef, const String& timeranges, tm *reference); private: LegacyTimePeriod(); diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index be463613e..1809343bd 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -116,6 +116,67 @@ Checkable::Ptr ScheduledDowntime::GetCheckable() const return host->GetServiceByShortName(GetServiceName()); } +std::pair ScheduledDowntime::FindRunningSegment(double minEnd) +{ + time_t refts = Utility::GetTime(); + tm reference = Utility::LocalTime(refts); + + Log(LogDebug, "ScheduledDowntime") + << "Finding running scheduled downtime segment for time " << refts + << " (minEnd " << (minEnd > 0 ? Utility::FormatDateTime("%c", minEnd) : "-") << ")"; + + Dictionary::Ptr ranges = GetRanges(); + + if (!ranges) + return std::make_pair(0, 0); + + Array::Ptr segments = new Array(); + + Dictionary::Ptr bestSegment; + double bestBegin, bestEnd; + double now = Utility::GetTime(); + + ObjectLock olock(ranges); + + /* Find the longest lasting (and longer than minEnd, if given) segment that's already running */ + for (const Dictionary::Pair& kv : ranges) { + Log(LogDebug, "ScheduledDowntime") + << "Evaluating (running?) segment: " << kv.first << ": " << kv.second; + + Dictionary::Ptr segment = LegacyTimePeriod::FindRunningSegment(kv.first, kv.second, &reference); + + if (!segment) + continue; + + double begin = segment->Get("begin"); + double end = segment->Get("end"); + + Log(LogDebug, "ScheduledDowntime") + << "Considering (running?) segment: " << Utility::FormatDateTime("%c", begin) << " -> " << Utility::FormatDateTime("%c", end); + + if (begin >= now || end < now) { + Log(LogDebug, "ScheduledDowntime") << "not running."; + continue; + } + if (minEnd && end <= minEnd) { + Log(LogDebug, "ScheduledDowntime") << "ending too early."; + continue; + } + + if (!bestSegment || end > bestEnd) { + Log(LogDebug, "ScheduledDowntime") << "(best match yet)"; + bestSegment = segment; + bestBegin = begin; + bestEnd = end; + } + } + + if (bestSegment) + return std::make_pair(bestBegin, bestEnd); + + return std::make_pair(0, 0); +} + std::pair ScheduledDowntime::FindNextSegment() { time_t refts = Utility::GetTime(); @@ -132,10 +193,12 @@ std::pair ScheduledDowntime::FindNextSegment() Array::Ptr segments = new Array(); Dictionary::Ptr bestSegment; - double bestBegin; + double bestBegin, bestEnd; double now = Utility::GetTime(); ObjectLock olock(ranges); + + /* Find the segment starting earliest */ for (const Dictionary::Pair& kv : ranges) { Log(LogDebug, "ScheduledDowntime") << "Evaluating segment: " << kv.first << ": " << kv.second; @@ -145,29 +208,40 @@ std::pair ScheduledDowntime::FindNextSegment() if (!segment) continue; - Log(LogDebug, "ScheduledDowntime") - << "Considering segment: " << Utility::FormatDateTime("%c", segment->Get("begin")) << " -> " << Utility::FormatDateTime("%c", segment->Get("end")); - double begin = segment->Get("begin"); + double end = segment->Get("end"); - if (begin < now) + Log(LogDebug, "ScheduledDowntime") + << "Considering segment: " << Utility::FormatDateTime("%c", begin) << " -> " << Utility::FormatDateTime("%c", end); + + if (begin < now) { + Log(LogDebug, "ScheduledDowntime") << "already running."; continue; + } if (!bestSegment || begin < bestBegin) { + Log(LogDebug, "ScheduledDowntime") << "(best match yet)"; bestSegment = segment; bestBegin = begin; + bestEnd = end; } } if (bestSegment) - return std::make_pair(bestSegment->Get("begin"), bestSegment->Get("end")); - else - return std::make_pair(0, 0); + return std::make_pair(bestBegin, bestEnd); + + return std::make_pair(0, 0); } void ScheduledDowntime::CreateNextDowntime() { + double minEnd = 0; + for (const Downtime::Ptr& downtime : GetCheckable()->GetDowntimes()) { + double end = downtime->GetEndTime(); + if (end > minEnd) + minEnd = end; + if (downtime->GetScheduledBy() != GetName() || downtime->GetStartTime() < Utility::GetTime()) continue; @@ -179,10 +253,12 @@ void ScheduledDowntime::CreateNextDowntime() Log(LogDebug, "ScheduledDowntime") << "Creating new Downtime for ScheduledDowntime \"" << GetName() << "\""; - std::pair segment = FindNextSegment(); - - if (segment.first == 0 && segment.second == 0) - return; + std::pair segment = FindRunningSegment(minEnd); + if (segment.first == 0 && segment.second == 0) { + segment = FindNextSegment(); + if (segment.first == 0 && segment.second == 0) + return; + } String downtimeName = Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), segment.first, segment.second, diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 7fbcd1e12..a02ff6de2 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -58,6 +58,7 @@ protected: private: static void TimerProc(); + std::pair FindRunningSegment(double minEnd = 0); std::pair FindNextSegment(); void CreateNextDowntime(); From 9f6c66c41a33b6c38f6668af22b57bc4b9c44099 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 19 Oct 2018 10:42:54 +0200 Subject: [PATCH 0264/1162] Fix regression for wrong objects.cache path overwriting icinga2.debug file The 'statusdata' feature is deprecated, although it affects 'object list'. fixes #6705 --- lib/compat/statusdatawriter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index a1821ad1a..95514f2e5 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -559,7 +559,8 @@ void StatusDataWriter::UpdateObjectsCache() { CONTEXT("Writing objects.cache file"); - String objectsPath = Configuration::ObjectsPath; + /* Use the compat path here from the .ti generated class. */ + String objectsPath = GetObjectsPath(); std::fstream objectfp; String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0644, objectfp); From dcd33d61934919cff37905f634cb50b1ca384c7c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 19 Oct 2018 12:01:58 +0200 Subject: [PATCH 0265/1162] Docs: Alpine needs 'edge/main' repository too --- doc/02-getting-started.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/02-getting-started.md b/doc/02-getting-started.md index 285544e70..cffa3a2b4 100644 --- a/doc/02-getting-started.md +++ b/doc/02-getting-started.md @@ -102,6 +102,7 @@ zypper ref Alpine Linux: ``` +echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories apk update ``` From fac43e9eaf5eeace3ebfcac5b1a34fe114a87b7c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 19 Oct 2018 10:42:54 +0200 Subject: [PATCH 0266/1162] Fix regression for wrong objects.cache path overwriting icinga2.debug file The 'statusdata' feature is deprecated, although it affects 'object list'. fixes #6705 refs #6707 --- lib/compat/statusdatawriter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index a1821ad1a..95514f2e5 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -559,7 +559,8 @@ void StatusDataWriter::UpdateObjectsCache() { CONTEXT("Writing objects.cache file"); - String objectsPath = Configuration::ObjectsPath; + /* Use the compat path here from the .ti generated class. */ + String objectsPath = GetObjectsPath(); std::fstream objectfp; String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0644, objectfp); From 2366df60570e794c674d2a010817de6bcba05ea0 Mon Sep 17 00:00:00 2001 From: Max Rosin Date: Fri, 19 Oct 2018 15:37:32 +0200 Subject: [PATCH 0267/1162] Fix the Icinga2 version check for versions with more than 5 characters The previous implementation assumed that every version number will have 5 characters. With the release of 2.10.0 this does not work anymore. The new implementation extracts everything from the second character to the first dash. This should work as long as the version string is in a format like 'v2.10.1-8-gaebe6da'. fixes Icinga#6703 --- lib/methods/icingachecktask.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 0c85de6d4..75f301f5f 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -174,9 +174,12 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes cr->SetState(ServiceWarning); } - /* Return an error if the version is less than specified (optional). */ - String parsedAppVersion = appVersion.SubStr(1,5); + /* Extract the version number of the running Icinga2 instance. + * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. */ + int endOfVersionNumber = appVersion.FindFirstOf("-") - 1; + String parsedAppVersion = appVersion.SubStr(1,endOfVersionNumber); + /* Return an error if the version is less than specified (optional). */ if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) { output += "; Minimum version " + icingaMinVersion + " is not installed."; cr->SetState(ServiceCritical); From 6777255f601842bc1b7b45fb511cc5cc3be39cfd Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Mon, 22 Oct 2018 14:19:16 +0200 Subject: [PATCH 0268/1162] Fix typo --- lib/icinga/apiactions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 22684c9a2..33b9d6f56 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -258,7 +258,7 @@ Dictionary::Ptr ApiActions::RemoveAcknowledgement(const ConfigObject::Ptr& objec if (!checkable) return ApiActions::CreateResult(404, - "Cannot remove acknowlegement for non-existent checkable object " + "Cannot remove acknowledgement for non-existent checkable object " + object->GetName() + "."); checkable->ClearAcknowledgement(); From 78e98a3f0ec8efedd29b9243e80e76832f352139 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 22 Oct 2018 16:18:21 +0200 Subject: [PATCH 0269/1162] Docs: Add package related changes to the upgrading docs --- doc/13-addons.md | 2 +- doc/16-upgrading-icinga-2.md | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/13-addons.md b/doc/13-addons.md index f2b2986d4..b617498cf 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -94,7 +94,7 @@ installation, configuration and integration. ### Dashing Dashboard The [Icinga 2 dashboard](https://github.com/dnsmichi/dashing-icinga2) is built -on top of Dashing and uses the [REST API](#icinga2-api) to visualize what's going +on top of Dashing and uses the [REST API](12-icinga2-api.md#icinga2-api) to visualize what's going on with your monitoring. It combines several popular widgets and provides development instructions for your own implementation. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 9809066d9..3c46c9f86 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -106,6 +106,22 @@ For example the following started to give a fatal error in 2.10: ```critical/config: Error: Zone 'XXX' can not have a global zone as parent.``` +### Package Changes + +Debian/Ubuntu drops the `libicinga2` package. `apt-get upgrade icinga2` +won't remove such packages leaving the upgrade in an unsatisfied state. + +Please use `apt-get full-upgrade` or `apt-get dist-upgrade` instead, as explained [here](https://github.com/Icinga/icinga2/issues/6695#issuecomment-430585915). + +On RHEL/CentOS/Fedora, `icinga2-libs` has been obsoleted. Unfortunately yum's dependency +resolver doesn't allow to install older versions than 2.10 then. Please +read [here](https://github.com/Icinga/icinga-packaging/issues/114#issuecomment-429264827) +for details. + +RPM packages dropped the [Classic UI](16-upgrading-icinga-2.md#upgrading-to-2-8-removed-classicui-config-package) +package in v2.8, Debian/Ubuntu packages were forgotten. This is now the case with this +release. Icinga 1.x is EOL by the end of 2018, plan your migration to [Icinga Web 2](https://icinga.com/docs/icingaweb2/latest/). + ## Upgrading to v2.9 ### Deprecation and Removal Notes From 7e9228860b32e8aaf986fdb9840eb01f1e06ee2e Mon Sep 17 00:00:00 2001 From: Andrew Jaffie Date: Tue, 24 Jul 2018 16:00:47 -0400 Subject: [PATCH 0270/1162] Modify windows check_update command to allow specifying thresholds. refs #4720 --- doc/10-icinga-template-library.md | 10 +++--- itl/command-plugins-windows.conf | 12 ++++--- plugins/check_update.cpp | 56 ++++++++++++++++++------------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a080bb275..71b9a3a55 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1653,14 +1653,14 @@ Custom attributes: Name | Description :-------------------|:------------ -update\_win\_warn | **Optional**. If set, returns warning when important updates are available. -update\_win\_crit | **Optional**. If set, return critical when important updates that require a reboot are available. +update\_win\_warn | **Optional**. The warning threshold. +update\_win\_crit | **Optional**. The critical threshold. update\_win\_reboot | **Optional**. Set to treat 'may need update' as 'definitely needs update'. Please Note that this is true for almost every update and is therefore not recommended. +ignore\_reboot | **Optional**. Set to disable behavior of returning critical if any updates require a reboot. -In contrast to most other plugins, the values of check_update's custom attributes do not set thresholds, but just enable/disable the behavior described in the table above. -It can be enabled/disabled for example by setting them to "true" or "false", "1" or "0" would also work. -Thresholds will always be "1". +If a warning threshold is set but not a critical threshold, the critical threshold will be set to one greater than the set warning threshold. +Unless the `ignore_reboot` flag is set, if any updates require a reboot the plugin will return critical. > **Note** > diff --git a/itl/command-plugins-windows.conf b/itl/command-plugins-windows.conf index 1e48dc6b0..c8dd1a6b0 100644 --- a/itl/command-plugins-windows.conf +++ b/itl/command-plugins-windows.conf @@ -271,17 +271,21 @@ object CheckCommand "update-windows" { arguments = { "-w" = { - set_if = "$update_win_warn$" - description = "Warn if there are important updates available" + value = "$update_win_warn$" + description = "Number of updates to trigger a warning" } "-c" = { - set_if = "$update_win_crit$" - description = "Critical if there are important updates that require a reboot" + value = "$update_win_crit$" + description = "Number of updates to trigger a critical" } "--possible-reboot" = { set_if = "$update_win_reboot$" description = "Treat 'may need update' as 'definitely needs update'" } + "--no-reboot-critical" = { + set_if = "$ignore_reboot$" + description = "Do not automatically return critical if an update requiring reboot is present." + } } timeout = 5m diff --git a/plugins/check_update.cpp b/plugins/check_update.cpp index 3543400c0..64621882f 100644 --- a/plugins/check_update.cpp +++ b/plugins/check_update.cpp @@ -33,11 +33,11 @@ namespace po = boost::program_options; struct printInfoStruct { - bool warn{false}; - bool crit{false}; + int warn{0}; + int crit{0}; LONG numUpdates{0}; - bool important{false}; - bool reboot{false}; + bool ignoreReboot{false}; + int reboot{0}; bool careForCanRequest{false}; }; @@ -55,9 +55,10 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt ("help,h", "Print help message and exit") ("version,V", "Print version and exit") ("debug,d", "Verbose/Debug output") - ("warning,w", "Warn if there are important updates available") - ("critical,c", "Critical if there are important updates that require a reboot") + ("warning,w", po::value(), "Number of updates to trigger a warning.") + ("critical,c", po::value(), "Number of updates to trigger a critical.") ("possible-reboot", "Treat \"update may need reboot\" as \"update needs reboot\"") + ("no-reboot-critical", "Do not automatically return critical if an update requiring reboot is present.") ; po::wcommand_line_parser parser(ac, av); @@ -87,23 +88,20 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt L"\nAfter some time, it will then output a string like this one:\n\n" L"\tUPDATE WARNING 8 | updates=8;1;1;0\n\n" L"\"UPDATE\" being the type of the check, \"WARNING\" the returned status\n" - L"and \"8\" is the number of important updates updates.\n" + L"and \"8\" is the number of important updates.\n" L"The performance data is found behind the \"|\", in order:\n" L"returned value, warning threshold, critical threshold, minimal value and,\n" - L"if applicable, the maximal value. Performance data will only be displayed when\n" - L"you set at least one threshold\n\n" + L"if applicable, the maximal value.\n\n" L"An update counts as important when it is part of the Security- or\n" L"CriticalUpdates group.\n" L"Consult the msdn on WSUS Classification GUIDs for more information.\n" L"%s' exit codes denote the following:\n" L" 0\tOK,\n\tNo Thresholds were broken or the programs check part was not executed\n" L" 1\tWARNING,\n\tThe warning, but not the critical threshold was broken\n" - L" 2\tCRITICAL,\n\tThe critical threshold was broken\n" + L" 2\tCRITICAL,\n\tThe critical threshold was broken or an update required reboot.\n" L" 3\tUNKNOWN, \n\tThe program experienced an internal or input error\n\n" - L"%s works different from other plugins in that you do not set thresholds\n" - L"but only activate them. Using \"-w\" triggers warning state if there are not\n" - L"installed and non-optional updates. \"-c\" triggers critical if there are\n" - L"non-optional updates that require a reboot.\n" + L"If a warning threshold is set but not a critical threshold, the critical\n" + L"threshold will be set to one greater than the set warning threshold.\n\n" L"The \"possible-reboot\" option is not recommended since this true for nearly\n" L"every update." , progName, progName); @@ -113,10 +111,14 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt std::cout << "Version: " << VERSION << '\n'; return 0; } - - printInfo.warn = vm.count("warning") > 0; - printInfo.crit = vm.count("critical") > 0; + if(vm.count("warning")) + printInfo.warn = vm["warning"].as(); + if (vm.count("critical")) + printInfo.crit = vm["critical"].as(); + else if (vm.count("warning")) + printInfo.crit = printInfo.warn + 1; printInfo.careForCanRequest = vm.count("possible-reboot") > 0; + printInfo.ignoreReboot = vm.count("no-reboot-critical") > 0; l_Debug = vm.count("debug") > 0; @@ -131,10 +133,10 @@ static int printOutput(const printInfoStruct& printInfo) state state = OK; std::wstring output = L"UPDATE "; - if (printInfo.important) + if (printInfo.numUpdates >= printInfo.warn && printInfo.warn) state = WARNING; - if (printInfo.reboot) + if ((printInfo.reboot && !printInfo.ignoreReboot) || (printInfo.numUpdates >= printInfo.crit && printInfo.crit)) state = CRITICAL; switch (state) { @@ -148,8 +150,13 @@ static int printOutput(const printInfoStruct& printInfo) output.append(L"CRITICAL "); break; } - - std::wcout << output << printInfo.numUpdates << L" | 'update'=" << printInfo.numUpdates << L";" + output.append(std::to_wstring(printInfo.numUpdates)); + if (printInfo.reboot) { + output.append(L"; "); + output.append(std::to_wstring(printInfo.reboot)); + output.append(L" NEED REBOOT "); + } + std::wcout << output << L" | 'update'=" << printInfo.numUpdates << L";" << printInfo.warn << L";" << printInfo.crit << L";0;" << '\n'; return state; @@ -214,15 +221,16 @@ static int check_update(printInfoStruct& printInfo) pUpdate->get_InstallationBehavior(&pIbehav); pIbehav->get_RebootBehavior(&updateReboot); if (updateReboot == irbAlwaysRequiresReboot) { - printInfo.reboot = true; + printInfo.reboot++; if (l_Debug) std::wcout << L"It requires reboot" << '\n'; continue; } - if (printInfo.careForCanRequest && updateReboot == irbCanRequestReboot) + if (printInfo.careForCanRequest && updateReboot == irbCanRequestReboot) { if (l_Debug) std::wcout << L"It requires reboot" << '\n'; - printInfo.reboot = true; + printInfo.reboot++; + } } if (l_Debug) From 9f919a2d1ef22cc670482f7b15ae38683ceab1fc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 22 Oct 2018 16:18:21 +0200 Subject: [PATCH 0271/1162] Docs: Add package related changes to the upgrading docs refs #6714 --- doc/13-addons.md | 2 +- doc/16-upgrading-icinga-2.md | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/13-addons.md b/doc/13-addons.md index f2b2986d4..b617498cf 100644 --- a/doc/13-addons.md +++ b/doc/13-addons.md @@ -94,7 +94,7 @@ installation, configuration and integration. ### Dashing Dashboard The [Icinga 2 dashboard](https://github.com/dnsmichi/dashing-icinga2) is built -on top of Dashing and uses the [REST API](#icinga2-api) to visualize what's going +on top of Dashing and uses the [REST API](12-icinga2-api.md#icinga2-api) to visualize what's going on with your monitoring. It combines several popular widgets and provides development instructions for your own implementation. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 9809066d9..3c46c9f86 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -106,6 +106,22 @@ For example the following started to give a fatal error in 2.10: ```critical/config: Error: Zone 'XXX' can not have a global zone as parent.``` +### Package Changes + +Debian/Ubuntu drops the `libicinga2` package. `apt-get upgrade icinga2` +won't remove such packages leaving the upgrade in an unsatisfied state. + +Please use `apt-get full-upgrade` or `apt-get dist-upgrade` instead, as explained [here](https://github.com/Icinga/icinga2/issues/6695#issuecomment-430585915). + +On RHEL/CentOS/Fedora, `icinga2-libs` has been obsoleted. Unfortunately yum's dependency +resolver doesn't allow to install older versions than 2.10 then. Please +read [here](https://github.com/Icinga/icinga-packaging/issues/114#issuecomment-429264827) +for details. + +RPM packages dropped the [Classic UI](16-upgrading-icinga-2.md#upgrading-to-2-8-removed-classicui-config-package) +package in v2.8, Debian/Ubuntu packages were forgotten. This is now the case with this +release. Icinga 1.x is EOL by the end of 2018, plan your migration to [Icinga Web 2](https://icinga.com/docs/icingaweb2/latest/). + ## Upgrading to v2.9 ### Deprecation and Removal Notes From 09fbdb846bdd8be1605f127df023a94a339e6ecf Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 10 Oct 2018 11:43:11 +0200 Subject: [PATCH 0272/1162] Increase dependency recursion limit to 256 fixes #5762 --- lib/icinga/checkable-dependency.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-dependency.cpp b/lib/icinga/checkable-dependency.cpp index 65cf386a9..8c0d6e02e 100644 --- a/lib/icinga/checkable-dependency.cpp +++ b/lib/icinga/checkable-dependency.cpp @@ -61,9 +61,12 @@ std::vector Checkable::GetReverseDependencies() const bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency, int rstack) const { - if (rstack > 20) { + /* Anything greater than 256 causes recursion bus errors. */ + int limit = 256; + + if (rstack > limit) { Log(LogWarning, "Checkable") - << "Too many nested dependencies for service '" << GetName() << "': Dependency failed."; + << "Too many nested dependencies (>" << limit << ") for checkable '" << GetName() << "': Dependency failed."; return false; } From e480eb785e701b43050d2b0cb870f62c16fbb26d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 11:00:24 +0200 Subject: [PATCH 0273/1162] Improve error handling for invalid child_options for API downtime actions fixes #6712 --- lib/icinga/apiactions.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 33b9d6f56..6d2fc3fc5 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -355,6 +355,15 @@ Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, double startTime = HttpUtility::GetLastParameter(params, "start_time"); double endTime = HttpUtility::GetLastParameter(params, "end_time"); + DowntimeChildOptions childOptions = DowntimeNoChildren; + if (params->Contains("child_options")) { + try { + childOptions = Downtime::ChildOptionsFromValue(HttpUtility::GetLastParameter(params, "child_options")); + } catch (const std::exception&) { + return ApiActions::CreateResult(400, "Option 'child_options' provided an invalid value."); + } + } + String downtimeName = Downtime::AddDowntime(checkable, author, comment, startTime, endTime, fixed, triggerName, duration); @@ -366,10 +375,6 @@ Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, }); /* Schedule downtime for all child objects. */ - DowntimeChildOptions childOptions = DowntimeNoChildren; - if (params->Contains("child_options")) - childOptions = Downtime::ChildOptionsFromValue(HttpUtility::GetLastParameter(params, "child_options")); - if (childOptions != DowntimeNoChildren) { /* 'DowntimeTriggeredChildren' schedules child downtimes triggered by the parent downtime. * 'DowntimeNonTriggeredChildren' schedules non-triggered downtimes for all children. From 001ffda61c94a000726601aecb3b0ac0678dc848 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 12:32:36 +0200 Subject: [PATCH 0274/1162] Revert code from icinga.com update --- lib/perfdata/elasticsearchwriter.cpp | 9 --------- lib/perfdata/elasticsearchwriter.ti | 4 ---- 2 files changed, 13 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 40581eafb..029857094 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -49,15 +49,6 @@ void ElasticsearchWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("ElasticsearchWriter, " + GetName()); - - if (!GetEnableHa()) { - Log(LogDebug, "ElasticsearchWriter") - << "HA functionality disabled. Won't pause connection: " << GetName(); - - SetHAMode(HARunEverywhere); - } else { - SetHAMode(HARunOnce); - } } void ElasticsearchWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index 39e4c5628..2bbdd9d6a 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -37,10 +37,6 @@ class ElasticsearchWriter : ConfigObject [config] int flush_threshold { default {{{ return 1024; }}} }; - - [config] bool enable_ha { - default {{{ return true; }}} - }; }; } From 30853e6041aee1c327248267303185a91fb145f1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 12:32:36 +0200 Subject: [PATCH 0275/1162] Revert code from icinga.com update --- lib/perfdata/elasticsearchwriter.cpp | 9 --------- lib/perfdata/elasticsearchwriter.ti | 4 ---- 2 files changed, 13 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 40581eafb..029857094 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -49,15 +49,6 @@ void ElasticsearchWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("ElasticsearchWriter, " + GetName()); - - if (!GetEnableHa()) { - Log(LogDebug, "ElasticsearchWriter") - << "HA functionality disabled. Won't pause connection: " << GetName(); - - SetHAMode(HARunEverywhere); - } else { - SetHAMode(HARunOnce); - } } void ElasticsearchWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index 39e4c5628..2bbdd9d6a 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -37,10 +37,6 @@ class ElasticsearchWriter : ConfigObject [config] int flush_threshold { default {{{ return 1024; }}} }; - - [config] bool enable_ha { - default {{{ return true; }}} - }; }; } From 59389f564c89cffa1c8b90c898de35add6c2587a Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 13:20:03 +0200 Subject: [PATCH 0276/1162] Implement HA functionality for Elasticsearch feature --- lib/perfdata/elasticsearchwriter.cpp | 30 ++++++++++++++++++++++------ lib/perfdata/elasticsearchwriter.hpp | 4 ++-- lib/perfdata/elasticsearchwriter.ti | 3 +++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 029857094..ec89bed01 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -49,6 +49,15 @@ void ElasticsearchWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("ElasticsearchWriter, " + GetName()); + + if (!GetEnableHa()) { + Log(LogDebug, "ElasticsearchWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } } void ElasticsearchWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) @@ -71,14 +80,14 @@ void ElasticsearchWriter::StatsFunc(const Dictionary::Ptr& status, const Array:: status->Set("elasticsearchwriter", new Dictionary(std::move(nodes))); } -void ElasticsearchWriter::Start(bool runtimeCreated) +void ElasticsearchWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); m_EventPrefix = "icinga2.event."; Log(LogInformation, "ElasticsearchWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; m_WorkQueue.SetExceptionCallback(std::bind(&ElasticsearchWriter::ExceptionHandler, this, _1)); @@ -95,14 +104,14 @@ void ElasticsearchWriter::Start(bool runtimeCreated) Checkable::OnNotificationSentToAllUsers.connect(std::bind(&ElasticsearchWriter::NotificationSentToAllUsersHandler, this, _1, _2, _3, _4, _5, _6, _7)); } -void ElasticsearchWriter::Stop(bool runtimeRemoved) +void ElasticsearchWriter::Pause() { Log(LogInformation, "ElasticsearchWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; m_WorkQueue.Join(); - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } void ElasticsearchWriter::AddCheckResult(const Dictionary::Ptr& fields, const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) @@ -176,6 +185,9 @@ void ElasticsearchWriter::AddCheckResult(const Dictionary::Ptr& fields, const Ch void ElasticsearchWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&ElasticsearchWriter::InternalCheckResultHandler, this, checkable, cr)); } @@ -230,6 +242,9 @@ void ElasticsearchWriter::InternalCheckResultHandler(const Checkable::Ptr& check void ElasticsearchWriter::StateChangeHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, StateType type) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&ElasticsearchWriter::StateChangeHandlerInternal, this, checkable, cr, type)); } @@ -279,6 +294,9 @@ void ElasticsearchWriter::NotificationSentToAllUsersHandler(const Notification:: const Checkable::Ptr& checkable, const std::set& users, NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&ElasticsearchWriter::NotificationSentToAllUsersHandlerInternal, this, notification, checkable, users, type, cr, author, text)); } diff --git a/lib/perfdata/elasticsearchwriter.hpp b/lib/perfdata/elasticsearchwriter.hpp index a22552ad6..7220e8ea3 100644 --- a/lib/perfdata/elasticsearchwriter.hpp +++ b/lib/perfdata/elasticsearchwriter.hpp @@ -41,8 +41,8 @@ public: protected: void OnConfigLoaded() override; - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void Resume() override; + void Pause() override; private: String m_EventPrefix; diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index 2bbdd9d6a..7cf604fb9 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -37,6 +37,9 @@ class ElasticsearchWriter : ConfigObject [config] int flush_threshold { default {{{ return 1024; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } From 37ccffc7e59b8f24e2749ad5d803561b8dbd885e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 13:29:27 +0200 Subject: [PATCH 0277/1162] Implement HA functionality for Graphite feature --- lib/perfdata/graphitewriter.cpp | 29 +++++++++++++++++++++++------ lib/perfdata/graphitewriter.hpp | 4 ++-- lib/perfdata/graphitewriter.ti | 3 +++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index d58e2c53b..a01f6c48b 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -49,6 +49,15 @@ void GraphiteWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("GraphiteWriter, " + GetName()); + + if (!GetEnableHa()) { + Log(LogDebug, "GraphiteWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } } void GraphiteWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) @@ -72,12 +81,12 @@ void GraphiteWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& status->Set("graphitewriter", new Dictionary(std::move(nodes))); } -void GraphiteWriter::Start(bool runtimeCreated) +void GraphiteWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); Log(LogInformation, "GraphiteWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; /* Register exception handler for WQ tasks. */ m_WorkQueue.SetExceptionCallback(std::bind(&GraphiteWriter::ExceptionHandler, this, _1)); @@ -93,14 +102,14 @@ void GraphiteWriter::Start(bool runtimeCreated) Checkable::OnNewCheckResult.connect(std::bind(&GraphiteWriter::CheckResultHandler, this, _1, _2)); } -void GraphiteWriter::Stop(bool runtimeRemoved) +void GraphiteWriter::Pause() { Log(LogInformation, "GraphiteWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; m_WorkQueue.Join(); - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } void GraphiteWriter::AssertOnWorkQueue() @@ -126,6 +135,11 @@ void GraphiteWriter::Reconnect() { AssertOnWorkQueue(); + if (IsPaused()) { + SetConnected(false); + return; + } + double startTime = Utility::GetTime(); CONTEXT("Reconnecting to Graphite '" + GetName() + "'"); @@ -175,6 +189,9 @@ void GraphiteWriter::Disconnect() void GraphiteWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&GraphiteWriter::CheckResultHandlerInternal, this, checkable, cr)); } diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index 48a2f4203..6934d13b3 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -49,8 +49,8 @@ public: protected: void OnConfigLoaded() override; - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void Resume() override; + void Pause() override; private: Stream::Ptr m_Stream; diff --git a/lib/perfdata/graphitewriter.ti b/lib/perfdata/graphitewriter.ti index dfe62a14b..b28ba87a9 100644 --- a/lib/perfdata/graphitewriter.ti +++ b/lib/perfdata/graphitewriter.ti @@ -47,6 +47,9 @@ class GraphiteWriter : ConfigObject [no_user_modify] bool should_connect { default {{{ return true; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } From 5e241dc81517aed5d5bccab81b67dfe9a285847a Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 13:38:06 +0200 Subject: [PATCH 0278/1162] Implement HA functionality for InfluxDB feature --- lib/perfdata/influxdbwriter.cpp | 24 ++++++++++++++++++------ lib/perfdata/influxdbwriter.hpp | 4 ++-- lib/perfdata/influxdbwriter.ti | 3 +++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 437fe542a..91fb1be10 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -75,6 +75,15 @@ void InfluxdbWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("InfluxdbWriter, " + GetName()); + + if (!GetEnableHa()) { + Log(LogDebug, "InfluxdbWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } } void InfluxdbWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) @@ -100,12 +109,12 @@ void InfluxdbWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& status->Set("influxdbwriter", new Dictionary(std::move(nodes))); } -void InfluxdbWriter::Start(bool runtimeCreated) +void InfluxdbWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); Log(LogInformation, "InfluxdbWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; /* Register exception handler for WQ tasks. */ m_WorkQueue.SetExceptionCallback(std::bind(&InfluxdbWriter::ExceptionHandler, this, _1)); @@ -121,14 +130,14 @@ void InfluxdbWriter::Start(bool runtimeCreated) Checkable::OnNewCheckResult.connect(std::bind(&InfluxdbWriter::CheckResultHandler, this, _1, _2)); } -void InfluxdbWriter::Stop(bool runtimeRemoved) +void InfluxdbWriter::Pause() { Log(LogInformation, "InfluxdbWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; m_WorkQueue.Join(); - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } void InfluxdbWriter::AssertOnWorkQueue() @@ -188,6 +197,9 @@ Stream::Ptr InfluxdbWriter::Connect() void InfluxdbWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&InfluxdbWriter::CheckResultHandlerWQ, this, checkable, cr), PriorityLow); } diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp index 109e3a872..face44f69 100644 --- a/lib/perfdata/influxdbwriter.hpp +++ b/lib/perfdata/influxdbwriter.hpp @@ -49,8 +49,8 @@ public: protected: void OnConfigLoaded() override; - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void Resume() override; + void Pause() override; private: WorkQueue m_WorkQueue{10000000, 1}; diff --git a/lib/perfdata/influxdbwriter.ti b/lib/perfdata/influxdbwriter.ti index 58962d5b5..d2f1ba6d2 100644 --- a/lib/perfdata/influxdbwriter.ti +++ b/lib/perfdata/influxdbwriter.ti @@ -88,6 +88,9 @@ class InfluxdbWriter : ConfigObject [config] int flush_threshold { default {{{ return 1024; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; validator InfluxdbWriter { From b905999f4bf71af6e408b35aa0381023d1c718ae Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 13:43:38 +0200 Subject: [PATCH 0279/1162] Implement HA functionality for Gelf feature --- lib/perfdata/gelfwriter.cpp | 35 +++++++++++++++++++++++++++++------ lib/perfdata/gelfwriter.hpp | 4 ++-- lib/perfdata/gelfwriter.ti | 3 +++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/gelfwriter.cpp b/lib/perfdata/gelfwriter.cpp index 78e15ff77..c4c0912d2 100644 --- a/lib/perfdata/gelfwriter.cpp +++ b/lib/perfdata/gelfwriter.cpp @@ -51,6 +51,15 @@ void GelfWriter::OnConfigLoaded() ObjectImpl::OnConfigLoaded(); m_WorkQueue.SetName("GelfWriter, " + GetName()); + + if (!GetEnableHa()) { + Log(LogDebug, "GelfWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } } void GelfWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata) @@ -75,12 +84,12 @@ void GelfWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perf status->Set("gelfwriter", new Dictionary(std::move(nodes))); } -void GelfWriter::Start(bool runtimeCreated) +void GelfWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); Log(LogInformation, "GelfWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; /* Register exception handler for WQ tasks. */ m_WorkQueue.SetExceptionCallback(std::bind(&GelfWriter::ExceptionHandler, this, _1)); @@ -98,14 +107,14 @@ void GelfWriter::Start(bool runtimeCreated) Checkable::OnStateChange.connect(std::bind(&GelfWriter::StateChangeHandler, this, _1, _2, _3)); } -void GelfWriter::Stop(bool runtimeRemoved) +void GelfWriter::Pause() { Log(LogInformation, "GelfWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; m_WorkQueue.Join(); - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } void GelfWriter::AssertOnWorkQueue() @@ -131,6 +140,11 @@ void GelfWriter::Reconnect() { AssertOnWorkQueue(); + if (IsPaused()) { + SetConnected(false); + return; + } + double startTime = Utility::GetTime(); CONTEXT("Reconnecting to Graylog Gelf '" + GetName() + "'"); @@ -180,6 +194,9 @@ void GelfWriter::Disconnect() void GelfWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&GelfWriter::CheckResultHandlerInternal, this, checkable, cr)); } @@ -284,6 +301,9 @@ void GelfWriter::NotificationToUserHandler(const Notification::Ptr& notification const User::Ptr& user, NotificationType notificationType, CheckResult::Ptr const& cr, const String& author, const String& commentText, const String& commandName) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&GelfWriter::NotificationToUserHandlerInternal, this, notification, checkable, user, notificationType, cr, author, commentText, commandName)); } @@ -348,6 +368,9 @@ void GelfWriter::NotificationToUserHandlerInternal(const Notification::Ptr& noti void GelfWriter::StateChangeHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, StateType type) { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&GelfWriter::StateChangeHandlerInternal, this, checkable, cr, type)); } diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp index 4e27a3c92..32e35da57 100644 --- a/lib/perfdata/gelfwriter.hpp +++ b/lib/perfdata/gelfwriter.hpp @@ -46,8 +46,8 @@ public: protected: void OnConfigLoaded() override; - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void Resume() override; + void Pause() override; private: Stream::Ptr m_Stream; diff --git a/lib/perfdata/gelfwriter.ti b/lib/perfdata/gelfwriter.ti index 6382541bb..d13ee55d2 100644 --- a/lib/perfdata/gelfwriter.ti +++ b/lib/perfdata/gelfwriter.ti @@ -45,6 +45,9 @@ class GelfWriter : ConfigObject [no_user_modify] bool should_connect { default {{{ return true; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } From 97c1296e9994a396f9017be4c6b30ad351ac7a12 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 13:55:19 +0200 Subject: [PATCH 0280/1162] Implement HA functionality for OpenTsdb feature --- lib/perfdata/opentsdbwriter.cpp | 32 ++++++++++++++++++++++++++------ lib/perfdata/opentsdbwriter.hpp | 5 +++-- lib/perfdata/opentsdbwriter.ti | 3 +++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/opentsdbwriter.cpp b/lib/perfdata/opentsdbwriter.cpp index 1099f4449..78feea8f2 100644 --- a/lib/perfdata/opentsdbwriter.cpp +++ b/lib/perfdata/opentsdbwriter.cpp @@ -44,6 +44,20 @@ REGISTER_TYPE(OpenTsdbWriter); REGISTER_STATSFUNCTION(OpenTsdbWriter, &OpenTsdbWriter::StatsFunc); +void OpenTsdbWriter::OnConfigLoaded() +{ + ObjectImpl::OnConfigLoaded(); + + if (!GetEnableHa()) { + Log(LogDebug, "OpenTsdbWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } +} + void OpenTsdbWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&) { DictionaryData nodes; @@ -55,12 +69,12 @@ void OpenTsdbWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&) status->Set("opentsdbwriter", new Dictionary(std::move(nodes))); } -void OpenTsdbWriter::Start(bool runtimeCreated) +void OpenTsdbWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); Log(LogInformation, "OpentsdbWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; m_ReconnectTimer = new Timer(); m_ReconnectTimer->SetInterval(10); @@ -71,16 +85,19 @@ void OpenTsdbWriter::Start(bool runtimeCreated) Service::OnNewCheckResult.connect(std::bind(&OpenTsdbWriter::CheckResultHandler, this, _1, _2)); } -void OpenTsdbWriter::Stop(bool runtimeRemoved) +void OpenTsdbWriter::Pause() { Log(LogInformation, "OpentsdbWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } void OpenTsdbWriter::ReconnectTimerHandler() { + if (IsPaused()) + return; + if (m_Stream) return; @@ -102,6 +119,9 @@ void OpenTsdbWriter::ReconnectTimerHandler() void OpenTsdbWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + CONTEXT("Processing check result for '" + checkable->GetName() + "'"); if (!IcingaApplication::GetInstance()->GetEnablePerfdata() || !checkable->GetEnablePerfdata()) diff --git a/lib/perfdata/opentsdbwriter.hpp b/lib/perfdata/opentsdbwriter.hpp index 4d40387dd..193d6b31a 100644 --- a/lib/perfdata/opentsdbwriter.hpp +++ b/lib/perfdata/opentsdbwriter.hpp @@ -44,8 +44,9 @@ public: static void StatsFunc(const Dictionary::Ptr& status, const Array::Ptr& perfdata); protected: - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void OnConfigLoaded() override; + void Resume() override; + void Pause() override; private: Stream::Ptr m_Stream; diff --git a/lib/perfdata/opentsdbwriter.ti b/lib/perfdata/opentsdbwriter.ti index fbec3a491..3418e1606 100644 --- a/lib/perfdata/opentsdbwriter.ti +++ b/lib/perfdata/opentsdbwriter.ti @@ -34,6 +34,9 @@ class OpenTsdbWriter : ConfigObject [config] String port { default {{{ return "4242"; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } From 028946a1cc6b026260c64bc00c17e5002ff84696 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 14:07:36 +0200 Subject: [PATCH 0281/1162] Implement HA functionality for Perfdata feature --- lib/perfdata/perfdatawriter.cpp | 32 ++++++++++++++++++++++++++------ lib/perfdata/perfdatawriter.hpp | 5 +++-- lib/perfdata/perfdatawriter.ti | 3 +++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/perfdatawriter.cpp b/lib/perfdata/perfdatawriter.cpp index a00dc45d7..c560ef256 100644 --- a/lib/perfdata/perfdatawriter.cpp +++ b/lib/perfdata/perfdatawriter.cpp @@ -38,6 +38,20 @@ REGISTER_TYPE(PerfdataWriter); REGISTER_STATSFUNCTION(PerfdataWriter, &PerfdataWriter::StatsFunc); +void PerfdataWriter::OnConfigLoaded() +{ + ObjectImpl::OnConfigLoaded(); + + if (!GetEnableHa()) { + Log(LogDebug, "PerfdataWriter") + << "HA functionality disabled. Won't pause connection: " << GetName(); + + SetHAMode(HARunEverywhere); + } else { + SetHAMode(HARunOnce); + } +} + void PerfdataWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&) { DictionaryData nodes; @@ -49,12 +63,12 @@ void PerfdataWriter::StatsFunc(const Dictionary::Ptr& status, const Array::Ptr&) status->Set("perfdatawriter", new Dictionary(std::move(nodes))); } -void PerfdataWriter::Start(bool runtimeCreated) +void PerfdataWriter::Resume() { - ObjectImpl::Start(runtimeCreated); + ObjectImpl::Resume(); Log(LogInformation, "PerfdataWriter") - << "'" << GetName() << "' started."; + << "'" << GetName() << "' resumed."; Checkable::OnNewCheckResult.connect(std::bind(&PerfdataWriter::CheckResultHandler, this, _1, _2)); @@ -67,12 +81,12 @@ void PerfdataWriter::Start(bool runtimeCreated) RotateFile(m_HostOutputFile, GetHostTempPath(), GetHostPerfdataPath()); } -void PerfdataWriter::Stop(bool runtimeRemoved) +void PerfdataWriter::Pause() { Log(LogInformation, "PerfdataWriter") - << "'" << GetName() << "' stopped."; + << "'" << GetName() << "' paused."; - ObjectImpl::Stop(runtimeRemoved); + ObjectImpl::Pause(); } Value PerfdataWriter::EscapeMacroMetric(const Value& value) @@ -85,6 +99,9 @@ Value PerfdataWriter::EscapeMacroMetric(const Value& value) void PerfdataWriter::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr) { + if (IsPaused()) + return; + CONTEXT("Writing performance data for object '" + checkable->GetName() + "'"); if (!IcingaApplication::GetInstance()->GetEnablePerfdata() || !checkable->GetEnablePerfdata()) @@ -154,6 +171,9 @@ void PerfdataWriter::RotateFile(std::ofstream& output, const String& temp_path, void PerfdataWriter::RotationTimerHandler() { + if (IsPaused()) + return; + RotateFile(m_ServiceOutputFile, GetServiceTempPath(), GetServicePerfdataPath()); RotateFile(m_HostOutputFile, GetHostTempPath(), GetHostPerfdataPath()); } diff --git a/lib/perfdata/perfdatawriter.hpp b/lib/perfdata/perfdatawriter.hpp index 10fe7a2dd..56d01d382 100644 --- a/lib/perfdata/perfdatawriter.hpp +++ b/lib/perfdata/perfdatawriter.hpp @@ -46,8 +46,9 @@ public: void ValidateServiceFormatTemplate(const Lazy& lvalue, const ValidationUtils& utils) override; protected: - void Start(bool runtimeCreated) override; - void Stop(bool runtimeRemoved) override; + void OnConfigLoaded() override; + void Resume() override; + void Pause() override; private: void CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr); diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index 8381c6c9e..d2ceb6899 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -70,6 +70,9 @@ class PerfdataWriter : ConfigObject [config] double rotation_interval { default {{{ return 30; }}} }; + [config] bool enable_ha { + default {{{ return true; }}} + }; }; } From 83b5119bb6349f207276ea42bc7b645785e4cda5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 14:22:09 +0200 Subject: [PATCH 0282/1162] Update docs for HA-aware features --- doc/06-distributed-monitoring.md | 6 ++++++ doc/09-object-types.md | 10 ++++++++-- doc/16-upgrading-icinga-2.md | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md index 48cfd1b26..da44f7717 100644 --- a/doc/06-distributed-monitoring.md +++ b/doc/06-distributed-monitoring.md @@ -2434,6 +2434,12 @@ By default, the following features provide advanced HA functionality: * [Checks](06-distributed-monitoring.md#distributed-monitoring-high-availability-checks) (load balanced, automated failover). * [Notifications](06-distributed-monitoring.md#distributed-monitoring-high-availability-notifications) (load balanced, automated failover). * [DB IDO](06-distributed-monitoring.md#distributed-monitoring-high-availability-db-ido) (Run-Once, automated failover). +* [Elasticsearch](09-object-types.md#objecttype-elasticsearchwriter) +* [Gelf](09-object-types.md#objecttype-gelfwriter) +* [Graphite](09-object-types.md#objecttype-graphitewriter) +* [InfluxDB](09-object-types.md#objecttype-influxdbwriter) +* [OpenTsdb](09-object-types.md#objecttype-opentsdbwriter) +* [Perfdata](09-object-types.md#objecttype-perfdatawriter) (for PNP) #### High-Availability with Checks diff --git a/doc/09-object-types.md b/doc/09-object-types.md index bd6572c15..562e75a6d 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -517,6 +517,7 @@ Configuration Attributes: ca\_path | String | **Optional.** Path to CA certificate to validate the remote host. Requires `enable_tls` set to `true`. cert\_path | String | **Optional.** Path to host certificate to present to the remote host for mutual verification. Requires `enable_tls` set to `true`. key\_path | String | **Optional.** Path to host key to accompany the cert\_path. Requires `enable_tls` set to `true`. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. Note: If `flush_threshold` is set too low, this will force the feature to flush all data to Elasticsearch too often. Experiment with the setting, if you are processing more than 1024 metrics per second or similar. @@ -655,6 +656,7 @@ Configuration Attributes: port | Number | **Optional.** GELF receiver port. Defaults to `12201`. source | String | **Optional.** Source name for this instance. Defaults to `icinga2`. enable\_send\_perfdata | Boolean | **Optional.** Enable performance data for 'CHECK RESULT' events. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. ## GraphiteWriter @@ -682,6 +684,7 @@ Configuration Attributes: service\_name\_template | String | **Optional.** Metric prefix for service name. Defaults to `icinga2.$host.name$.services.$service.name$.$service.check_command$`. enable\_send\_thresholds | Boolean | **Optional.** Send additional threshold metrics. Defaults to `false`. enable\_send\_metadata | Boolean | **Optional.** Send additional metadata metrics. Defaults to `false`. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. Additional usage examples can be found [here](14-features.md#graphite-carbon-cache-writer). @@ -868,7 +871,7 @@ Configuration Attributes: table\_prefix | String | **Optional.** MySQL database table prefix. Defaults to `icinga_`. instance\_name | String | **Optional.** Unique identifier for the local Icinga 2 instance. Defaults to `default`. instance\_description | String | **Optional.** Description for the Icinga 2 instance. - enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-db-ido). Defaults to "true". + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-db-ido). Defaults to `true`. failover\_timeout | Duration | **Optional.** Set the failover timeout in a [HA cluster](06-distributed-monitoring.md#distributed-monitoring-high-availability-db-ido). Must not be lower than 60s. Defaults to `60s`. cleanup | Dictionary | **Optional.** Dictionary with items for historical table cleanup. categories | Array | **Optional.** Array of information types that should be written to the database. @@ -1057,6 +1060,7 @@ Configuration Attributes: enable\_send\_metadata | Boolean | **Optional.** Whether to send check metadata e.g. states, execution time, latency etc. flush\_interval | Duration | **Optional.** How long to buffer data points before transferring to InfluxDB. Defaults to `10s`. flush\_threshold | Number | **Optional.** How many data points to buffer before forcing a transfer to InfluxDB. Defaults to `1024`. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. Note: If `flush_threshold` is set too low, this will always force the feature to flush all data to InfluxDB. Experiment with the setting, if you are processing more than 1024 metrics per second @@ -1303,7 +1307,7 @@ Example: object OpenTsdbWriter "opentsdb" { host = "127.0.0.1" port = 4242 - +} ``` Configuration Attributes: @@ -1312,6 +1316,7 @@ Configuration Attributes: --------------------------|-----------------------|---------------------------------- host | String | **Optional.** OpenTSDB host address. Defaults to `127.0.0.1`. port | Number | **Optional.** OpenTSDB port. Defaults to `4242`. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. ## PerfdataWriter @@ -1346,6 +1351,7 @@ Configuration Attributes: host\_format\_template | String | **Optional.** Host Format template for the performance data file. Defaults to a template that's suitable for use with PNP4Nagios. service\_format\_template | String | **Optional.** Service Format template for the performance data file. Defaults to a template that's suitable for use with PNP4Nagios. rotation\_interval | Duration | **Optional.** Rotation interval for the files specified in `{host,service}_perfdata_path`. Defaults to `30s`. + enable\_ha | Boolean | **Optional.** Enable the high availability functionality. Only valid in a [cluster setup](06-distributed-monitoring.md#distributed-monitoring-high-availability-features). Defaults to `true`. When rotating the performance data file the current UNIX timestamp is appended to the path specified in `host_perfdata_path` and `service_perfdata_path` to generate a unique filename. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 3c46c9f86..d5a03233f 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -7,6 +7,26 @@ Specific version upgrades are described below. Please note that version updates are incremental. An upgrade from v2.6 to v2.8 requires to follow the instructions for v2.7 too. +## Upgrading to v2.11 + +### HA-aware Features + +v2.11 introduces additional HA functionality similar to the DB IDO feature. +This enables the feature being active only on one endpoint while the other +endpoint is paused. When one endpoint is shut down, automatic failover happens. + +This feature is turned on by default. If you need one of the features twice, +please use `enable_ha = false` to restore the old behaviour. + +This affects the following features: + +* [Elasticsearch](09-object-types.md#objecttype-elasticsearchwriter) +* [Gelf](09-object-types.md#objecttype-gelfwriter) +* [Graphite](09-object-types.md#objecttype-graphitewriter) +* [InfluxDB](09-object-types.md#objecttype-influxdbwriter) +* [OpenTsdb](09-object-types.md#objecttype-opentsdbwriter) +* [Perfdata](09-object-types.md#objecttype-perfdatawriter) (for PNP) + ## Upgrading to v2.10 ### Path Constant Changes From 3fdc9669c671685eb267d28cf251e714de18af14 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 15:47:10 +0200 Subject: [PATCH 0283/1162] Update technical concepts docs on object authority and HA aware features This includes are more detailed insight into how object authority calculation works. --- doc/19-technical-concepts.md | 90 +++++++++++++++++++++++++++++++----- 1 file changed, 78 insertions(+), 12 deletions(-) diff --git a/doc/19-technical-concepts.md b/doc/19-technical-concepts.md index 278b2231f..f9820c316 100644 --- a/doc/19-technical-concepts.md +++ b/doc/19-technical-concepts.md @@ -190,10 +190,12 @@ The GraphiteWriter feature calls the registered function and processes the received data. Features which connect Icinga 2 to external interfaces normally parse and reformat the received data into an applicable format. +Since this check result signal is blocking, many of the features include a work queue +with asynchronous task handling. + The GraphiteWriter uses a TCP socket to communicate with the carbon cache daemon of Graphite. The InfluxDBWriter is instead writing bulk metric messages -to InfluxDB's HTTP API. - +to InfluxDB's HTTP API, similar to Elasticsearch. ## Cluster @@ -322,10 +324,10 @@ The update procedure works the same way as above. ### High Availability -High availability is automatically enabled between two nodes in the same +General high availability is automatically enabled between two endpoints in the same cluster zone. -This requires the same configuration and enabled features on both nodes. +**This requires the same configuration and enabled features on both nodes.** HA zone members trust each other and share event updates as cluster messages. This includes for example check results, next check timestamp updates, acknowledgements @@ -334,18 +336,52 @@ or notifications. This ensures that both nodes are synchronized. If one node goes away, the remaining node takes over and continues as normal. +#### High Availability: Object Authority Cluster nodes automatically determine the authority for configuration -objects. This results in activated but paused objects. You can verify +objects. By default, all config objects are set to `HARunEverywhere` and +as such the object authority is true for any config object on any instance. + +Specific objects can override and influence this setting, e.g. with `HARunOnce` +instead prior to config object activation. + +This is done when the daemon starts and in a regular interval inside +the ApiListener class, specifically calling `ApiListener::UpdateObjectAuthority()`. + +The algorithm works like this: + +* Determine whether this instance is assigned to a local zone and endpoint. +* Collects all endpoints in this zone if they are connected. +* If there's two endpoints, but only us seeing ourselves and the application start is less than 60 seconds in the past, do nothing (wait for cluster reconnect to take place, grace period). +* Sort the collected endpoints by name. +* Iterate over all config types and their respective objects + * Ignore !active objects + * Ignore objects which are !HARunOnce. This means, they can run multiple times in a zone and don't need an authority update. + * If this instance doesn't have a local zone, set authority to true. This is for non-clustered standalone environments where everything belongs to this instance. + * Calculate the object authority based on the connected endpoint names. + * Set the authority (true or false) + +The object authority calculation works "offline" without any message exchange. +Each instance alculates the SDBM hash of the config object name, puts that in contrast +modulo the connected endpoints size. +This index is used to lookup the corresponding endpoint in the connected endpoints array, +including the local endpoint. Whether the local endpoint is equal to the selected endpoint, +or not, this sets the authority to `true` or `false`. + +``` +authority = endpoints[Utility::SDBM(object->GetName()) % endpoints.size()] == my_endpoint; +``` + +`ConfigObject::SetAuthority(bool authority)` triggers the following events: + +* Authority is true and object now paused: Resume the object and set `paused` to `false`. +* Authority is false, object not paused: Pause the object and set `paused` to true. + +**This results in activated but paused objects on one endpoint.** You can verify that by querying the `paused` attribute for all objects via REST API -or debug console. - -Nodes inside a HA zone calculate the object authority independent from each other. - -The number of endpoints in a zone is defined through the configuration. This number -is used inside a local modulo calculation to determine whether the node feels -responsible for this object or not. +or debug console on both endpoints. +Endpoints inside a HA zone calculate the object authority independent from each other. This object authority is important for selected features explained below. Since features are configuration objects too, you must ensure that all nodes @@ -354,6 +390,36 @@ one might have a checker feature on the left node, nothing on the right node. This leads to late check results because one half is not executed by the right node which holds half of the object authorities. +By default, features are enabled to "Run-Everywhere". Specific features which +support HA awareness, provide the `enable_ha` configuration attribute. When `enable_ha` +is set to `true` (usually the default), "Run-Once" is set and the feature pauses on one side. + +``` +vim /etc/icinga2/features-enabled/graphite.conf + +object GraphiteWriter "graphite" { + ... + enable_ha = true +} +``` + +Once such a feature is paused, there won't be any more event handling, e.g. the Elasticsearch +feature won't process any checkresults nor write to the Elasticsearch REST API. + +When the cluster connection drops, the feature configuration object is updated with +the new object authority by the ApiListener timer and resumes its operation. You can see +that by grepping the log file for `resumed` and `paused`. + +``` +[2018-10-24 13:28:28 +0200] information/GraphiteWriter: 'g-ha' paused. +``` + +``` +[2018-10-24 13:28:28 +0200] information/GraphiteWriter: 'g-ha' resumed. +``` + +Specific features with HA capabilities are explained below. + ### High Availability: Checker The `checker` feature only executes checks for `Checkable` objects (Host, Service) From 108b85427c635aa308e2e4ea00a9635e1b8d2bf4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 16:01:57 +0200 Subject: [PATCH 0284/1162] Silence the debug log a bit for IDO events They're actually not processed when the feature is paused, and I have already seen them in user's logs when analysing why objects are not updated or notifications sent. 'DbEvents' isn't related to rather 'DB IDO' and is confusing. --- lib/db_ido/dbevents.cpp | 43 ----------------------------------------- 1 file changed, 43 deletions(-) diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index cd3792b48..00e08e0a4 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -197,13 +197,7 @@ void DbEvents::ReachabilityChangedHandler(const Checkable::Ptr& checkable, const if (cr->GetState() == ServiceOK) is_reachable = 1; - Log(LogDebug, "DbEvents") - << "Updating reachability for checkable '" << checkable->GetName() << "': " << (is_reachable ? "" : "not" ) << " reachable for " << children.size() << " children."; - for (const Checkable::Ptr& child : children) { - Log(LogDebug, "DbEvents") - << "Updating reachability for checkable '" << child->GetName() << "': " << (is_reachable ? "" : "not" ) << " reachable."; - Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(child); @@ -339,7 +333,6 @@ void DbEvents::AddCommentInternal(std::vector& queries, const Comment:: else if (checkable->GetReflectionType() == Service::TypeInstance) commentType = 1; else { - Log(LogDebug, "DbEvents", "unknown object type for adding comment."); return; } @@ -475,7 +468,6 @@ void DbEvents::AddDowntimeInternal(std::vector& queries, const Downtime else if (checkable->GetReflectionType() == Service::TypeInstance) downtimeType = 1; else { - Log(LogDebug, "DbEvents", "unknown object type for adding downtime."); return; } @@ -731,9 +723,6 @@ void DbEvents::TriggerDowntime(const Downtime::Ptr& downtime) void DbEvents::AddAcknowledgementHistory(const Checkable::Ptr& checkable, const String& author, const String& comment, AcknowledgementType type, bool notify, double expiry) { - Log(LogDebug, "DbEvents") - << "add acknowledgement history for '" << checkable->GetName() << "'"; - std::pair timeBag = ConvertTimestamp(Utility::GetTime()); DbQuery query1; @@ -775,17 +764,11 @@ void DbEvents::AddAcknowledgementHistory(const Checkable::Ptr& checkable, const void DbEvents::AddAcknowledgement(const Checkable::Ptr& checkable, AcknowledgementType type) { - Log(LogDebug, "DbEvents") - << "add acknowledgement for '" << checkable->GetName() << "'"; - AddAcknowledgementInternal(checkable, type, true); } void DbEvents::RemoveAcknowledgement(const Checkable::Ptr& checkable) { - Log(LogDebug, "DbEvents") - << "remove acknowledgement for '" << checkable->GetName() << "'"; - AddAcknowledgementInternal(checkable, AcknowledgementNone, false); } @@ -825,9 +808,6 @@ void DbEvents::AddAcknowledgementInternal(const Checkable::Ptr& checkable, Ackno void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, const Checkable::Ptr& checkable, const std::set& users, NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text) { - Log(LogDebug, "DbEvents") - << "add notification history for '" << checkable->GetName() << "'"; - /* start and end happen at the same time */ std::pair timeBag = ConvertTimestamp(Utility::GetTime()); @@ -875,9 +855,6 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con std::vector queries; for (const User::Ptr& user : users) { - Log(LogDebug, "DbEvents") - << "add contact notification history for service '" << checkable->GetName() << "' and user '" << user->GetName() << "'."; - DbQuery query2; query2.Table = "contactnotifications"; query2.Type = DbQueryInsert; @@ -902,9 +879,6 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con /* statehistory */ void DbEvents::AddStateChangeHistory(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, StateType type) { - Log(LogDebug, "DbEvents") - << "add state change history for '" << checkable->GetName() << "'"; - double ts = cr->GetExecutionEnd(); std::pair timeBag = ConvertTimestamp(ts); @@ -1227,9 +1201,6 @@ void DbEvents::AddEnableFlappingChangedLogHistory(const Checkable::Ptr& checkabl void DbEvents::AddLogHistory(const Checkable::Ptr& checkable, const String& buffer, LogEntryType type) { - Log(LogDebug, "DbEvents") - << "add log entry history for '" << checkable->GetName() << "'"; - std::pair timeBag = ConvertTimestamp(Utility::GetTime()); DbQuery query1; @@ -1260,9 +1231,6 @@ void DbEvents::AddLogHistory(const Checkable::Ptr& checkable, const String& buff /* flappinghistory */ void DbEvents::AddFlappingChangedHistory(const Checkable::Ptr& checkable) { - Log(LogDebug, "DbEvents") - << "add flapping history for '" << checkable->GetName() << "'"; - std::pair timeBag = ConvertTimestamp(Utility::GetTime()); DbQuery query1; @@ -1308,9 +1276,6 @@ void DbEvents::AddEnableFlappingChangedHistory(const Checkable::Ptr& checkable) if (!checkable->GetEnableFlapping()) return; - Log(LogDebug, "DbEvents") - << "add flapping history for '" << checkable->GetName() << "'"; - std::pair timeBag = ConvertTimestamp(Utility::GetTime()); DbQuery query1; @@ -1352,9 +1317,6 @@ void DbEvents::AddCheckableCheckHistory(const Checkable::Ptr& checkable, const C if (!cr) return; - Log(LogDebug, "DbEvents") - << "add checkable check history for '" << checkable->GetName() << "'"; - Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(checkable); @@ -1412,9 +1374,6 @@ void DbEvents::AddCheckableCheckHistory(const Checkable::Ptr& checkable, const C /* eventhandlers */ void DbEvents::AddEventHandlerHistory(const Checkable::Ptr& checkable) { - Log(LogDebug, "DbEvents") - << "add eventhandler history for '" << checkable->GetName() << "'"; - DbQuery query1; query1.Table = "eventhandlers"; query1.Type = DbQueryInsert; @@ -1458,8 +1417,6 @@ void DbEvents::AddEventHandlerHistory(const Checkable::Ptr& checkable) /* externalcommands */ void DbEvents::AddExternalCommandHistory(double time, const String& command, const std::vector& arguments) { - Log(LogDebug, "DbEvents", "add external command history"); - DbQuery query1; query1.Table = "externalcommands"; query1.Type = DbQueryInsert; From 3db20314356628c12e2bb9d715fa0c84a5738f97 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 25 Oct 2018 12:05:45 +0200 Subject: [PATCH 0285/1162] Fix typo --- doc/09-object-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 6dda8c91d..232239676 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -287,7 +287,7 @@ with the [add-comment](12-icinga2-api.md#icinga2-api-actions-add-comment) API ac Example: ``` -object Comment "localhost!my-comment" { +object Comment "my-comment" { host_name = "localhost" author = "icingaadmin" text = "This is a comment." From 68faeccff817b15c9c7838670c49067aaf242c43 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 25 Oct 2018 18:00:10 +0200 Subject: [PATCH 0286/1162] Update Windows Agent design This updates the Windows agent design to use the Icinga background image. refs #6729 --- agent/windows-setup-agent/icinga-banner.png | Bin 2376 -> 43315 bytes icinga-installer/bannrbmp.bmp | Bin 29914 -> 29914 bytes icinga-installer/dlgbmp.bmp | Bin 155830 -> 615402 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/agent/windows-setup-agent/icinga-banner.png b/agent/windows-setup-agent/icinga-banner.png index 34d89956a412d4de3805c808d424824103d78fbc..24514952380810131b0e3047fd67231a547dc3a2 100644 GIT binary patch literal 43315 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 TVWTl600000NkvXXu0mjfW+l6h literal 2376 zcmaKudpHx`AIDEA%B8DICAz3&qMMcE61jFkvyCvfEHal|)@sV6Ul$_eQsnjxu}xUm z*cj*n!x0#~0G7I_Qi}9V`^L(GDe}2C|UgvY3^PJ~%KF{ZTKIeU69qnzD-(Enxtx4wKI9*R7V0x|l!{sab#B_HsA?3R_oL1v0a?Nf)(QK(j0!XU&Lc$Qn{MVlf+(<*DL2E3L$>0I|_Za zbPn$gKT9E>TZ6NRL1Dd@Rta|bi+6RdpBA5cBW!(YLEoY{s*f)eDjHb6U6*d(U|0KC zx%+~7I5yO5H*yvD9YB$$;9njg0Qj9VC9A=|MDJTze*Vr~v(+I>+=kxR!R;x6=;8>N zi7pvXj2t-HLkOG_tw)nI6IJm=hqJz5<-jKLcr$6aa0)w`uT?t@fR8kyMIvQhQnx(k z863#;3RIE0r|u%Bmyp%jO#;=l66v;R@h`a#YdnIC)&HK+MnlRBL39ArLqD<{ekkzt z^1(QmDn|8B}p#yodoZqNsRx*wJCV`{E-V)AcKE-`o&V0`Rw z_sUn!stxtLYeXP!)9}l#yLrIHU+2g?&11Q(Ua-`7SQeBENCL-eks}MUvq$p>NNC6RXR@~|PPH{){o3BaDSa#20B0A2qfM~OB@JH+F_+tqor>VbL!oE7b_@2 zjWsU4%O%?Mg{zpIClBtdDty|@cS+>TeK>3ytFfhLChFCEx9mf0l0LyI)egX5$9&?c2_sqLA zq;HLa2H!ohAZ1q93c=P{Uu5wq@m)dRN4uvxaIqb3s$j;lQ0uG7N5wEWM|heJ4Pn^C;Gafym&pRHC)vj7sc#0li1f?>&a9De_@tRV!dVnm(!m z`Z;dVkL|b$&de*d%MHbA32QB@LKKYcm;%RhTItC~a_EBdPT2*n<*WM-oUOU%nvPLl zZpUs&zitQhH~4lh^`hT-@9Nx3%VW?(&H+orsnWI4PpVR!(g&aWL=YQcl)Swq3BG@6 zi`MXAL&Y)h2YO}8rSTVZmP$5TMNOa(xyVJGQYPPDbAPUh@54t_SuCgdn&uf%k8H|up~ckE@(5S~3Qs(U!U_}Mzylk8(QPf%%Nr~-Pu ztA^gRY2WP}11gEYHQR-RN6aQTkAJ$yz-#{sTT0fw?^eQ1%M_F$^FO${7Nvdz(Wsqd zQp2l{d}h{;fIlsTi;6hL&TKDHPDDS3(=ctN5cc{ILvNN=&PQCzeEiJv-)n;Cl7-V?9q z-1vi`bKYU!N59RdOUDS`^b`P3m0Tk-Z-eJgJZDOFUmInAkQ?HZrE;>PZv7yf3Z=8D zm4_75BmBQU5l1aZ3z4P@7ac2?2dHgiJGIJQ-~LhqQ<_k$pf0gZzSW1ogh#0Shw|+0 zK^*@eQi9#{iljRj2Y?Zu$&36Emj$DEaj8s<^!-iMg>o6{oL0CW?KEwn-Hq{hr+f}aso|hU);>MO*7`v#Twl_%N~

      fY~W9(I92p)#!G&AtHc<^xmCWG)j+VsUc}5kx^DD~9&&!WCxlLP zIcG`W-G0FliPvJ1cdFlAN;}ayoT?i%h@W5LjWHLeM~0!^Nh*M@heW|^$LfE^T_}8X zA9ww$|5c327Y(!E@XO1u5i$1|LPPyw-W7t<=P+p0n(q3p19xspOPB4LbHr%D&dzM^ zLt<^{s=VXa*3|v#9~F&k)2>tLcPdME=DJOvN061r)XS_1LE8+8d?@{KWSHn-Zc3cj z{yNWK*R~}S*_ZGsS)2H;xz>xa2}QM-Re4wHo-N@2IBUa^elA|ba#zsd)K|`4gfM~{r*DSRS_Iv)H#;<7o|I+vst^cn|uPF5j io233$5NR%N^#bH4hKMZ9#~RXK5U{hdw=A{riung15{ZWZ diff --git a/icinga-installer/bannrbmp.bmp b/icinga-installer/bannrbmp.bmp index 51c3890b72e441012e6d64cadb771afb53cc6e9b..0f68e62000bf6802091e311053737edfa38d1dbf 100644 GIT binary patch delta 846 zcmaKryH3L}6oz%wkWz8WfGALqnCL6;3ijxZW=Ddj;0=&Ex}zD9D&++bm!Sm-q_zxQ znEM17&G{WCb%a!J`TU>Tf1KrtmMa?n9t?H6lq#USu0?M58xQ&vxD z$JT1J-edSdoeDlNI%D+7^J#8ejUEGmNR&qhgk(%4Y!HA*#&yxVpIeBk?u7OXD?JXQ zp&iCLh}kAT@kX3A)Yf8xuFunJq~{TfBFv;ruG1gt#a)#aaJ;qXDZfq^gbZO8Ra@j7 zOpv9ZFq{J?zOMx{I=66K50uiQD1&n&)aD#tbYZ#N`mVCQA_l#FQ)U_}hcU60H_A9Z zeh1afJIBP_`55eDPE>@|EU0A-B91-ZVl%zvaBxO#i>-NZR00j)A8!Dr0p^tQ%A~}O RAy`ntdc1>f_1iqR{{SZPkW2so literal 29914 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°~b(XPc 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 Gf&U+POn31B literal 155830 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 F`~UiYV445` From a1540aebcc4b082fbdcd56bbae69b02063a2c517 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 25 Oct 2018 18:07:05 +0200 Subject: [PATCH 0287/1162] Update Windows agent documentation screenshots Updates the Windows agent screenshots in the documentation with the new design. refs #6729 --- .../icinga2_windows_setup_installer_01.png | Bin 9237 -> 105133 bytes .../icinga2_windows_setup_installer_02.png | Bin 16838 -> 16884 bytes .../icinga2_windows_setup_installer_03.png | Bin 17551 -> 8091 bytes .../icinga2_windows_setup_installer_04.png | Bin 8180 -> 8140 bytes .../icinga2_windows_setup_installer_05.png | Bin 8600 -> 92081 bytes .../icinga2_windows_setup_wizard_01.png | Bin 26523 -> 75046 bytes .../icinga2_windows_setup_wizard_02.png | Bin 39043 -> 85114 bytes ...a2_windows_setup_wizard_02_global_zone.png | Bin 37111 -> 82614 bytes .../icinga2_windows_setup_wizard_03.png | Bin 28144 -> 76407 bytes .../icinga2_windows_setup_wizard_04.png | Bin 19553 -> 64601 bytes ...a2_windows_setup_wizard_05_nsclient_01.png | Bin 69068 -> 117422 bytes ...ndows_setup_wizard_06_finish_no_ticket.png | Bin 10337 -> 52403 bytes ...ows_setup_wizard_06_finish_with_ticket.png | Bin 8158 -> 50553 bytes ...a2_windows_setup_wizard_examine_config.png | Bin 38218 -> 57336 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_installer_01.png b/doc/images/distributed-monitoring/icinga2_windows_setup_installer_01.png index 358548b0e5c1a92d8f138798ea06c5b3cb6c8cc1..8460dc66d40288b8261495dc22d9971272df9647 100644 GIT binary patch literal 105133 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 literal 9237 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 diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_installer_02.png b/doc/images/distributed-monitoring/icinga2_windows_setup_installer_02.png index d23b7d68cb1a6f303c5fd51ac9737d40df0b215b..476b6d2eae4ab11045120dd5054a5762d36ad7db 100644 GIT binary patch literal 16884 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

      *m_`lyF>1fplu?>I6UQb6^dh=2z0eC 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 literal 16838 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

    1. R;Jyok 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 diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_installer_04.png b/doc/images/distributed-monitoring/icinga2_windows_setup_installer_04.png index 2b6b1ac6d3ac44565747e25359a7add440f63956..4d314e6434cb08178aead5b219476dd81e7035ff 100644 GIT binary patch literal 8140 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 H|Mb5A%4g|% literal 8180 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 Kr98!lFaHlzO0|3d diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_03.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_03.png index 929814a9ddf6da56a499b7ac99767169daf693bb..4d9f4d91fc4786d06e7d2d082284741700a19789 100644 GIT binary patch literal 76407 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 literal 28144 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

      v}fbkE~ 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 a6*seZdhV;BCsySDj1A3yC!TY@_dfvT!G3@M diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_04.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_04.png index 3d4c5816a10ec07057474fe15ee79dc9a2c563d2..8519a3c1896dac2ec3ce9c0487f40376de476c4c 100644 GIT binary patch literal 64601 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�x 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

      IlFbDR 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�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Ν97t8x*Yr?C}GPlVHX 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�x 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 Bit_*f diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_06_finish_with_ticket.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_06_finish_with_ticket.png index 8d1b3c42de6a2d587ac55317326964d96064def5..d747d8970705a3e57dfeec26a57f27a67e41ecf2 100644 GIT binary patch literal 50553 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�x zvyDKIqH%>n35U$)2nzWlPe~ldq2#%Qfk&JPl6XX%^eA~DHNS!@1>HE~%1(>ygA z%Y5ynw}`Fa(WM1!IzlTScWiZLg}_%Xj#NkmNs_SHPi7X#84&NjE93ZE$c7coH8xA9 z!q2|z;Fm%c>bqjlp5u;d=nL9gj}yK$&qy;vk|dIXw#T~>toMC+~?HEMbdMR zpuTern~p%b?>w3Np@MQ_z_H;8=3LEs_A z$im1QQ3#VxP&)h0(aCp9UgStL!7D))u{76UyVGH=*`yz*j7AaiF37~J#nOHi1#Jo? zIN@jl36Cz+IlWZltFNqaWxhf0&D*@W(Wm5xT-_OQ`Sv=o@TfU1R%%=&Y1XSOhn6Rn z>r^V1fzkZw%j=|8g3a(%LJ$Nr9cSD@>9Fht*f7L#C2~%YTSM6^x|4tPsYf_jHq{F=+YYu7)1$*_Q;(=)!#_B5TVls7mwVgSS(6`9xFKno{y4}EKbR6vEVHh zoV#&dN{O+>+@~;jzK7=*6MLGbBuPe;6-l$O;JXUn^JxzU$g%F3wYxfY%5`wGK}tbT zDiKF1tE&sVb>kMEQ{vfkP2RY^K?R3S-oa>zG@6~kfO;SqY0ZW6XSn?GH6kq-#Su%j z3ZuA4Y^;E?>lR3=aabE9yw$xUT3{tgxVY0LcNMpW5fxwZ_~}L7x_TR-p5 zp@&6{7iJnEB(<=FM37`DS)P#R043(@xj}voj;|>Y9v|K(f@V6K6TU|J)C_mbm=W=ilbs=~Y&mHJ(@uY08YY zaha8R(c;L4;bZx`&MK6G%AQAB}aBoV4s7|*qip=u1j0H=UGU*yT~~Zjl5IE z=wNj1pkp3@upQhab>|oM&^t577uFW~TcRk+HpU+KOlISP86!}7?87OnCEIsCnYE}f zharW)l@cop84Ej3dZ#f|-*HEd6zM)n&(Cm84v7q>>(+;U0^{)cb9$!|UNC>5z#AGY|^lMnLMm)~S9HYgNM zl(DJw)STXTi{z)QTwGt{lpM}xA-810Kl-Du@elsi&oIm#UT7IEZ?uWijM%tXJSt^D z7>3MyhI&vqEexZSL7cD=EAl)i2&zPmA<~9CO~?`WCMgyG2$U3{ix)=9!mHF*l2NY7 zlAJWx#OVy>CS)PIVKb`LI=w-kQJNKTT}iCfIF3YGfyfO$;MXe*hC{lMW~F3tbcVHp zk3MvY=Pq4CWt#b_$IWd`j9|6uu`|fYjHF!hd31G=&%bhmQYpl-8IDxcN{U`qFdxHF z4#s0(EmKh6lMiy`cALL^?FOAeM3fs!j%1Xllw3nK zP^7s>oF(+5_>Slyr7U8Uwdk2?K#g+;XPgWd2wTz7n$66exhlldJ(J@~iF6#AVL`1c zIo6!Dg^Wp>ro_2skY#j}3@KAG(}67I(;xi+X?qK0B-(Y!Gl3hr-E#iYK`~u=}W-eE~#Do_OFSzwz@QA<8tb+<2aJ)=}V?tMWbjm2yv= z*+Ic@mcH06gg-c`ns$nN%NHd`=uKQDS6@6kd5w;m1d1!`M`O;eWSzY-q_ezVEq#W?8h0I zd#_QKcY40NixT#_kQ^>`_v3Nywpe5pNvSDN#c_klQHzDKKEa-6G)wKzqIc7u+r6Jt zlXz%;yq|M|WxnJy)S7nE=cHdIpVR~12ZLgbgOrLghSge`vR9!!8u04+Hoog29GBe9 zXwF|?*dNgwMbtxwX5v$JeO3a8Z>`^E*d6l0hflFu@p$3&8w>|IUwQclY+Hwi7Aq{3 zHBX&i!Mnb}^`XYf!l6PS5VGjRl{!JWun^AC>Gk>g&Kf2R_uve}|7fxX3^I z`YW7kHrW!IP!@WEN_jW}c2dP!FTo@c0z;(~uu>Ozo=3%VKo{?EFAC|8hHMWqbXFj` zl~M`EaY&MsC`lM435gO&=^R)io98(t&&Btv3`WB}7IcMqd+`}pIyB2=Qfuk;hlRp{ zPI&U6NBG*yZ}Ienhxq2}m(W<2=d1L31B`G997UsAVUP~+#@cULrm1@Ysm@7LLu(XM z@+2ltN%Nwnui`t*Sqq_0=s43lvR)!s>qT6A;|)s2^1)N**idb*Z+F-pN}fI4;L?U< zxgKJrq}7kPy3r=5U6htcMPY_z@qoFC;3F5#^QD(wBdp93MYDj?!#2`R{)3U+~EfUH}#F)o*rxjQ#wq&iU{I%RK$?S)w@M^Ur^u zYrPcVdfe&``Sx4ad0?^5>6Jx(_QEN?^u{fc@sODK3;sl+uSDP~1=bXHe4@DHcJdtTQ7p!OqxL&vfsstL>XhBp=d;D?a7>H+ct7J4 zC6B~v2AO6#C=*Lde{9ip{AaX#jU`{QTn(s7fkE=t))vM%I6{)6FxiNwR+@bF2UqyT zhvw-yA=N-~UJJf*?Ixa;oLO8T8%AWQ<;$<$;=%)`c_Pnv{q}XNC=-naeDUHfKJ@Sz z-nY8Ue1FL0?Fh#aWAxR~41GLRrZepG`uc4$SAkpRT+QK|-@C-tAY;o|a^W&C;CL># z+kFfQD5yr)8Uh7@@8UQmGOcl9hcpvx$A(m=5hE478OlR!aJCP_kHX@<(9 z9~n|pbVe$r#(t%{_pM$HG1^WOIWwtEACJ2{*95*t;5uwaNm1h{B~}O?KC{5aW{YPY zevs$ixytsaorV@PO;WM~_&(&MoJiI!`&8;@KMj1jwW(|Ss z6-@K;F{GF_vq&kagk_@9 zki?ew(-*IzT!~g?WMVMvhpZO|tgf9;`Wi4UBpGL6?^!IX?C9GM~THD$s=cn5YlCXGJ3ch+`CW%{Fe_jnX{Ko#bwm-%$-4 z2hGjLO$d(D^l(?YSRUQ5fw5ydy4?=HS!&h7fnKV6lat;0wL2keaR*g>kaLS1f8{92 znnUleo%|WslZ{;>%&s5b4?Q8fgIYa^l0RUK3JZ>-P(q>sqw_JUKTgc{?_a5@T)?yg zZ+y*atmu?kyN~7+yR`Kf)tBSv;mATxX))VW!;JcUBcxtuABg-f7 zy`0P2n)>1*-?+NXN0;X*m3-cRLNG|c2*It^7T330GfgZKC$}tC6hHsi1N_zNw*lB* zi&&^txwh42b+O5EBc#($u(u z0msRSjlv1aoD3i>&B}a(o!C+}kVJi|GC|>E9L38wJ3Mn{ zfxo)cp_M|S1%p`A=||Km6?Xc49LGagP2hRNxdD@pn;#8T-{Zt$71wnc413%frhMVe zYp5(^Wp0jAr9wGydAu5Ob)!XQeJmL{E{>b=;QTy~F0AnXz5ELGdYwkS&M1m7R?tpF z(K+sh^rIdgn%EdBo`<8rlL4;lBFD*;F@{lQNz)W-Ct|=F$o7=w9OjxbJ9AEub~z5K zduCN3Fnaf$G)7Nj|9rj1sMjSO_jxJ-HrJEtszU*$_Y9f)FMjQ3@ciJ8$@IdR75;;t zdxkH)_9qC}KQK5=>wAI&H~7;Ren7bt@XSM}sh3M=tyyT+ahy@ncmsUmkrVv<6K4Qu zR4e?4zx3CL;}{`88%v{FrdcU;=N?&I;$x4VE|NJRijLu9p6gGx_a2#>t^NF0Zj(jl ztr#~06iKStv*4LcG~X>M*^0a0YdJy5fNYG)nVFvEgA(V1C~!T_B3)Tn_nEse0e0Vl zZh~SKKRaIH_HJ%kYaFRqY0hzbr-OA}mVAdBTRS+8S9Dz-k%Sv%k;dQvwZNkic#H-^ zvMj+3e75@|v{lsHVjOr<5Cr97!p&2jKGWp6OB)CbuUxxDU+3IR6P`LXhe$OnpXaU1 z*GO<#ovUI7LyRLaj>AT`M-bSdxKiAg~2u12jw)!Ksdjmp8^4QrGKK9tdymI+E-C<1Nz$Y&} z%G$;zU%q;gdbL748W!Wl^C$-u0%<6h6qV3teN&JpF^*Hzy(V!=+d4o@YIi{qSL&(b z!^HM$!hpd|$yMLQcNK#qC&_ocVE52m zVlMiaeGlYdBC-ryCOGx zoGXqw1`jIUx8gYaIND3~z*lHeIAP_X2;_YsNMlX5iLa_X1WghXttB~@#h9s~(nlbT zvxv+rf;V;s!T{RrE`aP^(8Z}3@#GZ~_l`d99%C16a+LzD3rQ*79lg9s5_~L_6^Sw$ z$5luQ1f;N8EbOQDHi5Cng`H z##zT6nM@uB{l8m6XaJ!LJu+Vz&Na%sw$Vm9g4MvIog@gM#^*I7nKMb)wLyz z6-CVxtaW2zol*;{tabXNLXulc*-2@X$}BWPZuUpyaYU(HB1Up$y+^N~b7rYTE6O+- z1guwboW5Xjq0CD+)O&8+ zQg-R*g0H@DgB;7rT8+Ul!NW&uO{6Wobc8if8jf%rhtVKoU?ZARks>kD16?#SxHELC z)w=+X6nkT+IUq*MnL5|m1@>VG-gMrQW{S#LV`-E;x=Dtf)WnIy*@Pb{GWYG5U*p;L zUBDd+>h2<3f>>Kd`GjKmVFd9zSIbj0&hAPhomiab)Z!exy>rKLg^<*I#czN5Nj`FZ zh5z|W-{((XUAqgjaoA*j7&3R~=hHmr)=rxbo>|0N%fqKm5O`N19*a3xi$-FUPcLVj zU>2RXS2tUvSq{?W-+2E6eC(kU#Xhr){xBlTvpWK|l!|(#OyGN5SY71jpL~dKed*PS zZ^uuNxgQfW?p`M8cZ;HYH@7`a05b^P5BnY-cT>XR2t^@?VGk`jzMt#dqYrp!GPz5+ z9=7Nx(98Gk`8raPkx}yuHC5rwSI*88001BWNklcPbEYy5jQN-r3heT6zJwh)e8YRSWipdP+z-KTR(eDj8S1*gVEcNlALtDjLUe@Li9x+rV{Qs;)z7HEEWiwPhH^ z^vQVh`c?AP75?BG7x5H?o+8OC*?2B2bYKgm3_;OBnx<(%TN^p8hx}1BkL}l26hcrf z1x2!6K(covhCf!x+;9KESNWI!^?4euvnMF^h7lKUw}>Y_?uQ_A_xk@mnrt(x-_1^s z?_avX`%W#;Y&JPJU%^IwM5#LSaEs4Axft@RA9;+kOLKhf&0Bos2iJ*(x=Xq#?((yv zSHIicKL7Odf61rbcMi{WIW=F!HTg8b+(p9-b8eB%1LVf=SJzu4ZXIC_4=vR>G2bML z6aMgl(wPNQ6+z1?N58t}-;75@08%Us>r;o&*KVxvk% zM5jIEGcR7|p)&!)+ZpY_h~IejJdKivYYc1KeLnl_j;^8MjA;K(Dq2F=qKZ2|^o`kSNCz zIs)aobg*paJDjL0hKXdDq=o#?#0dj2WrmD4cwVVkOc+Bd9g-xO#+M((QgF;%Weyz_x{OA9Y-}t4EvskZ?YeQ!k@qc{fd;Cv- z{t`l}JtDySse^Zd%!vulZ6QJN+@%eE@tK%Lwanl7)H5Vj@H?M*zAz$I4uP~hx>)9a z|E*u;%tC`a&*_c|ts3DdIFhWfhyHB$n#7bg-k;dz(&gomM}HKv&?x-me(SG4!Tk zKBwm|-r|!FukgMHR(a~dlYIL95Ap{uUBeiSQqEnGqP@SH&_i;1C+^j`;fJB&cC<6e zL9_S4Nz(LA*~1%w%rUh14!eKm0Ijv%gyK$NU@MC8tPdDJ_i~?iTjK3Kd++Y~xj2ME zn0mtAS$IFgvd)Z=f<~HLmt%JYhu=xAGC7y2oz`8cM2RCUQi7F5!c|b8;z(g;Goj3l zokpKKy5&V7hcuy;Z2=!(j%ZZagV0Tf>a5g>z?hjj;C+<)YzOf{=d{0pYg(hX&mvAr z$x5xvFiz-aIleX2%RY%QMIxt*WIUGwiA9;BF79MlMr0uygAtqLoUAlZ($X0WZ~{xC zUS=3aY!16rl*3ZFN}lKRqm+>lR2(Qv4}udcTVvV^M8tk$YLvAV!_FJI+Kw~y;OtTw9LY;EzzR?ed+PJ|vw6KIK5|i zY+0#QX~jbp8g+WZ5owlTZH`V0YrAabxevyymCkp|Qk1Y$DqT8~it88tutrjIG>!sS zC>#OxN=Pq>i88}dSVLM+(ts2%rbS_}cMa`}6I@?~nJGODydO=JXa zN~!GQ8-qj=crM#o5o*hqu16>_B=oi!bt1x&&r(Bjs=0)3B>z|U5?8mk$r-y+u!9g| z=b}_o2?GYXhFnuEm9Qql5pq0!1qBvfOjFL-X{A;UN%D-KRH8o|U~)^@)hsn?yt3As z8NXuO0c?xXh&)FKOB5CKeURfBFi;v1I_h*R;=jWmDT0mpf`D9pa0$^e&O*`tTroD z$|1k`si%4J^a5Xe`68`B%uhXXil6`BBb-@i0Pw{ZUghg=tQFpBrqF{?;}!pGH>ng% zjjX3ybBE;)Gj(!8>@E0iM;ZU)pL~P={%?K?*LC?@pZEZeug>%3SFdoR)#Jj+1wQ?O zhj{elLeZJp@AKb&?gjd(#u~%>PA#(1tO4+?H?Q-1Uwaw6+BjL>Ke;PD|N2dyJu}aR zQ_C#ZLO%Y$0-t;JI-TSv6zh+}w#P>6UsI_V!=%NPDMB}q>o9_21-HYJ&btNW+21P! z4x+I6v6dWzG2*`DUuNIwsq2FjUeUdL=iKOb&M5(TF6*^*l1=VQh-m5PYyc&lj&di%7xO#;*`wlJZV04ahT&`{0WU(HyE(JqbrQaWLVY$Ihw~ug6aAC2;$ImorcnNtd zSXi#{>a`7St#9H~E39{825~}PcevS0_`vcauix&`Hrb4=oaSP;!}+;6F5kGu^3puR zBqPo(lR9EyW@=hb@uLQL)q}6Yc8iSA^32}v`Uds{2((A|grfAwpWR3vJ zfycZb5PB|`+8sKhgi?Kh_SPm3E!4Ty>GIZ&=FCb)D@kbvCEmKRNuySyGZ+-MXl0+_ zU_@RHk)s0nn-6M;az>sFsjE}`ldpW2x1tVVy^7e{Mhb}(7GW$B7ik5tD{);PHydH4 zWDv*r$|2cT!XQNP{)L`LW-RT&fM%t_?d=^F<{ETbT}Go3wQzn99l2Yku^T5VVL%+E zgnrQ>?70Gx=tmmslqv+HYb6gy2|E4g_=R!zlgu4hNc|2cl76cB!B)n_ogv0ThMXcl z7WS-A#SwJnfyj^)yGhbG;7O;jIVlGoS(Z;pi&Xmjqc41qdg$|uPhX%>3HgPm9_7ii zC&-MUSuRm4mjL+w#jE`8*I(n6jRAkCO#NCOQtzvrZu5ohz5qfR}^)R1LEwe zdEx+3@?9LqA#fCuU73wk8~*6kb?Sfob$a z{5PNdE53Dmgh3LLv)Tv=eU~iDxVST5;8w@0or5Jmq#yFlE1UfC`W6qJKEYFG7MU*x z^z-;wsKUSxF8uV_MLv7w3NitOW~)EqktG)+ zODtDYUbwl&nMR$}YL(4)kFrp7t%nRf{Lp8RYW~{UCJV01Fr6c_hP+(jN)+?i7jN_6 znR!0{)@}aq-~TlIQJ?SJ?6T-7Mkc|Kqq3M$;$mzZS?|VNi-wpqrd;>Ab^9jDl`NJ^ym);BL{6APtrC(&2CSsr?Xpm9 z&>C#wJ5^4W1l4kltr&W7g6!?kk8&=ou5xSGV<(erbTua3;Pmn`*Ed^?a!bi87G;_u zvFnXSR4XNV?Hv{;jZ}9kk35Mu2Ciy8$~QzN1Np1K!#DWdUa2%Y#@8tt~E=Tq*j4;W*YE zZvlE#*^H|E?0@n*!`rVOFOVM@@a3VC_nyf`%A$aO3?1)p&lUIkNABI1wid@~oMgbC zzW5ejxwwgDcLHcdId84ESlig5M8;e-WWG_OQ7++oE}NU1{Qj3;;2;0Rt2}?BLuPmP zooP)H4H$IY5kG0q2e52gr>V!din?L*h zWj_DLI=w_s?`5pv_1kT(Zfv9C0V~Za&03XuxkSnL=yW=K=3C$6cb|KU&%CxyGM?Nt zf|5>%J6nA5mCO9`Ya48j?Z^)LGub*(Mz`HU_uG8wjWxcp)*Fjc-kp9w_;=#SWbTdx z2XU+<;;sqQk%^W#wDa$7`esKS`nu8)#i8$$eTS6wbkTE!IP~3~!zAIH zaDWG$@4Y5-Q(}8&H6SO8klAr-#R1p4*QMpidpmnxVpsmdl?pYEAKIEbx_b{wj^tRv z#2iDPaewvf>8bht*Qw@9?L5Y$hsh7(P)10mTh^=8xH;(aL zNt_!x!vv*#PE=jOu*~<@Hc`@};VEvnhr}kQ;!0|jI*ze~flDA2-8|#wPN!g|gu;=M zM@}tq@zzaFEH1IrAF|aO(kPed_4=GTF;BnOBNv6f+-wpuiXs-~<`|7eq-jpIT*73Q zauDDvOE*nPvJ6bd;=%&0oj$oX)T;sQVa!}5WM`O?=Q-z2EYcpvdu--}03{Wk>o7`E za%=FFLb{S>DP(&vx)X?a2f)~ILAA;Cmpz3SgbYWcyVxln3kxX_$P@2Fto;4g?Z!)g zc)UO^k10(e56>j;2!yj8Y~uK}Mu#DDv-_;Mu;dHcv7wc#z4ajD?|L@l>9Y%b_`ww_ zP9fnj$SkcW<8v=vWFsxQiKbMD5D05&c(7a&T<)f%(wpwD?iiK>!A@dm<<1_oVe-%> z$8RXjqA%DlZMhP zd6sqt+uA)AdL@LQCNfrh%SI+>8TVKB4Qri<%oaLw6)C9JLXxykFNVbI6(`8D+?!;g!yS`NGSuks_EgCAOWEb8~ghG|If*?h+6Bl!H1RBR+EW1ZAhjwP>4k z*rn;$_~ONzoG5!VOJ!c)?lZ74A6}T}@*pG4a=KB1u)FWAF$Tvf>V68M#!jx83ncwG zCd>4l3oR+}m7o?Dnqw0wC1nj|FTj!zYmMUt)Eq^ob1;U*dW}}E%Vs|&HxePo^Fa`h zL@C>8f+rO#^?-`!a(k!Gt{$C0^a=;aElB8Lo8t$V}n*2AStPe)=?5Zmu&j z5IBM-PA~HErA>Utr51owpXbW@CTHjCbh};BH0I=qWo~VC7^V62x!SQ{w$hqLqsCyA z;R;PPP_zakVym!P6DXI}xiVKb+eF%Ox>@ITr-SR2I6YtC;#LR8z=zJS@ZF0yi+eYA zLlUxh&uZn6PA@_`mYVW#Lcy6@gICsW??L9qtCu^`>0_dG!W{fA9po_O`#v>Su-zMC z<&1345pGn%-rcQg`Kf>J{%Yn9)}OL>p-Arz7v5{&Kh%9<{PTVe{T!^3>`%hQIPpn^ z%X2rnJa?lDqaIdgP^zN50C2{IigwztAgl!`>EzHJum|FmLeSHS-f$+Q&aBoaE9S}Z zJ6h2h%``^X$ts=QqG#9V^eI>`L-7oD2g>M3&V z3PsgM{GAWIpXFwiKl{#`Jodx`tY5lH5H8THX!>o<#%Rd7W|jAc^Hd!{>NpI0F<*Xt zlZTrD+gZT+Xq&}qz{~4fl%)qM#YhP#T278@A|pW2X@Zfu-)dNTo>92*+{IT2t{Ie8(jk4e-JW6`@Ge5t+6$>vcMvK5yLI zV33ZTHB62xEc5jWJHsJ)ZcxIZSq+Jkm`6`8vexc%zPUiDCfVxl(C^12M&h{=4@rV% z(JRxp3H@P0;yKKloYTt-ynJOHw^XL=SvER-8Yqm(8KoIQx#ZGvq=a^Fh=U=| zcNf(HaAhIzj4YaQ5|JZy30D=(59SaBfc^2#9-wb~$NX|cSL0YYT6uSE@p(dhqv-+V=s!KhA{v6JOT%ew&?`&3)7g{_D7DVaLeLnC4Vsip>2m+NP8! z&^19JiK5xtRd#S(nnAVi^F-`)kysd(TXVcVuswA-$5=#6J#g=`b5{u#sy^*bA1xe= zbiimnaH7I6hE{H|CMQlcLV6&;7ZxF4D@svu%$)BbWx)1mNK0!>JS@7Cg+o~uT5Aph zD`ydC2S=)@B!e*q#})j?AO8TJ6`Uz&{JT%D^7ZQx!OBTSc}kiZtgC3phQU@uH#7KB zb1L+>-s!PesZ*<(C+tMcah20wT1Q9k>|YxFH#xz%E&UgBIcAT^X-&33C_)P*`efzjlG zq6>EvQ!16%8IBnC`<$4ofzG+H-6!;XZl_%yEU&VyQbxlRN4kZr*myxQ%q*8~w>UN5 zBKTY zfs8$x(!OK=2Xs5gd-EneY^?0pP`jVnuHApjJI>c0NX>~u3m5M9{jk>V-jhRQNcJ>5 z%#`+-edF|g67l`_LeFR_S|cV4#XH8#q4!;iJ@3HOL|)umGO}ByvDaC{%)9_ufU2BQty z2S;|fvP%8zjGsLwPAuUSi;^r$ztfAg0)9+gXTIkX;Q$ zDFh=UdGO>CYug=0nI%Ybd{wY4?M_5$HGv~Iu~5fkIlWOrY&E_SELE$Fbj-DO4{Zv& zDQolTn!{RXRzgN;Mv_E$jzc{t;f|A}%~8Vq&6})u6O;hgmu&3BH0nNO5_-ZXbQGf~ zq2z`L6C<%KF4SoaV>bFRN@pz9%RJ^eyxrd+3gF1H{5QuSZY@2 z_xniCCyH~DBm*nyMg)L>kLzG@7Egm6BwbS)|QzoudAJ zalXM?|Ms-DR!$m`#4delEEJHS!jqO9L1s+hxqBDoiTlZgW+jmVS5hr`Y<7ponokd7 zEf31iWUT%K4&BdzH|eOlyW>p$_l6)Iny4Hz={UIQQ3?FsGadR4$H`s|y`!ngJ@;n3x}N-7OdBxnan(Go$(wZcYEvZA_J?Ieb597J z+2gx=uVZ3A9du~Nn=n{BP=Z9~Xyp>*IZMqN*LJ#iQn1h{QNdDnCAazsk%fHFM++$V zf|_5aH5iZy%VH^Hq$9FSqqU*#DWE9s&!r(&g0iqUQW1Eif=aX+l_Zpc3a%7*QW2r) zj&fSvh+A2owpE;8EOP>vrLxQUa+Rz79nMrv5LO@*n(a6Tt8tWrwVDh=k`zq{Tf>xv zs?S{2#c4V8qlnZPR_B{!Lf|4vt(ofS0gO^jQ{WYR$?!D^{Qs^Dg8lf*crnMI9jk#hu|6ew$HRLZ0} zry7I=%4IYfvD58QFNd^s!p9$anD5=Z#wg8MYF4?m)5dju0@uNj4oMJ_TK%T~|e34_*_#(a~`U|1|5ut@0=#W{0x zb6nfl0b3x^6O?Q?9CD&w!3fFa?Jo67nNgZyl7z5aq1}(Cm2oGq#6gX=6&HV>QHAeXyX~({oW1(XE z-rqk92X>(zr*3CI^KjICRzhM;&fk9G0o-z#=iXdn$7Jm6v^hOjCzLM3Xnvfk-2 zv=So}p6_z1?31N2$N>*6mB{-edX8q*ZQuk&GCE2#vMfVuNb-zfmebV`x(=nFM9s5U zZRl8+o81xpI3>~GScxUYaSC*@mL~k4&%MFlxNw4#HN}7Rt=IYW4?oL4d*d>1-HLg1 zKBNhhmltV-CG=L8PQQn8J&Z|c^%EXDT}Na?T&c*cA&w#%flrd91g=MxCwuNsr#IrU zl{yH+t2foX1yozj+9*r~D^{Sml|q3c#obCNP+H`r6sKr$C&jJBixv->77A&x;2r`5 zDemqB2p%AXV1b+WobTNG-m}j6)_2$X|GVzDv)5kP&z?Px%{()E=9y2sSB34(UOxXR>EcB9;J8g4Ym(O%=FW)q(lh*OZ zUdfg80=EEDEA(;mfh;U!xKVe=t^8I*<-NC`9={^}B=B;tj^)6$z=E*FU7*1(0AD7b zVaENFmte(6q>?l#f2Bt_JkGv!#lA{TMNLYE@r|;h4sR9DSG)&*044)61;Mg;h_1mv z-Hm{gdwAU2m~CH2pw+vP9E6)$LRshvOsU z^yjcI`l9S{*)zqDydFZzVb~0k`cEt~Qc!%Q;X|srQW&dRX zneHf7^J?ESz|GO@?1??alhV06H?}+KC$<~) zB5ywNo*&n&W1hA;kd||>mF;DM6&veRfIT>Rw)SE~8dU34Pm*x*qo-1#%D>ou2Gat~Tv{>+IHYzZCS_7-4OMQ6VTV30&x#YG$)PheyD8yN~yB0 z(zU8g7FGkc;W868@~ zEVjPur{khPNg=nex8Mc zlUxHDy1by6`RqG!J|9eo9k#unUgb(VezPn{5dyBK9y~h5Uidaink0#NI7Nvme$mqYx3 z!%HoM@(%l%e0YS~k4bNtL&90KJ#)zH!zmF9 zqvH6Vj;?x!4~{Ou`sZNnvLmY=}vEw*{ zRB-UVwV50sG~{O61t{~#jlPf}vwDGz_U`x6x<^{SjTd$jqn%$u7)CXpSLNq}H0{N+ zG~V^T7b;2-dzmZ&I%WGZ19W~v`GOWn#!jVXivLCpw9+Uatw~XciMctDY4su3% zlfm*re%u`?wqaKEp5-SQceNBA{8A}%L=KAUb5^=;0SX4 zv)8dh-{vW>FTmKcZA!|ztons`?nq2lTy@SvA|j1vJA89WzdpzW{V01$^P<5yj)Gr+ zNo25E8FC{x>=Wq|f8&S|&(p@@wm>x#-E2QSo0e%h-YROJY714!p99;N*EIPp zjG>&&Dc}WAK;Fn-*U|7V`sA!4cJo6po3TR>lGDII zcjif__ikMS%rh`A9f}SP2n%}4aU=hoa?4Rb`S$r!yz0KHOccDSVQzb1G-x70eA=@v z1i93hDjUmsD$lw(G8xlT@?{F3Py3E;=`#1)GqJR9_JXava3J|Vtpt7?qQ{M#4E#$@If`XpsqP{Z?lqX%>VBVI8axnfe4f@LREq5O)wLCvD z0dLGh7*y@%B{gftBQ?XYrF||)jKyh_eT5fOGJKAC0CGN?@Z$PeTJW{MZ9=7gu5ul5 zER!%7WFRx>B{vcB2X$am7acJv0s`N+aQp$($^B`HkIvv1vC9nKu(*!1tgfVW=Nr(N<&gaL_{%%~>M8o~dyhl$ zdQ>?=$C4V8RZH4WnoZ7*QYV=5O!p7B7ZnNx9gO=I9fmmhq-rPLmyPE$(65cWN%eaN ztz{2um*65g>(*tu!VU(={krE~ZC12TWX+$eeS5XAp&20gc5p#lc<8TAIr?}zUHZ1{7a|mn!^La3fqufS#5n zEbw_&kp>CyV%DswTHr_M>{2OOvTiZvv$^lhCY#x9xm))mZ~5ho#W0bM-)0Lx$rc}R zK|O^JofOMECbhM0NXpwXW(Cd6}e*&M_(tLZD}7yoWkB^LT=Ry?A%&2bomASIIBJJvw`Q zF4xOfCN3DK-Inr4caGvApw(q;*YZR_tya+tPiOYW6WeF^yB8K2(F?scSvvBHPl=f1 zfN@3+H4de9jm`3_%jW&Qr=5(F2MS*&%S=9Mpqn1mN$0%L0omD-h0Dfsg&onu=4(Cc zf9UAdm}riDcqNnN{)m?W+|OT26#)=gT6rGKHxy$YW6k>6s>`H&+BOAg|nK$nA z+F2V+%EjOKZ^F zAUpjsUF1Ja*6em`(m+R#0{(>;RMpZn6sE*>!^DF|l?({vphf%RHj`*L&=E4DY^C1J zc4-?!1{HRBzw$vRgiVudSK-(6X^lZQE>be`sGp@3cCooCXjrR;&4HBOFk)c)qAIO% z@l}SRXZdpLJ-W-wV-{qv+=p!OD1GjDVsF0NwmJnX=bxs~2=7fdOIm$tjD8};;#BV( zM@c@qQ7NF_^my~|6(q`9fA!SW+J?1QgCz&!Jrgq#l`wxWq#5vDJbH2e=P5K|xHu;O z*(o4X=XXeCHz{9lalLSj04fH1Q9MQNri-3{5&q=4$W?dSpV6TfNP&vmuPA~gAjcIn zXtm+Y5)>G;-`s>bukrDTyI5#YD_k|gPsvS7w_Sq2*JrQoR;Xdy?RaSC%~y<`?r5WL zt!qsXPPoBb1Sv4l1h$HAhFs8vv=L7C1j?{hN_)$_d_A@x?0su~JkG;xCGe#U>7Y;n zlTkX8Fq37N#2;D7eQ7Ip`+BxC+R7|X_ezzH18d#4UL{M-5qsx;Z3|pyoS` zF@ayVyV$pBM~^0#2BMl6r35=4G(%fxbKDXPy+9rFQ`!Qf%cdRd^GqN;Xi{p`a0{5Itq{F9^>Rb?V&=Wy) zyI&GygcvXLcvrYA&D}h_I>UHe)dqB*njY2BC%2|(xjwgkf7?J(GEWgw64V zP7Yd43uM$Xdh3!G5EcC8cdR0_msZFf%^Aw1Whtj!?f#)dcZy$vf5gi;M=JpF>r~*) z<_%QmQt&5^yVFz(J8Ku=`leZLYeMm?d0U8kt5dZl`K}LpZ4~yw4=hu(3GnB` zo`B3@@qGN+b&PjE_jC$}{j>%$6!Y6nupJ(SUHVeI)*1LLQTmoFi(pJu{Y#n`UmWw? zCrjzim7G^m*&yBZJlhAy3;v0Hs=vVu*#*MmW5Qb$4l1|QA4~`whWa;`7j{-JXwer+ zC&1y)E%?iM98`pW34Z=w5jR(>^7>iCl67^$9)^PHw_@_!WZ>Hyk8ul1^wXbHt;QG5 zI#bQYIAl$W&$Lk?q#8Y9(hly8?-S2&6Q$g3*4)Q1>ze5UA9C_}HZ4A_<2N)j-l(3h zSD$04YT+c>5#Xp-<@WtZ7lWX+ral_B24 z;FA=56epP}eA#^F}W(euJDV;k@+T`SQ&LLCD1f zRqhBC!TrbVN)wg&9 z4JQr(AQa%MU$m@V{&d&r?9>Y!V*{L^n+++n%RWer$Gj{KP1FDNhJzhnAv-lSX=5H% z-|ln0E*Iiy72#o2wWPVld9u*pU?x=eSbYTH=C;6{a9hOS%>!HqhpxeVagN zawmqW2tkY-%CQxqzt81@Ymbd|R!yN1M*57V601&jTEe*xIF(*fg*$5&{Wd1r8(5ur7UMDu@iV*cx_npILWXcp-OiB13wC5d6J*U?4Hz zFSL)UDG^d5#h&9;$QJe?NV5fUQm^QhV`A%OrJW6(MzM33l8OGG+)m7`BgC8JgcZ#*@A)LA3-AgEZ)p;~3%Dweh_s7bFktxe^ z)}w5nNX%uV0bO1chbx60_816&4!go;ZP>we4mRCQV0W3qhKJdWu0?h8Smj9-Bin^mjFEwhlmx|C-G&_bXs z{n%%d_eM$tK@iJPn+DtgM}i>NR2u`v6L;;g+c2$XfUJf zXVgr8l?8PAds1iM^;hlG7xZ!tW>b7wK~U~8adLxpPBwtQSK59reca>d=k6me5~DqcfJae8NM+NVo$j!oU|+uGez!@FUxmsss?h4TU)!MckFuBi7c=j*XW zB@VE`v{tpC=Xr!hebY%_MZ7YuBE`izK1%(lXDDu&ug;xy1D~Hz&iQMWo+n3{=zT&t?Yh@J`(i5>zl51J>A?(sMx(fCyEWR^xldCb!QYbWz8AX#cLc*< zH4l20ba{%h6I;mSuH+O z+|o7~%2Z=@^3c_Z?^$1c(OV8ivDhIp3OM4u0d=4+kU;i+F z-<)rbWLna>#EpKB)qD)&i1gS?0^h{$!Tc6_c07V_DznIk6};FcWo|q`LguG)Gg!%H zw4Q;|zVj%2P0$)^Ex(x<5OlCN+9V3dQ`0|Z4Kiaj`;CWgtT`DXpszRCmR@V{DXy84 zn~F7o#)#v&*_CmhPRnA*+wTH{N?0khHWjB3in1XAbPNL!B|7?7a+9V0vrfiZ61VlO zO$;`3dVm)7$}MGdx|wZL0Vl?ZlCH>poz)+-1|}{+SOZzi>>kskl%wm?655ui!nVHg z<4=;OvY2*X#pXf9g{^sorqK&P2~%L8Ppps#Kh8O9*%6I_yEIv<7*As6Rfy;3pVUWD zyOO?6?mOxM%aXoU9;+)A=aBJ$KGxAmiyM3L6Ma`Fl#Hy9FZ#~Q=gP7boT*|ODmKr@ z?!D5b$UP}ZhQXSjoMS5hc<`B)#5_x z=u@W`gxlVyBxJW7;rc0({I$JoP_siTHXDNi9L$buROO6>Ukz@4i58}o%&(tY1HleS zeZbZoU%MQctypU2BbD@?;g{&VsCNIr=yCzi(H~pWT6OQPWEGc!F&?UMOZt|NB94b4 z)pIq@@q7nh{AFVjKg%bNNI6=5UUuGk(4E2rcb93O`)KR**?gg;e_L1E!?Ungif@Y` zA?5YE>zxZ1t+KK=RDT$&36Yq>d&4)ppGR}V-QnST#q`Hp8j~dZ}Y%r6-6!R?BtHVqId*4>EiRVYdJxjQF{x{?yzlVJRTYmlvh)gYgl%+Qm0KxHzXS{!OM)ef80ptsTO_`dWY=!r(7 zC>c*s*PDfhLJ2LNzSI^+se0<$d~uatu~g=mqkCZ=g@}Fxsyr}sPvHFA8{@ew;Y^c| z&&xpjc-~>C;a6{L4v#ZcE$LEcjw5G7+i2zCAW}=@MCj?8wVAPDk*pWjHZIReKl>V48wUcpCF#;GQ^e+(MK;{ z3tTvKE?ID3L4EPZ=c4&M`H%gVMP>0pD1;OU0D`#dA$P|dV4BwK+7p{_5vNhXKXpKff0s++yF5K!4@ z(<}Ai@YEf?lk;7-LqBD;#>|;=D33c6l6{YfAG%>v)k}|DDD{*gd0_ccaQpVe_&n+wlXF2(JUs-Q;-_j}Q z_Z9m->Wm7=b>tR?JH&`SwlN-yzLNvO1TO>~lzA~N%xe+zhoeswTU!qj(WWBZ7RvBf z^*x&w0TRe5#otY*5vpvyXVA~e)Pr!ga9J?yn-CcH!^O7)Pz*ci0%f&;vZXBj?Pd5F zx?OLk^KQ$R_IH}p+x)3U;&*z7sqGHSJDIdCI7%yD=)APp1(B2nZ8>3D_8n;D0!%3) z8=*Zo8&AS-dz6#K(UFsDz(U@-B(Dn0Hh9VyPkNrjzb9di9ph;b_hJL%7!?(L?xl^Zu z*1Gi729G`zcs8UO3wpC5O(YEpG+jI+n9c4ChtxFWCXz>Vu?ZrY%t(cHCr{X33{prEQQ6v#Ng zcEWZrJ#fF1ajN69tp@W)VqOK9?D~a8AM`WoLXGw(wrTl^}H zDdg;Ij`^JJ_4Ie15b2>|H-gZaACjU)V(ihDyYC`1$d%$y2Pu1F#os9WwmiRY)oD1- z79dn^qBL0d@XoMteJ@r=!imwOwfKPmL;?WIB3%sI%98QL`LhAkPG{%ODVh(rg;5ymfr8=f{G|vr z0sWa-pOY^b#Q9KuK-B0dE&$f)vb-#!1oVn*GTtZ8BcNnoDO$Wm0?;$f#}q%BN7;OJFx6dT z!NWUH|MKAjl%iDG+6ub+9M9=ho+Ex>YEP3!;kvq>fI zSCFQWI+eoU^Xrwj8H8c%+NE_uLBoTiz#jwlTx3%w?Aa+#8cQU#C|u$&c?*+i-@hb( z`KU@Yr3B%1c+u`Gdg57^OE>eQ{MZN~Z25BQj(;xwE=%^fi~R?OE@35l^!XIM`NjtX z&4G({qdYxz_bnf;Ja4@*4aU?$WW>qiy7A;%{Wh^(cQCK-nDb$jcE`D#1zl|18^tLoK;o#Zdie%m}ssfG-jaD}4W_4}O*d0a=R9!pcrvf)JvQx30WU(u)0NU3ez zF{Pgnu(VxuZ|(U*Xc^<<7LfckIG5<%qJJRj%f?cmB^(dMm!9o%uz*tj16AuNoLC!w z-0omIHJ6)K8--;>VJpEW_Jl-9=HHgp#N(w8$(0paPd=J49}n8)t@I)5 z&xYCFAx)6OB3f=jPj-pZ207o0<=qFfFS_FD?5*YNxhKJXPO$+6p|l;mD0cZdxe?mrb~iFe>UQD`w4547Ve8^aF_-c``kdp6QGFxO0PO>{?@iU8O# zyxHM@TQ>wxY=}((4C67}7pRnHM%=Eh-W_mbx|E{%8Ue59o;D|0s%YJNf25*UsFId= z2XfYIZhjUY6~TgrT`|pNl(g)Z9S5fMxZ9UR$%oisV7Sd)j%X44m2AuB+WvsEboHKD z^V5oSmJ`$rtYSUZ41j($ezm)TGMYK)R&0SRwIHxdOAczem(c0?g2(}k{yOWypad#e zL9uSJ__7@lnA2)|d20OlhmW^ZMHXM1+}lk5brfQYmh;33H!i~`(e{RNu8HyeH?xNo zy17-pd(P9u=JmBaEJk{(@1REp^1q22OKb;)u3Gy*i|AU>TmHkLk&gNf?|u`kRJ>hU z;dQ5ZTiDaQc(c!YIP{0iPFYXO;(3-=7O?hpr7W`Y*z5J@kpnZ1le@0U_YIvJE@|$b zw1VSDMo6t=ekeKc=52ZNTc#hgTBQ$yaJz%tIb{OGo+ zl7xbXohHf=+=;xTlqFo>m^#0wbpgNBX|}ibo>GzyVEv+zV zL#VhTC-qa3_>A^XwzP|I1B5eM-u5%m`Bn7U)wJzX?j0k9-?zif-fweiIs+>j<=ZXY zTRCgey$duSblx|V(dqDh&ra%lFhLNufPk{sq(A(z9MZ>YT~gB^huoedhl_Fe(2VEL z{gjv{vEl6=kFn+8s%hR&mC=dDcquA538WGKVsX|c(VrtugW${nv-W+p1%^aJC&Rch zA3WTKqTeF8OJ0?d{oqwQ5Sa3hqK6KCaAofG2TFb;cYC%8HCs+P?hGwgC z(15#^10;)j3bRY=vy(KcL-$j4#|G|qkvV6g!b_k%#t-mK@Njf zo6!I!mg@soRmk*8`)RZZMWmSW@N7I+VfAnBC*LaHzj&L*5ff&F|Gm|`(C0yUR@wbh zMf=WMFO;H>*lqS+b~O1LzonVvv^ITEDxMv8oI1Zv&!p9O@pXN+)=S~(C20?$=`9n1 zY)LovLpH2g`rEwI;XYXZtO3^bqnO?%GUTMg==w_WT0n)qf-xd4Hdzchh{`p6Y!~Ao z?!c9<*F4y}A

      j%dK^s?aFXjU%I{vwp-YM>8~u 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 D%6Hmf literal 8158 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 diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_examine_config.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_examine_config.png index 32f22cf217baabfdbc9ec20315285617469f1378..0563a50943d9555782d568633233c38d0ad7c4a2 100644 GIT binary patch literal 57336 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 literal 38218 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 K%aOhL@c#o$20Xz4 From 4f5d735f7f039f92c0c9cdd839c0d86417cf3955 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 26 Oct 2018 11:33:06 +0200 Subject: [PATCH 0288/1162] Doc: warn about not setting Comment#entry_time --- doc/09-object-types.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index 562e75a6d..d15ac710c 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -297,6 +297,7 @@ object Comment "localhost!my-comment" { host_name = "localhost" author = "icingaadmin" text = "This is a comment." + entry_time = 1234567890 } ``` @@ -308,7 +309,7 @@ Configuration Attributes: service\_name | Object name | **Optional.** The short name of the service this comment belongs to. If omitted, this comment object is treated as host comment. author | String | **Required.** The author's name. text | String | **Required.** The comment text. - entry\_time | Timestamp | **Optional.** The UNIX timestamp when this comment was added. + entry\_time | Timestamp | **Optional.** The UNIX timestamp when this comment was added. If omitted, the entry time is volatile! entry\_type | Number | **Optional.** The comment type (`User` = 1, `Downtime` = 2, `Flapping` = 3, `Acknowledgement` = 4). expire\_time | Timestamp | **Optional.** The comment's expire time as UNIX timestamp. persistent | Boolean | **Optional.** Only evaluated for `entry_type` Acknowledgement. `true` does not remove the comment when the acknowledgement is removed. From 6418af3f0162df0755bdd2e2792d5875ef74f14b Mon Sep 17 00:00:00 2001 From: Lee Clemens Date: Fri, 26 Oct 2018 18:32:21 -0400 Subject: [PATCH 0289/1162] dbido: remove redundant mysql indexes --- lib/db_ido_mysql/schema/mysql.sql | 32 ++--------------- lib/db_ido_mysql/schema/upgrade/2.11.0.sql | 40 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 lib/db_ido_mysql/schema/upgrade/2.11.0.sql diff --git a/lib/db_ido_mysql/schema/mysql.sql b/lib/db_ido_mysql/schema/mysql.sql index 6fec218c5..f63863839 100644 --- a/lib/db_ido_mysql/schema/mysql.sql +++ b/lib/db_ido_mysql/schema/mysql.sql @@ -692,8 +692,7 @@ CREATE TABLE IF NOT EXISTS icinga_hosts ( z_3d double default '0', config_hash varchar(64) DEFAULT NULL, PRIMARY KEY (host_id), - UNIQUE KEY instance_id (instance_id,config_type,host_object_id), - KEY host_object_id (host_object_id) + UNIQUE KEY instance_id (instance_id,config_type,host_object_id) ) ENGINE=InnoDB COMMENT='Host definitions'; -- -------------------------------------------------------- @@ -1181,8 +1180,7 @@ CREATE TABLE IF NOT EXISTS icinga_services ( icon_image_alt TEXT character set latin1, config_hash varchar(64) DEFAULT NULL, PRIMARY KEY (service_id), - UNIQUE KEY instance_id (instance_id,config_type,service_object_id), - KEY service_object_id (service_object_id) + UNIQUE KEY instance_id (instance_id,config_type,service_object_id) ) ENGINE=InnoDB COMMENT='Service definitions'; -- -------------------------------------------------------- @@ -1463,10 +1461,8 @@ ALTER TABLE icinga_systemcommands ADD COLUMN endpoint_object_id bigint default N -- EXTERNALCOMMANDS => entry_time -- instance_id -CREATE INDEX systemcommands_i_id_idx on icinga_systemcommands(instance_id); CREATE INDEX servicechecks_i_id_idx on icinga_servicechecks(instance_id); CREATE INDEX hostchecks_i_id_idx on icinga_hostchecks(instance_id); -CREATE INDEX eventhandlers_i_id_idx on icinga_eventhandlers(instance_id); CREATE INDEX externalcommands_i_id_idx on icinga_externalcommands(instance_id); -- time @@ -1481,40 +1477,22 @@ CREATE INDEX externalcommands_time_id_idx on icinga_externalcommands(entry_time) -- instance_id only -- realtime data -CREATE INDEX programstatus_i_id_idx on icinga_programstatus(instance_id); CREATE INDEX hoststatus_i_id_idx on icinga_hoststatus(instance_id); CREATE INDEX servicestatus_i_id_idx on icinga_servicestatus(instance_id); CREATE INDEX contactstatus_i_id_idx on icinga_contactstatus(instance_id); -CREATE INDEX comments_i_id_idx on icinga_comments(instance_id); -CREATE INDEX scheduleddowntime_i_id_idx on icinga_scheduleddowntime(instance_id); -CREATE INDEX runtimevariables_i_id_idx on icinga_runtimevariables(instance_id); CREATE INDEX customvariablestatus_i_id_idx on icinga_customvariablestatus(instance_id); -- config data -CREATE INDEX configfiles_i_id_idx on icinga_configfiles(instance_id); CREATE INDEX configfilevariables_i_id_idx on icinga_configfilevariables(instance_id); CREATE INDEX customvariables_i_id_idx on icinga_customvariables(instance_id); -CREATE INDEX commands_i_id_idx on icinga_commands(instance_id); -CREATE INDEX timeperiods_i_id_idx on icinga_timeperiods(instance_id); CREATE INDEX timeperiod_timeranges_i_id_idx on icinga_timeperiod_timeranges(instance_id); -CREATE INDEX contactgroups_i_id_idx on icinga_contactgroups(instance_id); CREATE INDEX contactgroup_members_i_id_idx on icinga_contactgroup_members(instance_id); -CREATE INDEX hostgroups_i_id_idx on icinga_hostgroups(instance_id); CREATE INDEX hostgroup_members_i_id_idx on icinga_hostgroup_members(instance_id); -CREATE INDEX servicegroups_i_id_idx on icinga_servicegroups(instance_id); CREATE INDEX servicegroup_members_i_id_idx on icinga_servicegroup_members(instance_id); -CREATE INDEX hostesc_i_id_idx on icinga_hostescalations(instance_id); -CREATE INDEX hostesc_contacts_i_id_idx on icinga_hostescalation_contacts(instance_id); -CREATE INDEX serviceesc_i_id_idx on icinga_serviceescalations(instance_id); -CREATE INDEX serviceesc_contacts_i_id_idx on icinga_serviceescalation_contacts(instance_id); -CREATE INDEX hostdependencies_i_id_idx on icinga_hostdependencies(instance_id); -CREATE INDEX contacts_i_id_idx on icinga_contacts(instance_id); CREATE INDEX contact_addresses_i_id_idx on icinga_contact_addresses(instance_id); CREATE INDEX contact_notifcommands_i_id_idx on icinga_contact_notificationcommands(instance_id); -CREATE INDEX hosts_i_id_idx on icinga_hosts(instance_id); CREATE INDEX host_parenthosts_i_id_idx on icinga_host_parenthosts(instance_id); CREATE INDEX host_contacts_i_id_idx on icinga_host_contacts(instance_id); -CREATE INDEX services_i_id_idx on icinga_services(instance_id); CREATE INDEX service_contacts_i_id_idx on icinga_service_contacts(instance_id); CREATE INDEX service_contactgroups_i_id_idx on icinga_service_contactgroups(instance_id); CREATE INDEX host_contactgroups_i_id_idx on icinga_host_contactgroups(instance_id); @@ -1574,7 +1552,6 @@ CREATE INDEX hostchks_h_obj_id_idx on icinga_hostchecks(host_object_id); CREATE INDEX servicechks_s_obj_id_idx on icinga_servicechecks(service_object_id); -- objects -CREATE INDEX objects_objtype_id_idx ON icinga_objects(objecttype_id); CREATE INDEX objects_name1_idx ON icinga_objects(name1); CREATE INDEX objects_name2_idx ON icinga_objects(name2); CREATE INDEX objects_inst_id_idx ON icinga_objects(instance_id); @@ -1643,10 +1620,6 @@ CREATE INDEX sla_idx_obj ON icinga_objects (objecttype_id, is_active, name1); -- #4985 CREATE INDEX commenthistory_delete_idx ON icinga_commenthistory (instance_id, comment_time, internal_comment_id); --- #10070 -CREATE INDEX idx_comments_object_id on icinga_comments(object_id); -CREATE INDEX idx_scheduleddowntime_object_id on icinga_scheduleddowntime(object_id); - -- #10066 CREATE INDEX idx_endpoints_object_id on icinga_endpoints(endpoint_object_id); CREATE INDEX idx_endpointstatus_object_id on icinga_endpointstatus(endpoint_object_id); @@ -1668,7 +1641,6 @@ CREATE INDEX idx_downtimes_session_del ON icinga_scheduleddowntime (instance_id, CREATE INDEX idx_statehistory_cleanup on icinga_statehistory(instance_id, state_time); -- #12435 -CREATE INDEX idx_customvariables_object_id on icinga_customvariables(object_id); CREATE INDEX idx_contactgroup_members_object_id on icinga_contactgroup_members(contact_object_id); CREATE INDEX idx_hostgroup_members_object_id on icinga_hostgroup_members(host_object_id); CREATE INDEX idx_servicegroup_members_object_id on icinga_servicegroup_members(service_object_id); diff --git a/lib/db_ido_mysql/schema/upgrade/2.11.0.sql b/lib/db_ido_mysql/schema/upgrade/2.11.0.sql new file mode 100644 index 000000000..b461a66d7 --- /dev/null +++ b/lib/db_ido_mysql/schema/upgrade/2.11.0.sql @@ -0,0 +1,40 @@ +-- ----------------------------------------- +-- upgrade path for Icinga 2.11.0 +-- +-- ----------------------------------------- +-- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) +-- +-- Please check https://docs.icinga.com for upgrading information! +-- ----------------------------------------- + +ALTER TABLE `icinga_commands` DROP INDEX `commands_i_id_idx`; +ALTER TABLE `icinga_comments` DROP INDEX `idx_comments_object_id`; +ALTER TABLE `icinga_comments` DROP INDEX `comments_i_id_idx`; +ALTER TABLE `icinga_configfiles` DROP INDEX `configfiles_i_id_idx`; +ALTER TABLE `icinga_contactgroups` DROP INDEX `contactgroups_i_id_idx`; +ALTER TABLE `icinga_contacts` DROP INDEX `contacts_i_id_idx`; +ALTER TABLE `icinga_customvariables` DROP INDEX `idx_customvariables_object_id`; +ALTER TABLE `icinga_eventhandlers` DROP INDEX `eventhandlers_i_id_idx`; +ALTER TABLE `icinga_hostdependencies` DROP INDEX `hostdependencies_i_id_idx`; +ALTER TABLE `icinga_hostescalations` DROP INDEX `hostesc_i_id_idx`; +ALTER TABLE `icinga_hostescalation_contacts` DROP INDEX `hostesc_contacts_i_id_idx`; +ALTER TABLE `icinga_hostgroups` DROP INDEX `hostgroups_i_id_idx`; +ALTER TABLE `icinga_hosts` DROP INDEX `host_object_id`; +ALTER TABLE `icinga_hosts` DROP INDEX `hosts_i_id_idx`; +ALTER TABLE `icinga_objects` DROP INDEX `objects_objtype_id_idx`; +ALTER TABLE `icinga_programstatus` DROP INDEX `programstatus_i_id_idx`; +ALTER TABLE `icinga_runtimevariables` DROP INDEX `runtimevariables_i_id_idx`; +ALTER TABLE `icinga_scheduleddowntime` DROP INDEX `scheduleddowntime_i_id_idx`; +ALTER TABLE `icinga_scheduleddowntime` DROP INDEX `idx_scheduleddowntime_object_id`; +ALTER TABLE `icinga_serviceescalations` DROP INDEX `serviceesc_i_id_idx`; +ALTER TABLE `icinga_serviceescalation_contacts` DROP INDEX `serviceesc_contacts_i_id_idx`; +ALTER TABLE `icinga_servicegroups` DROP INDEX `servicegroups_i_id_idx`; +ALTER TABLE `icinga_services` DROP INDEX `services_i_id_idx`; +ALTER TABLE `icinga_services` DROP INDEX `service_object_id`; +ALTER TABLE `icinga_systemcommands` DROP INDEX `systemcommands_i_id_idx`; +ALTER TABLE `icinga_timeperiods` DROP INDEX `timeperiods_i_id_idx`; + +-- ----------------------------------------- +-- set dbversion (same as 2.11.0) +-- ----------------------------------------- +INSERT INTO icinga_dbversion (name, version, create_time, modify_time) VALUES ('idoutils', '1.15.0', NOW(), NOW()) ON DUPLICATE KEY UPDATE version='1.15.0', modify_time=NOW(); From 5406ce65400c07e6fd37cecc42209411acc350be Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 29 Oct 2018 12:57:24 +0100 Subject: [PATCH 0290/1162] Ensure that API/JSON-RPC messages in the same session are processed and not stalled This basically drops the "corked" implementation which just stalled the TLS IO polling after some requests. If you need sort of rate limiting for these events, use an external TLS proxy which terminates that in front of Icinga. fixes #6635 --- lib/base/stream.cpp | 10 ---------- lib/base/stream.hpp | 5 ----- lib/base/tlsstream.cpp | 22 +++------------------- lib/base/tlsstream.hpp | 2 -- lib/remote/httpserverconnection.cpp | 5 ----- lib/remote/jsonrpcconnection.cpp | 4 ---- 6 files changed, 3 insertions(+), 45 deletions(-) diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index 8e1258d75..f41bc52a2 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -91,16 +91,6 @@ bool Stream::WaitForData(int timeout) return IsDataAvailable() || IsEof(); } -void Stream::SetCorked(bool corked) -{ - m_Corked = corked; -} - -bool Stream::IsCorked() const -{ - return m_Corked; -} - static void StreamDummyCallback() { } diff --git a/lib/base/stream.hpp b/lib/base/stream.hpp index 0a7bf5fd0..72da2ba9a 100644 --- a/lib/base/stream.hpp +++ b/lib/base/stream.hpp @@ -127,9 +127,6 @@ public: bool WaitForData(); bool WaitForData(int timeout); - virtual void SetCorked(bool corked); - bool IsCorked() const; - virtual bool SupportsWaiting() const; virtual bool IsDataAvailable() const; @@ -146,8 +143,6 @@ private: boost::mutex m_Mutex; boost::condition_variable m_CV; - - bool m_Corked{false}; }; } diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index b771b3622..f57af8d5e 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -153,16 +153,12 @@ void TlsStream::OnEvent(int revents) char buffer[64 * 1024]; if (m_CurrentAction == TlsActionNone) { - bool corked = IsCorked(); - if (!corked && (revents & (POLLIN | POLLERR | POLLHUP))) + if (revents & (POLLIN | POLLERR | POLLHUP)) m_CurrentAction = TlsActionRead; else if (m_SendQ->GetAvailableBytes() > 0 && (revents & POLLOUT)) m_CurrentAction = TlsActionWrite; else { - if (corked) - ChangeEvents(0); - else - ChangeEvents(POLLIN); + ChangeEvents(POLLIN); return; } @@ -289,7 +285,7 @@ void TlsStream::OnEvent(int revents) lock.unlock(); - while (!IsCorked() && m_RecvQ->IsDataAvailable() && IsHandlingEvents()) + while (m_RecvQ->IsDataAvailable() && IsHandlingEvents()) SignalDataAvailable(); } @@ -441,18 +437,6 @@ bool TlsStream::IsDataAvailable() const return m_RecvQ->GetAvailableBytes() > 0; } -void TlsStream::SetCorked(bool corked) -{ - Stream::SetCorked(corked); - - boost::mutex::scoped_lock lock(m_Mutex); - - if (corked) - m_CurrentAction = TlsActionNone; - else - ChangeEvents(POLLIN | POLLOUT); -} - Socket::Ptr TlsStream::GetSocket() const { return m_Socket; diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index e58d5995d..8e4ceb08e 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -70,8 +70,6 @@ public: bool SupportsWaiting() const override; bool IsDataAvailable() const override; - void SetCorked(bool corked) override; - bool IsVerifyOK() const; String GetVerifyError() const; diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 301d5ba5f..356a0ffba 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -344,7 +344,6 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpRespons response.Finish(); m_PendingRequests--; - m_Stream->SetCorked(false); } void HttpServerConnection::DataAvailableHandler() @@ -354,8 +353,6 @@ void HttpServerConnection::DataAvailableHandler() if (!m_Stream->IsEof()) { boost::recursive_mutex::scoped_lock lock(m_DataHandlerMutex); - m_Stream->SetCorked(true); - try { while (ProcessMessage()) ; /* empty loop body */ @@ -366,8 +363,6 @@ void HttpServerConnection::DataAvailableHandler() close = true; } - m_RequestQueue.Enqueue(std::bind(&Stream::SetCorked, m_Stream, false)); - /* Request finished, decide whether to explicitly close the connection. */ if (m_CurrentRequest.ProtocolVersion == HttpVersion10 || m_CurrentRequest.Headers->Get("connection") == "close") { diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 099d28723..b9a9ceee2 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -276,8 +276,6 @@ void JsonRpcConnection::DataAvailableHandler() if (!m_Stream->IsEof()) { boost::mutex::scoped_lock lock(m_DataHandlerMutex); - m_Stream->SetCorked(true); - try { while (ProcessMessage()) ; /* empty loop body */ @@ -290,8 +288,6 @@ void JsonRpcConnection::DataAvailableHandler() return; } - - l_JsonRpcConnectionWorkQueues[m_ID % l_JsonRpcConnectionWorkQueueCount].Enqueue(std::bind(&Stream::SetCorked, m_Stream, false)); } else close = true; From 3d45d0bcf6d5f993cdde270a1be6f82e53280395 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 29 Oct 2018 13:45:18 +0100 Subject: [PATCH 0291/1162] Minor styleguide --- lib/methods/icingachecktask.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 75f301f5f..c5832aebe 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -175,9 +175,10 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes } /* Extract the version number of the running Icinga2 instance. - * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. */ + * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. + */ int endOfVersionNumber = appVersion.FindFirstOf("-") - 1; - String parsedAppVersion = appVersion.SubStr(1,endOfVersionNumber); + String parsedAppVersion = appVersion.SubStr(1, endOfVersionNumber); /* Return an error if the version is less than specified (optional). */ if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) { From d8462cf6cd1760b3cf30825d5aec7687559b2bc8 Mon Sep 17 00:00:00 2001 From: Max Rosin Date: Fri, 19 Oct 2018 15:37:32 +0200 Subject: [PATCH 0292/1162] Fix the Icinga2 version check for versions with more than 5 characters The previous implementation assumed that every version number will have 5 characters. With the release of 2.10.0 this does not work anymore. The new implementation extracts everything from the second character to the first dash. This should work as long as the version string is in a format like 'v2.10.1-8-gaebe6da'. fixes Icinga#6703 --- lib/methods/icingachecktask.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 0c85de6d4..75f301f5f 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -174,9 +174,12 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes cr->SetState(ServiceWarning); } - /* Return an error if the version is less than specified (optional). */ - String parsedAppVersion = appVersion.SubStr(1,5); + /* Extract the version number of the running Icinga2 instance. + * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. */ + int endOfVersionNumber = appVersion.FindFirstOf("-") - 1; + String parsedAppVersion = appVersion.SubStr(1,endOfVersionNumber); + /* Return an error if the version is less than specified (optional). */ if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) { output += "; Minimum version " + icingaMinVersion + " is not installed."; cr->SetState(ServiceCritical); From 4424b203c2df39791c1a0c1702c83d6254c574b3 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 29 Oct 2018 13:45:18 +0100 Subject: [PATCH 0293/1162] Minor styleguide --- lib/methods/icingachecktask.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 75f301f5f..c5832aebe 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -175,9 +175,10 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes } /* Extract the version number of the running Icinga2 instance. - * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. */ + * We assume that appVersion will allways be something like 'v2.10.1-8-gaebe6da' and we want to extract '2.10.1'. + */ int endOfVersionNumber = appVersion.FindFirstOf("-") - 1; - String parsedAppVersion = appVersion.SubStr(1,endOfVersionNumber); + String parsedAppVersion = appVersion.SubStr(1, endOfVersionNumber); /* Return an error if the version is less than specified (optional). */ if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) { From ec939373d078a5583138c4cc8515436b08475419 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 24 Oct 2018 11:00:24 +0200 Subject: [PATCH 0294/1162] Improve error handling for invalid child_options for API downtime actions fixes #6712 --- lib/icinga/apiactions.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 22684c9a2..127f28aa4 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -355,6 +355,15 @@ Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, double startTime = HttpUtility::GetLastParameter(params, "start_time"); double endTime = HttpUtility::GetLastParameter(params, "end_time"); + DowntimeChildOptions childOptions = DowntimeNoChildren; + if (params->Contains("child_options")) { + try { + childOptions = Downtime::ChildOptionsFromValue(HttpUtility::GetLastParameter(params, "child_options")); + } catch (const std::exception&) { + return ApiActions::CreateResult(400, "Option 'child_options' provided an invalid value."); + } + } + String downtimeName = Downtime::AddDowntime(checkable, author, comment, startTime, endTime, fixed, triggerName, duration); @@ -366,10 +375,6 @@ Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, }); /* Schedule downtime for all child objects. */ - DowntimeChildOptions childOptions = DowntimeNoChildren; - if (params->Contains("child_options")) - childOptions = Downtime::ChildOptionsFromValue(HttpUtility::GetLastParameter(params, "child_options")); - if (childOptions != DowntimeNoChildren) { /* 'DowntimeTriggeredChildren' schedules child downtimes triggered by the parent downtime. * 'DowntimeNonTriggeredChildren' schedules non-triggered downtimes for all children. From c0c6ea545b91086ed1628cc349dadad2581f5828 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 30 Oct 2018 13:17:28 +0100 Subject: [PATCH 0295/1162] DB IDO: Don't enqueue queries when the feature is paused (HA) fixes #5876 refs #6739 --- lib/db_ido_mysql/idomysqlconnection.cpp | 33 +++++++++++++++++++++++++ lib/db_ido_pgsql/idopgsqlconnection.cpp | 24 ++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 1a13b89cc..9bbbeb0df 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -162,6 +162,9 @@ void IdoMysqlConnection::TxTimerHandler() void IdoMysqlConnection::NewTransaction() { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling new transaction and finishing async queries."; @@ -715,6 +718,9 @@ void IdoMysqlConnection::DiscardRows(const IdoMysqlResult& result) void IdoMysqlConnection::ActivateObject(const DbObject::Ptr& dbobj) { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling object activation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; @@ -727,6 +733,9 @@ void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); + if (IsPaused()) + return; + if (!GetConnected()) return; @@ -754,6 +763,9 @@ void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) void IdoMysqlConnection::DeactivateObject(const DbObject::Ptr& dbobj) { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling object deactivation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; @@ -766,6 +778,9 @@ void IdoMysqlConnection::InternalDeactivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); + if (IsPaused()) + return; + if (!GetConnected()) return; @@ -855,6 +870,9 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va void IdoMysqlConnection::ExecuteQuery(const DbQuery& query) { + if (IsPaused()) + return; + ASSERT(query.Category != DbCatInvalid); #ifdef I2_DEBUG /* I2_DEBUG */ @@ -867,6 +885,9 @@ void IdoMysqlConnection::ExecuteQuery(const DbQuery& query) void IdoMysqlConnection::ExecuteMultipleQueries(const std::vector& queries) { + if (IsPaused()) + return; + if (queries.empty()) return; @@ -914,6 +935,9 @@ void IdoMysqlConnection::InternalExecuteMultipleQueries(const std::vector& queries) { + if (IsPaused()) + return; + if (queries.empty()) return; @@ -748,6 +763,9 @@ void IdoPgsqlConnection::InternalExecuteMultipleQueries(const std::vector Date: Tue, 24 Jul 2018 14:24:56 +0200 Subject: [PATCH 0296/1162] SocketEvents: inherit from Stream refs #6477 --- lib/base/socketevents.hpp | 5 ++++- lib/base/tlsstream.hpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 486ec4df1..26dc77019 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -22,6 +22,7 @@ #include "base/i2-base.hpp" #include "base/socket.hpp" +#include "base/stream.hpp" #include #include @@ -37,9 +38,11 @@ namespace icinga * * @ingroup base */ -class SocketEvents +class SocketEvents : public Stream { public: + DECLARE_PTR_TYPEDEFS(SocketEvents); + ~SocketEvents(); virtual void OnEvent(int revents); diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index 8e4ceb08e..45519b5b1 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -43,7 +43,7 @@ enum TlsAction * * @ingroup base */ -class TlsStream final : public Stream, private SocketEvents +class TlsStream final : public SocketEvents { public: DECLARE_PTR_TYPEDEFS(TlsStream); From 5134ccaf56e65488fa094df9625154ad207dbf98 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 24 Jul 2018 14:40:35 +0200 Subject: [PATCH 0297/1162] Make SocketEventDescriptor#EventInterface a SocketEvents::Ptr refs #6477 --- lib/base/socketevents.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 26dc77019..45fad4617 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -82,7 +82,7 @@ private: struct SocketEventDescriptor { int Events{POLLIN}; - SocketEvents *EventInterface{nullptr}; + SocketEvents::Ptr EventInterface; Object *LifesupportObject{nullptr}; }; From a2ae01e64b4fa00aeb3c652ac9a633bf458ca5ed Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 24 Jul 2018 15:06:55 +0200 Subject: [PATCH 0298/1162] Socket engine: drop life support objects refs #6477 --- lib/base/socketevents-epoll.cpp | 5 +---- lib/base/socketevents-poll.cpp | 5 +---- lib/base/socketevents.cpp | 8 ++++---- lib/base/socketevents.hpp | 12 +++++------- lib/base/tlsstream.cpp | 2 +- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/base/socketevents-epoll.cpp b/lib/base/socketevents-epoll.cpp index ba2e7e25b..932323c6e 100644 --- a/lib/base/socketevents-epoll.cpp +++ b/lib/base/socketevents-epoll.cpp @@ -113,8 +113,6 @@ void SocketEventEngineEpoll::ThreadProc(int tid) EventDescription event; event.REvents = SocketEventEngineEpoll::EpollToPoll(pevents[i].events); event.Descriptor = m_Sockets[tid][pevents[i].data.fd]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); events.emplace_back(std::move(event)); } @@ -134,7 +132,7 @@ void SocketEventEngineEpoll::ThreadProc(int tid) } } -void SocketEventEngineEpoll::Register(SocketEvents *se, Object *lifesupportObject) +void SocketEventEngineEpoll::Register(SocketEvents *se) { int tid = se->m_ID % SOCKET_IOTHREADS; @@ -145,7 +143,6 @@ void SocketEventEngineEpoll::Register(SocketEvents *se, Object *lifesupportObjec SocketEventDescriptor desc; desc.EventInterface = se; - desc.LifesupportObject = lifesupportObject; VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); diff --git a/lib/base/socketevents-poll.cpp b/lib/base/socketevents-poll.cpp index e46dd2c45..afb43177e 100644 --- a/lib/base/socketevents-poll.cpp +++ b/lib/base/socketevents-poll.cpp @@ -111,8 +111,6 @@ void SocketEventEnginePoll::ThreadProc(int tid) EventDescription event; event.REvents = pfds[i].revents; event.Descriptor = descriptors[i]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); events.emplace_back(std::move(event)); } @@ -132,7 +130,7 @@ void SocketEventEnginePoll::ThreadProc(int tid) } } -void SocketEventEnginePoll::Register(SocketEvents *se, Object *lifesupportObject) +void SocketEventEnginePoll::Register(SocketEvents *se) { int tid = se->m_ID % SOCKET_IOTHREADS; @@ -144,7 +142,6 @@ void SocketEventEnginePoll::Register(SocketEvents *se, Object *lifesupportObject SocketEventDescriptor desc; desc.Events = 0; desc.EventInterface = se; - desc.LifesupportObject = lifesupportObject; VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 1400396a4..286460eab 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -111,12 +111,12 @@ void SocketEvents::InitializeEngine() /** * Constructor for the SocketEvents class. */ -SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject) +SocketEvents::SocketEvents(const Socket::Ptr& socket) : m_ID(m_NextID++), m_FD(socket->GetFD()), m_EnginePrivate(nullptr) { boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeEngine); - Register(lifesupportObject); + Register(); } SocketEvents::~SocketEvents() @@ -124,9 +124,9 @@ SocketEvents::~SocketEvents() VERIFY(m_FD == INVALID_SOCKET); } -void SocketEvents::Register(Object *lifesupportObject) +void SocketEvents::Register() { - l_SocketIOEngine->Register(this, lifesupportObject); + l_SocketIOEngine->Register(this); } void SocketEvents::Unregister() diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 45fad4617..44bca3071 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -57,7 +57,7 @@ public: void SetEnginePrivate(void *priv); protected: - SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject); + SocketEvents(const Socket::Ptr& socket); private: int m_ID; @@ -71,7 +71,7 @@ private: void WakeUpThread(bool wait = false); - void Register(Object *lifesupportObject); + void Register(); friend class SocketEventEnginePoll; friend class SocketEventEngineEpoll; @@ -83,14 +83,12 @@ struct SocketEventDescriptor { int Events{POLLIN}; SocketEvents::Ptr EventInterface; - Object *LifesupportObject{nullptr}; }; struct EventDescription { int REvents; SocketEventDescriptor Descriptor; - Object::Ptr LifesupportReference; }; class SocketEventEngine @@ -105,7 +103,7 @@ public: protected: virtual void InitializeThread(int tid) = 0; virtual void ThreadProc(int tid) = 0; - virtual void Register(SocketEvents *se, Object *lifesupportObject) = 0; + virtual void Register(SocketEvents *se) = 0; virtual void Unregister(SocketEvents *se) = 0; virtual void ChangeEvents(SocketEvents *se, int events) = 0; @@ -122,7 +120,7 @@ protected: class SocketEventEnginePoll final : public SocketEventEngine { public: - void Register(SocketEvents *se, Object *lifesupportObject) override; + void Register(SocketEvents *se) override; void Unregister(SocketEvents *se) override; void ChangeEvents(SocketEvents *se, int events) override; @@ -135,7 +133,7 @@ protected: class SocketEventEngineEpoll : public SocketEventEngine { public: - virtual void Register(SocketEvents *se, Object *lifesupportObject); + virtual void Register(SocketEvents *se); virtual void Unregister(SocketEvents *se); virtual void ChangeEvents(SocketEvents *se, int events); diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index f57af8d5e..a694f86bf 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -43,7 +43,7 @@ bool TlsStream::m_SSLIndexInitialized = false; * @param sslContext The SSL context for the client. */ TlsStream::TlsStream(const Socket::Ptr& socket, const String& hostname, ConnectionRole role, const std::shared_ptr& sslContext) - : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0), + : SocketEvents(socket), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0), m_ErrorOccurred(false), m_Socket(socket), m_Role(role), m_SendQ(new FIFO()), m_RecvQ(new FIFO()), m_CurrentAction(TlsActionNone), m_Retry(false), m_Shutdown(false) { From 39260eb50cec0a545368639da206745a630a392c Mon Sep 17 00:00:00 2001 From: Leon Stringer Date: Wed, 31 Oct 2018 11:46:12 +0000 Subject: [PATCH 0299/1162] Doc fix: error in example path. --- doc/05-service-monitoring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index cdaa8ed1a..eda3089ae 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -16,7 +16,7 @@ and create a new global constant, e.g. `CustomPluginDir` in your [constants.conf configuration file: # cp check_snmp_int.pl /opt/monitoring/plugins - # chmod +x /opt/plugins/check_snmp_int.pl + # chmod +x /opt/monitoring/plugins/check_snmp_int.pl # cat /etc/icinga2/constants.conf /** From 62e9c0baddb0ec70ebf8c69064daa188d740001a Mon Sep 17 00:00:00 2001 From: Mark Leary Date: Wed, 31 Oct 2018 13:28:27 -0400 Subject: [PATCH 0300/1162] Add support for -q argument to check_snmp_storage.pl. --- itl/command-plugins-manubulon.conf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index ce9cfa1a4..013d97d5f 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -215,6 +215,10 @@ object CheckCommand "snmp-storage" { value = "$snmp_storage_olength$" description = "Max-size of the SNMP message, usefull in case of Too Long responses." } + "-q" = { + value = "$storage_type$" + description = "Storage type: Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk" + } } vars.snmp_storage_name = "^/$$" @@ -396,6 +400,6 @@ object CheckCommand "snmp-service" { description = "Do not use regexp to match NAME in service description." } } - + vars.snmp_service_name = ".*" } From b785674ab261833128a83c8101aee3d177e73ebc Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 1 Nov 2018 19:16:26 +0100 Subject: [PATCH 0301/1162] Fix api setup to automatically create the conf.d directory This patch creates the conf.d directory automatically when it is not present during api setup. --- lib/cli/apisetuputility.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index f8b12bacb..a78409212 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -152,6 +152,15 @@ bool ApiSetupUtility::SetupMasterCertificates(const String& cn) bool ApiSetupUtility::SetupMasterApiUser() { + if (!Utility::PathExists(GetConfdPath())) { + Log(LogWarning, "cli") + << "Path '" << GetConfdPath() << "' do not exist."; + Log(LogInformation, "cli") + << "Creating path '" << GetConfdPath() << "'."; + + Utility::MkDirP(GetConfdPath(), 0755); + } + String api_username = "root"; // TODO make this available as cli parameter? String api_password = RandomString(8); String apiUsersPath = GetConfdPath() + "/api-users.conf"; From a02b7ac15507a4e659bd41d855a2fed1081c203c Mon Sep 17 00:00:00 2001 From: David Lublink Date: Thu, 1 Nov 2018 18:51:42 -0400 Subject: [PATCH 0302/1162] * BugFix : Wrong operator on stride variable causing incorrect behaviour ( #6749 ) --- lib/icinga/legacytimeperiod.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index eea88e2ca..6433d0d6c 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -42,7 +42,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; From d340f6b5193a5a7735a44c5db5076ba750913e24 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 2 Nov 2018 07:45:48 +0100 Subject: [PATCH 0303/1162] Doc fix: documentation link for apt Fixes `check_apt` documentation link to point to the right man page. --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a9a861651..382e9b52d 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -182,7 +182,7 @@ which contains the path of the plugins from the Monitoring Plugins project. ### apt -The plugin [apt](https://www.monitoring-plugins.org/doc/index.html) checks for software updates on systems that use +The plugin [apt](https://www.monitoring-plugins.org/doc/man/check_apt.html) checks for software updates on systems that use package management systems based on the apt-get(8) command found in Debian based systems. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): From 1b062e0a5bc12d7564333a5deb224808e195365d Mon Sep 17 00:00:00 2001 From: Mark Leary Date: Fri, 2 Nov 2018 09:52:37 -0400 Subject: [PATCH 0304/1162] Change indents to tab. --- itl/command-plugins-manubulon.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index 013d97d5f..d11c52b64 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -215,10 +215,10 @@ object CheckCommand "snmp-storage" { value = "$snmp_storage_olength$" description = "Max-size of the SNMP message, usefull in case of Too Long responses." } - "-q" = { - value = "$storage_type$" - description = "Storage type: Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk" - } + "-q" = { + value = "$storage_type$" + description = "Storage type: Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk" + } } vars.snmp_storage_name = "^/$$" From 1b10e81511cbe05d224140c44a24271a8f14be00 Mon Sep 17 00:00:00 2001 From: Mark Leary Date: Fri, 2 Nov 2018 09:58:44 -0400 Subject: [PATCH 0305/1162] Follow naming convention for snmp plugin attributes. --- itl/command-plugins-manubulon.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index d11c52b64..39e9cf153 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -216,7 +216,7 @@ object CheckCommand "snmp-storage" { description = "Max-size of the SNMP message, usefull in case of Too Long responses." } "-q" = { - value = "$storage_type$" + value = "$snmp_storage_type$" description = "Storage type: Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk" } } From aa93caae62947023907d2c637a7d66aadec68738 Mon Sep 17 00:00:00 2001 From: Mark Leary Date: Fri, 2 Nov 2018 10:03:19 -0400 Subject: [PATCH 0306/1162] Document snmp_storage_type attribute. --- doc/10-icinga-template-library.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a9a861651..195a52ec8 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2067,6 +2067,7 @@ snmp_privpass | **Required.** SNMP version 3 priv password. No value d snmp_warn | **Optional.** The warning threshold. snmp_crit | **Optional.** The critical threshold. snmp_storage_name | **Optional.** Storage name. Default to regex "^/$$". More options available in the [snmp storage](http://nagios.manubulon.com/snmp_storage.html) documentation. +snmp_storage_type | **Optional.** Filter by storage type. Valid options are Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk. No value defined as default. snmp_perf | **Optional.** Enable perfdata values. Defaults to true. snmp_timeout | **Optional.** The command timeout in seconds. Defaults to 5 seconds. snmp_storage_olength | **Optional.** Max-size of the SNMP message, usefull in case of Too Long responses. From 8d715aab3532fb4bbe48637bf9c6f597292b811c Mon Sep 17 00:00:00 2001 From: "Bauerheim, Marcus" Date: Wed, 7 Nov 2018 14:26:02 +0100 Subject: [PATCH 0307/1162] Update itl/plugins-contrib.d/network-components.conf Add repeat_key = true for nwc_health --- itl/plugins-contrib.d/network-components.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/itl/plugins-contrib.d/network-components.conf b/itl/plugins-contrib.d/network-components.conf index 53cadba29..3abd8853d 100644 --- a/itl/plugins-contrib.d/network-components.conf +++ b/itl/plugins-contrib.d/network-components.conf @@ -625,10 +625,12 @@ object CheckCommand "nwc_health" { } "--warningx" = { value = "$nwc_health_warningx$" + repeat_key = true description = "The extended warning thresholds" } "--criticalx" = { value = "$nwc_health_criticalx$" + repeat_key = true description = "The extended critical thresholds" } "--mitigation" = { From d082e8c1b19c88a68e0381db7f5806f31fe8523d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Nov 2018 12:13:32 +0100 Subject: [PATCH 0308/1162] Fix that no_more_notifications gets reset when Recovery notifications are filtered away Hello from the OSMC hackathon :) --- lib/icinga/notification.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 19dc8268d..ba6ca49b4 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -317,6 +317,16 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() << "': type '" << NotificationTypeToStringInternal(type) << "' does not match type filter: " << NotificationFilterToString(GetTypeFilter(), GetTypeFilterMap()) << "."; + + /* Ensure to reset no_more_notifications on Recovery notifications, + * even if the admin did not configure them in the filter. + */ + { + ObjectLock olock(this); + if (type == NotificationRecovery && GetInterval() <= 0) + SetNoMoreNotifications(false); + } + return; } From 2991993f6b7399c88ccb048333d79ab30851f910 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Nov 2018 15:03:41 +0100 Subject: [PATCH 0309/1162] Apply workaround for timer tests with std::bind callbacks --- test/base-timer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/base-timer.cpp b/test/base-timer.cpp index 48d20e381..a9500a203 100644 --- a/test/base-timer.cpp +++ b/test/base-timer.cpp @@ -39,16 +39,17 @@ BOOST_AUTO_TEST_CASE(interval) BOOST_CHECK(timer->GetInterval() == 1.5); } -static void Callback(int *counter) +int counter = 0; + +static void Callback(const Timer::Ptr&) { - (*counter)++; + counter++; } BOOST_AUTO_TEST_CASE(invoke) { - int counter; Timer::Ptr timer = new Timer(); - timer->OnTimerExpired.connect(std::bind(&Callback, &counter)); + timer->OnTimerExpired.connect(&Callback); timer->SetInterval(1); counter = 0; @@ -61,9 +62,8 @@ BOOST_AUTO_TEST_CASE(invoke) BOOST_AUTO_TEST_CASE(scope) { - int counter; Timer::Ptr timer = new Timer(); - timer->OnTimerExpired.connect(std::bind(&Callback, &counter)); + timer->OnTimerExpired.connect(&Callback); timer->SetInterval(1); counter = 0; From 1f5555e1d647dd5e89a42efb13f94604378bd6aa Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Nov 2018 15:51:58 +0100 Subject: [PATCH 0310/1162] Fix possible double free in StreamLogger::BindStream() refs #6737 --- lib/base/streamlogger.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base/streamlogger.cpp b/lib/base/streamlogger.cpp index 314b54409..aa1d62cd3 100644 --- a/lib/base/streamlogger.cpp +++ b/lib/base/streamlogger.cpp @@ -47,7 +47,7 @@ StreamLogger::~StreamLogger() if (m_FlushLogTimer) m_FlushLogTimer->Stop(); - if (m_OwnsStream) + if (m_Stream && m_OwnsStream) delete m_Stream; } @@ -66,7 +66,7 @@ void StreamLogger::BindStream(std::ostream *stream, bool ownsStream) { ObjectLock olock(this); - if (m_OwnsStream) + if (m_Stream && m_OwnsStream) delete m_Stream; m_Stream = stream; From 2754175c6ed56ef446b314ad6324a951678df6a0 Mon Sep 17 00:00:00 2001 From: "Schanz, Jens" Date: Fri, 9 Nov 2018 13:17:08 +0100 Subject: [PATCH 0311/1162] fixes #6758 Add target network-online.target as requirement. Service Icinga2 won't start before target is finally reached. This prevents Icinga2 from failing if no entry for hostname.domain is set in /etc/hosts --- etc/initsystem/icinga2.service.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 9c7d81748..834a1fc18 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -1,5 +1,6 @@ [Unit] Description=Icinga host/service/network monitoring system +Requires=network-online.target After=syslog.target network-online.target postgresql.service mariadb.service carbon-cache.service carbon-relay.service [Service] From 9d73f0cf30d2e24ecb69f6bf61ad0d7c48230cfb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 9 Nov 2018 14:56:36 +0100 Subject: [PATCH 0312/1162] Implement unit tests for Dictionary initializers --- test/CMakeLists.txt | 2 ++ test/base-dictionary.cpp | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 766d15a2e..c78f2732d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -73,6 +73,8 @@ add_boost_test(base base_convert/tostring base_convert/tobool base_dictionary/construct + base_dictionary/initializer1 + base_dictionary/initializer2 base_dictionary/get1 base_dictionary/get2 base_dictionary/foreach diff --git a/test/base-dictionary.cpp b/test/base-dictionary.cpp index 1eb5a1b7e..79d736f0a 100644 --- a/test/base-dictionary.cpp +++ b/test/base-dictionary.cpp @@ -32,6 +32,28 @@ BOOST_AUTO_TEST_CASE(construct) BOOST_CHECK(dictionary); } +BOOST_AUTO_TEST_CASE(initializer1) +{ + DictionaryData dict; + + dict.emplace_back("test1", "Gin-o-clock"); + + Dictionary::Ptr dictionary = new Dictionary(std::move(dict)); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-o-clock"); +} + +BOOST_AUTO_TEST_CASE(initializer2) +{ + Dictionary::Ptr dictionary = new Dictionary({ {"test1", "Gin-for-the-win"} }); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-for-the-win"); +} + BOOST_AUTO_TEST_CASE(get1) { Dictionary::Ptr dictionary = new Dictionary(); From 798ef557d37627d505584487709805b1c4bcfcfe Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 12 Nov 2018 13:26:30 +0100 Subject: [PATCH 0313/1162] Update the GH issue template a bit --- .github/ISSUE_TEMPLATE.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 488df7a8c..3938244c6 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,18 +1,6 @@ - - - + ## Expected Behavior From 46ed01348c576e8c63c27ff8f0c88795f0d57b3f Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 29 Oct 2018 12:57:24 +0100 Subject: [PATCH 0314/1162] Ensure that API/JSON-RPC messages in the same session are processed and not stalled This basically drops the "corked" implementation which just stalled the TLS IO polling after some requests. If you need sort of rate limiting for these events, use an external TLS proxy which terminates that in front of Icinga. fixes #6635 --- lib/base/stream.cpp | 10 ---------- lib/base/stream.hpp | 5 ----- lib/base/tlsstream.cpp | 22 +++------------------- lib/base/tlsstream.hpp | 2 -- lib/remote/httpserverconnection.cpp | 5 ----- lib/remote/jsonrpcconnection.cpp | 4 ---- 6 files changed, 3 insertions(+), 45 deletions(-) diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index 8e1258d75..f41bc52a2 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -91,16 +91,6 @@ bool Stream::WaitForData(int timeout) return IsDataAvailable() || IsEof(); } -void Stream::SetCorked(bool corked) -{ - m_Corked = corked; -} - -bool Stream::IsCorked() const -{ - return m_Corked; -} - static void StreamDummyCallback() { } diff --git a/lib/base/stream.hpp b/lib/base/stream.hpp index 0a7bf5fd0..72da2ba9a 100644 --- a/lib/base/stream.hpp +++ b/lib/base/stream.hpp @@ -127,9 +127,6 @@ public: bool WaitForData(); bool WaitForData(int timeout); - virtual void SetCorked(bool corked); - bool IsCorked() const; - virtual bool SupportsWaiting() const; virtual bool IsDataAvailable() const; @@ -146,8 +143,6 @@ private: boost::mutex m_Mutex; boost::condition_variable m_CV; - - bool m_Corked{false}; }; } diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index c68c72977..c51530395 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -153,16 +153,12 @@ void TlsStream::OnEvent(int revents) char buffer[64 * 1024]; if (m_CurrentAction == TlsActionNone) { - bool corked = IsCorked(); - if (!corked && (revents & (POLLIN | POLLERR | POLLHUP))) + if (revents & (POLLIN | POLLERR | POLLHUP)) m_CurrentAction = TlsActionRead; else if (m_SendQ->GetAvailableBytes() > 0 && (revents & POLLOUT)) m_CurrentAction = TlsActionWrite; else { - if (corked) - ChangeEvents(0); - else - ChangeEvents(POLLIN); + ChangeEvents(POLLIN); return; } @@ -289,7 +285,7 @@ void TlsStream::OnEvent(int revents) lock.unlock(); - while (!IsCorked() && m_RecvQ->IsDataAvailable() && IsHandlingEvents()) + while (m_RecvQ->IsDataAvailable() && IsHandlingEvents()) SignalDataAvailable(); } @@ -428,18 +424,6 @@ bool TlsStream::IsDataAvailable() const return m_RecvQ->GetAvailableBytes() > 0; } -void TlsStream::SetCorked(bool corked) -{ - Stream::SetCorked(corked); - - boost::mutex::scoped_lock lock(m_Mutex); - - if (corked) - m_CurrentAction = TlsActionNone; - else - ChangeEvents(POLLIN | POLLOUT); -} - Socket::Ptr TlsStream::GetSocket() const { return m_Socket; diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index e58d5995d..8e4ceb08e 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -70,8 +70,6 @@ public: bool SupportsWaiting() const override; bool IsDataAvailable() const override; - void SetCorked(bool corked) override; - bool IsVerifyOK() const; String GetVerifyError() const; diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 81ea16b95..4f619d2f1 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -344,7 +344,6 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request, HttpRespons response.Finish(); m_PendingRequests--; - m_Stream->SetCorked(false); } void HttpServerConnection::DataAvailableHandler() @@ -354,8 +353,6 @@ void HttpServerConnection::DataAvailableHandler() if (!m_Stream->IsEof()) { boost::recursive_mutex::scoped_lock lock(m_DataHandlerMutex); - m_Stream->SetCorked(true); - try { while (ProcessMessage()) ; /* empty loop body */ @@ -366,8 +363,6 @@ void HttpServerConnection::DataAvailableHandler() close = true; } - m_RequestQueue.Enqueue(std::bind(&Stream::SetCorked, m_Stream, false)); - /* Request finished, decide whether to explicitly close the connection. */ if (m_CurrentRequest.ProtocolVersion == HttpVersion10 || m_CurrentRequest.Headers->Get("connection") == "close") { diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 099d28723..b9a9ceee2 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -276,8 +276,6 @@ void JsonRpcConnection::DataAvailableHandler() if (!m_Stream->IsEof()) { boost::mutex::scoped_lock lock(m_DataHandlerMutex); - m_Stream->SetCorked(true); - try { while (ProcessMessage()) ; /* empty loop body */ @@ -290,8 +288,6 @@ void JsonRpcConnection::DataAvailableHandler() return; } - - l_JsonRpcConnectionWorkQueues[m_ID % l_JsonRpcConnectionWorkQueueCount].Enqueue(std::bind(&Stream::SetCorked, m_Stream, false)); } else close = true; From b3e98a842f6083ee3dbf6fa2bd545c0f59af3c77 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Nov 2018 15:51:58 +0100 Subject: [PATCH 0315/1162] Fix possible double free in StreamLogger::BindStream() refs #6737 --- lib/base/streamlogger.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base/streamlogger.cpp b/lib/base/streamlogger.cpp index 314b54409..aa1d62cd3 100644 --- a/lib/base/streamlogger.cpp +++ b/lib/base/streamlogger.cpp @@ -47,7 +47,7 @@ StreamLogger::~StreamLogger() if (m_FlushLogTimer) m_FlushLogTimer->Stop(); - if (m_OwnsStream) + if (m_Stream && m_OwnsStream) delete m_Stream; } @@ -66,7 +66,7 @@ void StreamLogger::BindStream(std::ostream *stream, bool ownsStream) { ObjectLock olock(this); - if (m_OwnsStream) + if (m_Stream && m_OwnsStream) delete m_Stream; m_Stream = stream; From a1e30f6ef5f175f8ed8e6a4ba12abd7d674c7529 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 8 Nov 2018 15:03:41 +0100 Subject: [PATCH 0316/1162] Apply workaround for timer tests with std::bind callbacks --- test/base-timer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/base-timer.cpp b/test/base-timer.cpp index 48d20e381..a9500a203 100644 --- a/test/base-timer.cpp +++ b/test/base-timer.cpp @@ -39,16 +39,17 @@ BOOST_AUTO_TEST_CASE(interval) BOOST_CHECK(timer->GetInterval() == 1.5); } -static void Callback(int *counter) +int counter = 0; + +static void Callback(const Timer::Ptr&) { - (*counter)++; + counter++; } BOOST_AUTO_TEST_CASE(invoke) { - int counter; Timer::Ptr timer = new Timer(); - timer->OnTimerExpired.connect(std::bind(&Callback, &counter)); + timer->OnTimerExpired.connect(&Callback); timer->SetInterval(1); counter = 0; @@ -61,9 +62,8 @@ BOOST_AUTO_TEST_CASE(invoke) BOOST_AUTO_TEST_CASE(scope) { - int counter; Timer::Ptr timer = new Timer(); - timer->OnTimerExpired.connect(std::bind(&Callback, &counter)); + timer->OnTimerExpired.connect(&Callback); timer->SetInterval(1); counter = 0; From b0cf92fd173d5fe96095f9ebb1feaf13d7526cfd Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Mon, 12 Nov 2018 19:09:44 +0000 Subject: [PATCH 0317/1162] Fix deadlock in GraphiteWriter This fixes a deadlock in the GraphiteWriter feature, which is visible during the reload process. The reload thread waits for the GraphiteWriter to finish, but the GraphiteWriter can't finish because it's stuck in `SendMetric()` waiting for a lock which is hold by the reload thread. --- lib/perfdata/graphitewriter.cpp | 2 +- lib/perfdata/graphitewriter.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index a01f6c48b..1b6461d51 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -299,7 +299,7 @@ void GraphiteWriter::SendMetric(const String& prefix, const String& name, double msgbuf << "\n"; String metric = msgbuf.str(); - ObjectLock olock(this); + boost::mutex::scoped_lock lock(m_StreamMutex); if (!GetConnected()) return; diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index 6934d13b3..ec4c5bbfe 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -27,6 +27,7 @@ #include "base/timer.hpp" #include "base/workqueue.hpp" #include +#include namespace icinga { @@ -54,6 +55,7 @@ protected: private: Stream::Ptr m_Stream; + boost::mutex m_StreamMutex; WorkQueue m_WorkQueue{10000000, 1}; Timer::Ptr m_ReconnectTimer; From f4f2d862e6d51c4fa4b2527960d4563dde91796c Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Mon, 12 Nov 2018 19:09:44 +0000 Subject: [PATCH 0318/1162] Fix deadlock in GraphiteWriter This fixes a deadlock in the GraphiteWriter feature, which is visible during the reload process. The reload thread waits for the GraphiteWriter to finish, but the GraphiteWriter can't finish because it's stuck in `SendMetric()` waiting for a lock which is hold by the reload thread. --- lib/perfdata/graphitewriter.cpp | 2 +- lib/perfdata/graphitewriter.hpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index d58e2c53b..13be931d7 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -282,7 +282,7 @@ void GraphiteWriter::SendMetric(const String& prefix, const String& name, double msgbuf << "\n"; String metric = msgbuf.str(); - ObjectLock olock(this); + boost::mutex::scoped_lock lock(m_StreamMutex); if (!GetConnected()) return; diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index 48a2f4203..1949c72a6 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -27,6 +27,7 @@ #include "base/timer.hpp" #include "base/workqueue.hpp" #include +#include namespace icinga { @@ -54,6 +55,7 @@ protected: private: Stream::Ptr m_Stream; + boost::mutex m_StreamMutex; WorkQueue m_WorkQueue{10000000, 1}; Timer::Ptr m_ReconnectTimer; From 1a77d996eea36d5f0a019ae6f1226a300ad8db37 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 9 Nov 2018 14:56:36 +0100 Subject: [PATCH 0319/1162] Implement unit tests for Dictionary initializers --- test/CMakeLists.txt | 2 ++ test/base-dictionary.cpp | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 766d15a2e..c78f2732d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -73,6 +73,8 @@ add_boost_test(base base_convert/tostring base_convert/tobool base_dictionary/construct + base_dictionary/initializer1 + base_dictionary/initializer2 base_dictionary/get1 base_dictionary/get2 base_dictionary/foreach diff --git a/test/base-dictionary.cpp b/test/base-dictionary.cpp index 1eb5a1b7e..79d736f0a 100644 --- a/test/base-dictionary.cpp +++ b/test/base-dictionary.cpp @@ -32,6 +32,28 @@ BOOST_AUTO_TEST_CASE(construct) BOOST_CHECK(dictionary); } +BOOST_AUTO_TEST_CASE(initializer1) +{ + DictionaryData dict; + + dict.emplace_back("test1", "Gin-o-clock"); + + Dictionary::Ptr dictionary = new Dictionary(std::move(dict)); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-o-clock"); +} + +BOOST_AUTO_TEST_CASE(initializer2) +{ + Dictionary::Ptr dictionary = new Dictionary({ {"test1", "Gin-for-the-win"} }); + + Value test1; + test1 = dictionary->Get("test1"); + BOOST_CHECK(test1 == "Gin-for-the-win"); +} + BOOST_AUTO_TEST_CASE(get1) { Dictionary::Ptr dictionary = new Dictionary(); From 0046dcad7b349b13757c48a32027e8a352ee3413 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 30 Oct 2018 13:17:28 +0100 Subject: [PATCH 0320/1162] DB IDO: Don't enqueue queries when the feature is paused (HA) fixes #5876 refs #6739 --- lib/db_ido_mysql/idomysqlconnection.cpp | 33 +++++++++++++++++++++++++ lib/db_ido_pgsql/idopgsqlconnection.cpp | 24 ++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 1a13b89cc..9bbbeb0df 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -162,6 +162,9 @@ void IdoMysqlConnection::TxTimerHandler() void IdoMysqlConnection::NewTransaction() { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling new transaction and finishing async queries."; @@ -715,6 +718,9 @@ void IdoMysqlConnection::DiscardRows(const IdoMysqlResult& result) void IdoMysqlConnection::ActivateObject(const DbObject::Ptr& dbobj) { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling object activation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; @@ -727,6 +733,9 @@ void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); + if (IsPaused()) + return; + if (!GetConnected()) return; @@ -754,6 +763,9 @@ void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) void IdoMysqlConnection::DeactivateObject(const DbObject::Ptr& dbobj) { + if (IsPaused()) + return; + #ifdef I2_DEBUG /* I2_DEBUG */ Log(LogDebug, "IdoMysqlConnection") << "Scheduling object deactivation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; @@ -766,6 +778,9 @@ void IdoMysqlConnection::InternalDeactivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); + if (IsPaused()) + return; + if (!GetConnected()) return; @@ -855,6 +870,9 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va void IdoMysqlConnection::ExecuteQuery(const DbQuery& query) { + if (IsPaused()) + return; + ASSERT(query.Category != DbCatInvalid); #ifdef I2_DEBUG /* I2_DEBUG */ @@ -867,6 +885,9 @@ void IdoMysqlConnection::ExecuteQuery(const DbQuery& query) void IdoMysqlConnection::ExecuteMultipleQueries(const std::vector& queries) { + if (IsPaused()) + return; + if (queries.empty()) return; @@ -914,6 +935,9 @@ void IdoMysqlConnection::InternalExecuteMultipleQueries(const std::vector& queries) { + if (IsPaused()) + return; + if (queries.empty()) return; @@ -748,6 +763,9 @@ void IdoPgsqlConnection::InternalExecuteMultipleQueries(const std::vector Date: Tue, 13 Nov 2018 14:02:03 +0100 Subject: [PATCH 0321/1162] Imitialize ICINGA2_ERROR_LOG inside the Systemd environment The initscript uses a local default, which is not here for Systemd. --- etc/initsystem/icinga2.service.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 834a1fc18..ba305408c 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -5,6 +5,7 @@ After=syslog.target network-online.target postgresql.service mariadb.service car [Service] Type=notify +Environment="ICINGA2_ERROR_LOG=@ICINGA2_LOGDIR@/error.log" EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon --close-stdio -e ${ICINGA2_ERROR_LOG} From 09e70217fd3c1e750c837cef148c4ccffcbe503f Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 13 Nov 2018 14:02:03 +0100 Subject: [PATCH 0322/1162] Imitialize ICINGA2_ERROR_LOG inside the Systemd environment The initscript uses a local default, which is not here for Systemd. --- etc/initsystem/icinga2.service.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake index 9c7d81748..d30ff750a 100644 --- a/etc/initsystem/icinga2.service.cmake +++ b/etc/initsystem/icinga2.service.cmake @@ -4,6 +4,7 @@ After=syslog.target network-online.target postgresql.service mariadb.service car [Service] Type=notify +Environment="ICINGA2_ERROR_LOG=@ICINGA2_LOGDIR@/error.log" EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon --close-stdio -e ${ICINGA2_ERROR_LOG} From e2169f17f2a1e5fb5a192ea6474fa9cd47451e46 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 13 Nov 2018 17:13:54 +0100 Subject: [PATCH 0323/1162] Release version 2.10.2 --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ RELEASE.md | 2 +- VERSION | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1506c2360..3ca748fde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Icinga 2.x CHANGELOG +## 2.10.2 (2018-11-14) + +### Bug + +* [#6770](https://github.com/icinga/icinga2/issues/6770) (PR): Fix deadlock in GraphiteWriter +* [#6769](https://github.com/icinga/icinga2/issues/6769) (Cluster): Hanging TLS connections +* [#6759](https://github.com/icinga/icinga2/issues/6759) (Log, PR): Fix possible double free in StreamLogger::BindStream\(\) +* [#6753](https://github.com/icinga/icinga2/issues/6753): Icinga2.service state is reloading in systemd after safe-reload until systemd time-out +* [#6740](https://github.com/icinga/icinga2/issues/6740) (DB IDO, PR): DB IDO: Don't enqueue queries when the feature is paused \(HA\) +* [#6738](https://github.com/icinga/icinga2/issues/6738) (API, Cluster, PR): Ensure that API/JSON-RPC messages in the same session are processed and not stalled +* [#6736](https://github.com/icinga/icinga2/issues/6736) (Crash): Stability issues with Icinga 2.10.x +* [#6717](https://github.com/icinga/icinga2/issues/6717) (API, PR): Improve error handling for invalid child\_options for API downtime actions +* [#6712](https://github.com/icinga/icinga2/issues/6712) (API): Downtime name not returned when error occurs +* [#6711](https://github.com/icinga/icinga2/issues/6711) (API, Cluster): Slow API \(TLS-Handshake\) +* [#6709](https://github.com/icinga/icinga2/issues/6709) (PR): Fix the Icinga2 version check for versions with more than 5 characters +* [#6707](https://github.com/icinga/icinga2/issues/6707) (Compat, PR): Fix regression for wrong objects.cache path overwriting icinga2.debug file +* [#6705](https://github.com/icinga/icinga2/issues/6705) (CLI, Compat, Configuration): Crash "icinga2 object list" command with 2.10.1-1 on CentOS 7 +* [#6703](https://github.com/icinga/icinga2/issues/6703): Check command 'icinga' breaks when vars.icinga\_min\_version is defined \(2.10.x\) +* [#6635](https://github.com/icinga/icinga2/issues/6635) (API): API TLS session connection closed after 2 requests +* [#5876](https://github.com/icinga/icinga2/issues/5876) (DB IDO): IDO Work queue on the inactive node growing when switching connection between redundant master servers + +### Documentation + +* [#6714](https://github.com/icinga/icinga2/issues/6714) (Documentation, PR): Docs: Add package related changes to the upgrading docs + +### Support + +* [#6773](https://github.com/icinga/icinga2/issues/6773) (Installation, Packages, PR): Initialize ICINGA2\_ERROR\_LOG inside the systemd environment +* [#6771](https://github.com/icinga/icinga2/issues/6771) (Tests, PR): Implement unit tests for Dictionary initializers +* [#6760](https://github.com/icinga/icinga2/issues/6760) (Packages, Tests, PR): armhf: Apply workaround for timer tests with std::bind callbacks +* [#6710](https://github.com/icinga/icinga2/issues/6710) (Packages): Crash when upgrading from 2.10.0 to 2.10.1 \(SELinux related\) + ## 2.10.1 (2018-10-18) ### Bug diff --git a/RELEASE.md b/RELEASE.md index e4da2827e..89c7c9df9 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.10.1 +VERSION=2.10.2 ``` Add your signing key to your Git configuration file, if not already there. diff --git a/VERSION b/VERSION index ee770cbff..4320bb9a9 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.10.1 +Version: 2.10.2 Revision: 1 From 00694cb67512db008485a1454d55d9c79f29d922 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 13 Nov 2018 17:13:54 +0100 Subject: [PATCH 0324/1162] Release version 2.10.2 --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ RELEASE.md | 2 +- VERSION | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1506c2360..3ca748fde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Icinga 2.x CHANGELOG +## 2.10.2 (2018-11-14) + +### Bug + +* [#6770](https://github.com/icinga/icinga2/issues/6770) (PR): Fix deadlock in GraphiteWriter +* [#6769](https://github.com/icinga/icinga2/issues/6769) (Cluster): Hanging TLS connections +* [#6759](https://github.com/icinga/icinga2/issues/6759) (Log, PR): Fix possible double free in StreamLogger::BindStream\(\) +* [#6753](https://github.com/icinga/icinga2/issues/6753): Icinga2.service state is reloading in systemd after safe-reload until systemd time-out +* [#6740](https://github.com/icinga/icinga2/issues/6740) (DB IDO, PR): DB IDO: Don't enqueue queries when the feature is paused \(HA\) +* [#6738](https://github.com/icinga/icinga2/issues/6738) (API, Cluster, PR): Ensure that API/JSON-RPC messages in the same session are processed and not stalled +* [#6736](https://github.com/icinga/icinga2/issues/6736) (Crash): Stability issues with Icinga 2.10.x +* [#6717](https://github.com/icinga/icinga2/issues/6717) (API, PR): Improve error handling for invalid child\_options for API downtime actions +* [#6712](https://github.com/icinga/icinga2/issues/6712) (API): Downtime name not returned when error occurs +* [#6711](https://github.com/icinga/icinga2/issues/6711) (API, Cluster): Slow API \(TLS-Handshake\) +* [#6709](https://github.com/icinga/icinga2/issues/6709) (PR): Fix the Icinga2 version check for versions with more than 5 characters +* [#6707](https://github.com/icinga/icinga2/issues/6707) (Compat, PR): Fix regression for wrong objects.cache path overwriting icinga2.debug file +* [#6705](https://github.com/icinga/icinga2/issues/6705) (CLI, Compat, Configuration): Crash "icinga2 object list" command with 2.10.1-1 on CentOS 7 +* [#6703](https://github.com/icinga/icinga2/issues/6703): Check command 'icinga' breaks when vars.icinga\_min\_version is defined \(2.10.x\) +* [#6635](https://github.com/icinga/icinga2/issues/6635) (API): API TLS session connection closed after 2 requests +* [#5876](https://github.com/icinga/icinga2/issues/5876) (DB IDO): IDO Work queue on the inactive node growing when switching connection between redundant master servers + +### Documentation + +* [#6714](https://github.com/icinga/icinga2/issues/6714) (Documentation, PR): Docs: Add package related changes to the upgrading docs + +### Support + +* [#6773](https://github.com/icinga/icinga2/issues/6773) (Installation, Packages, PR): Initialize ICINGA2\_ERROR\_LOG inside the systemd environment +* [#6771](https://github.com/icinga/icinga2/issues/6771) (Tests, PR): Implement unit tests for Dictionary initializers +* [#6760](https://github.com/icinga/icinga2/issues/6760) (Packages, Tests, PR): armhf: Apply workaround for timer tests with std::bind callbacks +* [#6710](https://github.com/icinga/icinga2/issues/6710) (Packages): Crash when upgrading from 2.10.0 to 2.10.1 \(SELinux related\) + ## 2.10.1 (2018-10-18) ### Bug diff --git a/RELEASE.md b/RELEASE.md index e4da2827e..89c7c9df9 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -26,7 +26,7 @@ Specify the release version. ``` -VERSION=2.10.1 +VERSION=2.10.2 ``` Add your signing key to your Git configuration file, if not already there. diff --git a/VERSION b/VERSION index ee770cbff..4320bb9a9 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.10.1 +Version: 2.10.2 Revision: 1 From 9409e93bc798ffbe497c97cd110b492d533ce9dc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 14 Nov 2018 14:25:37 +0100 Subject: [PATCH 0325/1162] Add technical docs for the check scheduler (general, initial check, offsets) David asked me about initial check offsets, so I wrote something :) --- doc/19-technical-concepts.md | 190 +++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/doc/19-technical-concepts.md b/doc/19-technical-concepts.md index f9820c316..7cc30dbdb 100644 --- a/doc/19-technical-concepts.md +++ b/doc/19-technical-concepts.md @@ -6,6 +6,7 @@ into specific Icinga 2 components such as: * [Application](19-technical-concepts.md#technical-concepts-application) * [Configuration](19-technical-concepts.md#technical-concepts-configuration) * [Features](19-technical-concepts.md#technical-concepts-features) +* [Check Scheduler](19-technical-concepts.md#technical-concepts-check-scheduler) * [Cluster](19-technical-concepts.md#technical-concepts-cluster) * [TLS Network IO](19-technical-concepts.md#technical-concepts-tls-network-io) @@ -198,6 +199,195 @@ daemon of Graphite. The InfluxDBWriter is instead writing bulk metric messages to InfluxDB's HTTP API, similar to Elasticsearch. +## Check Scheduler + +The check scheduler starts a thread which loops forever. It waits for +check events being inserted into `m_IdleCheckables`. + +If the current pending check event number is larger than the configured +max concurrent checks, the thread waits up until it there's slots again. + +In addition, further checks on enabled checks, check periods, etc. are +performed. Once all conditions have passed, the next check timestamp is +calculated and updated. This also is the timestamp where Icinga expects +a new check result ("freshness check"). + +The object is removed from idle checkables, and inserted into the +pending checkables list. This can be seen via REST API metrics for the +checker component feature as well. + +The actual check execution happens asynchronously using the application's +thread pool. + +Once the check returns, it is removed from pending checkables and again +inserted into idle checkables. This ensures that the scheduler takes this +checkable event into account in the next iteration. + +### Start + +When checkable objects get activated during the startup phase, +the checker feature registers a handler for this event. This is due +to the fact that the `checker` feature is fully optional, and e.g. not +used on command endpoint clients. + +Whenever such an object activation signal is triggered, Icinga 2 checks +whether it is [authoritative for this object](19-technical-concepts.md#technical-concepts-cluster-ha-object-authority). +This means that inside an HA enabled zone with two endpoints, only non-paused checkable objects are +actively inserted into the idle checkable list for the check scheduler. + +### Initial Check + +When a new checkable object (host or service) is initially added to the +configuration, Icinga 2 performs the following during startup: + +* `Checkable::Start()` is called and calculates the first check time +* With a spread delta, the next check time is actually set. + +If the next check should happen within a time frame of 60 seconds, +Icinga 2 calculates a delta from a random value. The minimum of `check_interval` +and 60 seconds is used as basis, multiplied with a random value between 0 and 1. + +In the best case, this check gets immediately executed after application start. +The worst case scenario is that the check is scheduled 60 seconds after start +the latest. + +The reasons for delaying and spreading checks during startup is that +the application typically needs more resources at this time (cluster connections, +feature warmup, initial syncs, etc.). Immediate check execution with +thousands of checks could lead into performance problems, and additional +events for each received check results. + +Therefore the initial check window is 60 seconds on application startup, +random seed for all checkables. This is not predictable over multiple restarts +for specific checkable objects, the delta changes every time. + +### Scheduling Offset + +There's a high chance that many checkable objects get executed at the same time +and interval after startup. The initial scheduling spreads that a little, but +Icinga 2 also attempts to ensure to keep fixed intervals, even with high check latency. + +During startup, Icinga 2 calculates the scheduling offset from a random number: + +* `Checkable::Checkable()` calls `SetSchedulingOffset()` with `Utility::Random()` +* The offset is a pseudo-random integral value between `0` and `RAND_MAX`. + +Whenever the next check time is updated with `Checkable::UpdateNextCheck()`, +the scheduling offset is taken into account. + +Depending on the state type (SOFT or HARD), either the `retry_interval` or `check_interval` +is used. If the interval is greater than 1 second, the time adjustment is calculated in the +following way: + +`now * 100 + offset` divided by `interval * 100`, using the remainder (that's what `fmod()` is for) +and dividing this again onto base 100. + +Example: offset is 6500, interval 300, now is 1542190472. + +``` +1542190472 * 100 + 6500 = 154219053714 +300 * 100 = 30000 +154219053714 / 30000 = 5140635.1238 + +(5140635.1238 - 5140635.0) * 30000 = 3714 +3714 / 100 = 37.14 +``` + +37.15 seconds as an offset would be far too much, so this is again used as a calculation divider for the +real offset with the base of 5 times the actual interval. + +Again, the remainder is calculated from the offset and `interval * 5`. This is divided onto base 100 again, +with an additional 0.5 seconds delay. + +Example: offset is 6500, interval 300. + +``` +6500 / 300 = 21.666666666666667 +(21.666666666666667 - 21.0) * 300 = 200 +200 / 100 = 2 +2 + 0.5 = 2.5 +``` + +The minimum value between the first adjustment and the second offset calculation based on the interval is +taken, in the above example `2.5` wins. + +The actual next check time substracts the adjusted time from the future interval addition to provide +a more widespread scheduling time among all checkable objects. + +`nextCheck = now - adj + interval` + +You may ask, what other values can happen with this offset calculation. Consider calculating more examples +with different interval settings. + +Example: offset is 34567, interval 60, now is 1542190472. + +``` +1542190472 * 100 + 34567 = 154219081767 +60 * 100 = 6000 +154219081767 / 6000 = 25703180.2945 +(25703180.2945 - 25703180.0) * 6000 / 100 = 17.67 + +34567 / 60 = 576.116666666666667 +(576.116666666666667 - 576.0) * 60 / 100 + 0.5 = 1.2 +``` + +`1m` interval starts at `now + 1.2s`. + +Example: offset is 12345, interval 86400, now is 1542190472. + +``` +1542190472 * 100 + 12345 = 154219059545 +86400 * 100 = 8640000 +154219059545 / 8640000 = 17849.428188078703704 +(17849.428188078703704 - 17849) * 8640000 = 3699545 +3699545 / 100 = 36995.45 + +12345 / 86400 = 0.142881944444444 +0.142881944444444 * 86400 / 100 + 0.5 = 123.95 +``` + +`1d` interval starts at `now + 2m4s`. + +> **Note** +> +> In case you have a better algorithm at hand, feel free to discuss this in a PR on GitHub. +> It needs to fulfill two things: 1) spread and shuffle execution times on each `next_check` update +> 2) not too narrowed window for both long and short intervals +> Application startup and initial checks need to be handled with care in a slightly different +> fashion. + +When `SetNextCheck()` is called, there are signals registered. One of them sits +inside the `CheckerComponent` class whose handler `CheckerComponent::NextCheckChangedHandler()` +deletes/inserts the next check event from the scheduling queue. This basically +is a list with multiple indexes with the keys for scheduling info and the object. + + +### Check Latency and Execution Time + +Each check command execution logs the start and end time where +Icinga 2 (and the end user) is able to calculate the plugin execution time from it. + +``` +GetExecutionEnd() - GetExecutionStart() +``` + +The higher the execution time, the higher the command timeout must be set. Furthermore +users and developers are encouraged to look into plugin optimizations to minimize the +execution time. Sometimes it is better to let an external daemon/script do the checks +and feed them back via REST API. + +Icinga 2 stores the scheduled start and end time for a check. If the actual +check execution time differs from the scheduled time, e.g. due to performance +problems or limited execution slots (concurrent checks), this value is stored +and computed from inside the check result. + +The difference between the two deltas is called `check latency`. + +``` +(GetScheduleEnd() - GetScheduleStart()) - CalculateExecutionTime() +``` + + ## Cluster ### Communication From 114da89ef0a960bb79cacd7557b6401516f32c0e Mon Sep 17 00:00:00 2001 From: fluxX04 Date: Thu, 15 Nov 2018 09:54:58 +0100 Subject: [PATCH 0326/1162] update apache status command to be identical according the itl --- doc/05-service-monitoring.md | 2 +- doc/08-advanced-topics.md | 2 +- doc/10-icinga-template-library.md | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index eda3089ae..b8e7375c0 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -226,7 +226,7 @@ Instead, choose a plugin and configure its parameters and thresholds. The follow * [ftp](10-icinga-template-library.md#plugin-check-command-ftp) * [webinject](10-icinga-template-library.md#plugin-contrib-command-webinject) * [squid](10-icinga-template-library.md#plugin-contrib-command-squid) -* [apache_status](10-icinga-template-library.md#plugin-contrib-command-apache_status) +* [apache-status](10-icinga-template-library.md#plugin-contrib-command-apache-status) * [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) * [kdc](10-icinga-template-library.md#plugin-contrib-command-kdc) * [rbl](10-icinga-template-library.md#plugin-contrib-command-rbl) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index 58ce96310..de87c40da 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -521,7 +521,7 @@ Database | MySQL | [mysql_health](10-icinga-template-library.md#plugin-contri Database | PostgreSQL | [postgres](10-icinga-template-library.md#plugin-contrib-command-postgres) Database | Housekeeping | Check the database size and growth and analyse metrics to examine trends. Database | DB IDO | [ido](10-icinga-template-library.md#itl-icinga-ido) (more below) -Webserver | Apache2, Nginx, etc. | [http](10-icinga-template-library.md#plugin-check-command-http), [apache_status](10-icinga-template-library.md#plugin-contrib-command-apache_status), [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) +Webserver | Apache2, Nginx, etc. | [http](10-icinga-template-library.md#plugin-check-command-http), [apache-status](10-icinga-template-library.md#plugin-contrib-command-apache-status), [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) Webserver | Certificates | [http](10-icinga-template-library.md#plugin-check-command-http) Webserver | Authorization | [http](10-icinga-template-library.md#plugin-check-command-http) Notifications | Mail (queue) | [smtp](10-icinga-template-library.md#plugin-check-command-smtp), [mailq](10-icinga-template-library.md#plugin-check-command-mailq) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index ccd85e73b..103410d2d 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1667,8 +1667,8 @@ Unless the `ignore_reboot` flag is set, if any updates require a reboot the plug > **Note** > -> If they are enabled, performance data will be shown in the web interface. -> If run without the optional parameters, the plugin will output critical if any important updates are available. +> If they are enabled, performance data will be shown in the web interface. +> If run without the optional parameters, the plugin will output critical if any important updates are available. ### uptime-windows @@ -5139,7 +5139,7 @@ vmware_multiline | **Optional.** Multiline output in overview. This mean This category includes all plugins for web-based checks. -#### apache_status +#### apache-status The [check_apache_status.pl](https://github.com/lbetz/check_apache_status) plugin uses the [/server-status](https://httpd.apache.org/docs/current/mod/mod_status.html) From a763e74a505d844c65d53d525bfdbcd93df91a5d Mon Sep 17 00:00:00 2001 From: Martijn van Duren Date: Fri, 16 Nov 2018 14:23:56 +0100 Subject: [PATCH 0327/1162] Make mail-{host,service}-notification.sh as POSIX-compliant as possible. --- etc/icinga2/scripts/mail-host-notification.sh | 15 +++++++++------ etc/icinga2/scripts/mail-service-notification.sh | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/etc/icinga2/scripts/mail-host-notification.sh b/etc/icinga2/scripts/mail-host-notification.sh index 781fee355..958e2d639 100755 --- a/etc/icinga2/scripts/mail-host-notification.sh +++ b/etc/icinga2/scripts/mail-host-notification.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh # # Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license @@ -51,11 +51,14 @@ Error() { } urlencode() { - local LANG=C i c e='' - for ((i=0;i<${#1};i++)); do - c=${1:$i:1} - [[ "$c" =~ [a-zA-Z0-9\.\~\_\-] ]] || printf -v c '%%%02X' "'$c" - e+="$c" + local LANG=C i=0 c e s="$1" + + while [ $i -lt ${#1} ]; do + [ "$i" -eq 0 ] || s="${s#?}" + c=${s%"${s#?}"} + [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") + e="${e}${c}" + i=$((i + 1)) done echo "$e" } diff --git a/etc/icinga2/scripts/mail-service-notification.sh b/etc/icinga2/scripts/mail-service-notification.sh index d4a1944dc..55edf4876 100755 --- a/etc/icinga2/scripts/mail-service-notification.sh +++ b/etc/icinga2/scripts/mail-service-notification.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/sh # # Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license @@ -53,11 +53,14 @@ Error() { } urlencode() { - local LANG=C i c e='' - for ((i=0;i<${#1};i++)); do - c=${1:$i:1} - [[ "$c" =~ [a-zA-Z0-9\.\~\_\-] ]] || printf -v c '%%%02X' "'$c" - e+="$c" + local LANG=C i=0 c e s="$1" + + while [ $i -lt ${#1} ]; do + [ "$i" -eq 0 ] || s="${s#?}" + c=${s%"${s#?}"} + [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") + e="${e}${c}" + i=$((i + 1)) done echo "$e" } From f3cd3eb8700cf03409786d8177d4f0ed0c67e488 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 19 Nov 2018 14:59:20 +0100 Subject: [PATCH 0328/1162] DSL: Implement getenv() This patch also restores Utility::GetFromEnvironment() and replaces the hardcoded `getenv()` calls. --- doc/18-library-reference.md | 16 ++++++++++++++++ icinga-app/icinga.cpp | 3 ++- lib/base/application.cpp | 4 ++-- lib/base/scriptutils.cpp | 6 ++++++ lib/base/scriptutils.hpp | 1 + lib/base/utility.cpp | 13 ++++++++----- lib/base/utility.hpp | 2 ++ lib/cli/consolecommand.cpp | 16 ++++++++-------- 8 files changed, 45 insertions(+), 16 deletions(-) diff --git a/doc/18-library-reference.md b/doc/18-library-reference.md index 30277bfdf..b1c58c018 100644 --- a/doc/18-library-reference.md +++ b/doc/18-library-reference.md @@ -425,6 +425,22 @@ Example: warn = null } +### getenv + +Signature: + + function getenv(key) + +Returns the value from the specified environment variable key. + +Example: + + $ MY_ENV_VAR=icinga2 icinga2 console + Icinga 2 (version: v2.11.0) + Type $help to view available commands. + <1> => getenv("MY_ENV_VAR") + "icinga2" + ### dirname Signature: diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index b97e79e83..e8d3f5bf3 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -925,7 +925,8 @@ static VOID WINAPI ServiceMain(DWORD argc, LPSTR *argv) int main(int argc, char **argv) { #ifndef _WIN32 - if (!getenv("ICINGA2_KEEP_FDS")) { + String keepFDs = Utility::GetFromEnvironment("ICINGA2_KEEP_FDS"); + if (keepFDs.IsEmpty()) { rlimit rl; if (getrlimit(RLIMIT_NOFILE, &rl) >= 0) { rlim_t maxfds = rl.rlim_max; diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 2ccf275b6..df93710b7 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -491,8 +491,8 @@ String Application::GetExePath(const String& argv0) } if (!foundSlash) { - const char *pathEnv = getenv("PATH"); - if (pathEnv) { + String pathEnv = Utility::GetFromEnvironment("PATH"); + if (!pathEnv.IsEmpty()) { std::vector paths = String(pathEnv).Split(":"); bool foundPath = false; diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index 6d1c5a063..9337ae464 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -61,6 +61,7 @@ REGISTER_SAFE_FUNCTION(System, bool, &ScriptUtils::CastBool, "value"); REGISTER_SAFE_FUNCTION(System, get_time, &Utility::GetTime, ""); REGISTER_SAFE_FUNCTION(System, basename, &Utility::BaseName, "path"); REGISTER_SAFE_FUNCTION(System, dirname, &Utility::DirName, "path"); +REGISTER_SAFE_FUNCTION(System, getenv, &ScriptUtils::GetEnv, "value"); REGISTER_SAFE_FUNCTION(System, msi_get_component_path, &ScriptUtils::MsiGetComponentPathShim, "component"); REGISTER_SAFE_FUNCTION(System, track_parents, &ScriptUtils::TrackParents, "child"); REGISTER_SAFE_FUNCTION(System, escape_shell_cmd, &Utility::EscapeShellCmd, "cmd"); @@ -530,3 +531,8 @@ Value ScriptUtils::GlobRecursive(const std::vector& args) return Array::FromVector(paths); } + +String ScriptUtils::GetEnv(const String& key) +{ + return Utility::GetFromEnvironment(key); +} diff --git a/lib/base/scriptutils.hpp b/lib/base/scriptutils.hpp index 92449188f..778ab9587 100644 --- a/lib/base/scriptutils.hpp +++ b/lib/base/scriptutils.hpp @@ -58,6 +58,7 @@ public: static double Ptr(const Object::Ptr& object); static Value Glob(const std::vector& args); static Value GlobRecursive(const std::vector& args); + static String GetEnv(const String& key); private: ScriptUtils(); diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index cf8bc588f..466a236de 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #ifdef __FreeBSD__ @@ -1936,16 +1937,18 @@ String Utility::GetIcingaDataPath() #endif /* _WIN32 */ +/** + * Retrieve the environment variable value by given key. + * + * @param env Environment variable name. + */ + String Utility::GetFromEnvironment(const String& env) { -#ifndef _WIN32 const char *envValue = getenv(env.CStr()); + if (envValue == NULL) return String(); else return String(envValue); -#else /* _WIN32 */ - // While getenv exists on Windows, we don't set them. Therefore there is no reason to read them. - return String(); -#endif /* _WIN32 */ } diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index e75ebfefa..b07ca1474 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -69,6 +69,8 @@ public: static String DirName(const String& path); static String BaseName(const String& path); + static String GetEnv(const String& key); + static void NullDeleter(void *); static double GetTime(); diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index 15d5ecc77..86019022a 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -245,8 +245,8 @@ int ConsoleCommand::Run(const po::variables_map& vm, const std::vectorSetUsername(usernameEnv); - if (passwordEnv) + if (!passwordEnv.IsEmpty()) url->SetPassword(passwordEnv); if (url->GetPort().IsEmpty()) From f1d26848acd31f355d4b5982d9060b36e2a60fbe Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 21 Nov 2018 11:20:54 +0100 Subject: [PATCH 0329/1162] Docs: Add a section for DB IDO Cleanup refs #6784 --- doc/14-features.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/14-features.md b/doc/14-features.md index 378161acd..0ecafd62c 100644 --- a/doc/14-features.md +++ b/doc/14-features.md @@ -87,6 +87,30 @@ status_update_time A detailed list on the available table attributes can be found in the [DB IDO Schema documentation](24-appendix.md#schema-db-ido). +### DB IDO Cleanup + +Objects get deactivated when they are deleted from the configuration. +This is visible with the `is_active` column in the `icinga_objects` table. +Therefore all queries need to join this table and add `WHERE is_active=1` as +condition. Deleted objects preserve their history table entries for later SLA +reporting. + +Historical data isn't purged by default. You can enable the least +kept data age inside the `cleanup` configuration attribute for the +IDO features [IdoMysqlConnection](09-object-types.md#objecttype-idomysqlconnection) +and [IdoPgsqlConnection](09-object-types.md#objecttype-idopgsqlconnection). + +Example if you prefer to keep notification history for 30 days: + +``` + cleanup = { + notifications_age = 30d + contactnotifications_age = 30d + } +``` + +The historical tables are populated depending on the data `categories` specified. +Some tables are empty by default. ### DB IDO Tuning From 5da4fbde3b501c174ec028b7a7ae036194a5a77e Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Mon, 26 Nov 2018 17:13:58 +0100 Subject: [PATCH 0330/1162] Fix check_perfmon to support non-localized names This fixes check_perfmon to support non-localized names on localized Windows machines. The fix handles the given performance counter by default as non-localized name, if none is found it falls back to the localized name. refs #5546 --- plugins/check_perfmon.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/check_perfmon.cpp b/plugins/check_perfmon.cpp index e9d44cf55..bfe883b2d 100644 --- a/plugins/check_perfmon.cpp +++ b/plugins/check_perfmon.cpp @@ -297,7 +297,11 @@ bool QueryPerfData(printInfoStruct& pI) if (FAILED(status)) goto die; - status = PdhAddCounter(hQuery, pI.wsFullPath.c_str(), NULL, &hCounter); + status = PdhAddEnglishCounter(hQuery, pI.wsFullPath.c_str(), NULL, &hCounter); + + if (FAILED(status)) + status = PdhAddCounter(hQuery, pI.wsFullPath.c_str(), NULL, &hCounter); + if (FAILED(status)) goto die; From 2e462d63a4a8465aee0cea3a2e7b11c2837d8e60 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Tue, 27 Nov 2018 19:22:36 +0400 Subject: [PATCH 0331/1162] Add varnish CheckCommand definition This definition use check_varnish to monitore a varnish instance. This closes #5122 --- doc/10-icinga-template-library.md | 15 +++++++++++++++ itl/plugins-contrib.d/web.conf | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 103410d2d..7887d24dd 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5344,3 +5344,18 @@ webinject_no_output | **Optional.** Suppresses all output to STDOUT except t webinject_timeout | **Optional.** The value [given in seconds] will be compared to the global time elapsed to run all the tests. If the tests have all been successful, but have taken more time than the 'globaltimeout' value, a warning message is sent back to Icinga. webinject_report_type | **Optional.** This setting is used to enable output formatting that is compatible for use with specific external programs. The available values you can set this to are: nagios, mrtg, external and standard. webinject_testcase_file | **Optional.** When you launch WebInject in console mode, you can optionally supply an argument for a testcase file to run. It will look for this file in the directory that webinject.pl resides in. If no filename is passed from the command line, it will look in config.xml for testcasefile declarations. If no files are specified, it will look for a default file named 'testcases.xml' in the current [webinject] directory. If none of these are found, the engine will stop and give you an error. + +#### varnish + +The [check_varnish](https://github.com/varnish/varnish-nagios) plugin, +also available in the [monitoring-plugins-contrib](https://packages.debian.org/sid/nagios-plugins-contrib) on debian, +uses the `varnishstat` binary to monitor [varnish](https://varnish-cache.org/). + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|---------------------------------------------------------------------------------- +varnish_name | **Optional.** Specify the Varnish instance name +varnish_param | **Optional.** Specify the parameter to check (see below). The default is 'ratio'. +varnish_critical | **Optional.** Set critical threshold: [@][lo:]hi +varnish_warning | **Optional.** Set warning threshold: [@][lo:]hi diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 0f5daac48..a5784963b 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -561,3 +561,28 @@ object CheckCommand "ssl_cert" { vars.ssl_cert_address = "$check_address$" vars.ssl_cert_port = 443 } + +object CheckCommand "varnish" { + import "plugin-check-command" + command = [ PluginDir + "/check_varnish" ] + + arguments = { + "-n" = { + value = "$varnish_name$" + description = "Specify the Varnish instance name" + } + "-p" = { + value = "$varnish_param$" + description = "Specify the parameter to check (see below). The default is 'ratio'." + } + "-c" = { + value = "$varnish_critical$" + description = "Set critical threshold: [@][lo:]hi" + } + "-w" = { + value = "$varnish_warning$" + description = "Set warning threshold: [@][lo:]hi" + } + } +} + From 42cbd365bf42ec624f8ccfb1d29b0dedffcc8821 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Tue, 27 Nov 2018 19:35:58 +0400 Subject: [PATCH 0332/1162] Add more info about varnish_param --- doc/10-icinga-template-library.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 7887d24dd..388817d2d 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5359,3 +5359,14 @@ varnish_name | **Optional.** Specify the Varnish instance name varnish_param | **Optional.** Specify the parameter to check (see below). The default is 'ratio'. varnish_critical | **Optional.** Set critical threshold: [@][lo:]hi varnish_warning | **Optional.** Set warning threshold: [@][lo:]hi + +For *varnish_param*, all items reported by varnishstat(1) are available - use the +identifier listed in the left column by `varnishstat -l`. In +addition, the following parameters are available: + +Name | Description +------------------------|---------------------------------------------------------------------------------- +uptime | How long the cache has been running (in seconds) +ratio | The cache hit ratio expressed as a percentage of hits to hits + misses. Default thresholds are 95 and 90. +usage | Cache file usage as a percentage of the total cache space. + From 16b0042791611042b85d7db5a1789202f0eb35d2 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Wed, 28 Nov 2018 00:04:10 +0400 Subject: [PATCH 0333/1162] Add btrfs CheckCommand definition Check a btrfs mountpoint health and disk space allocated --- doc/10-icinga-template-library.md | 16 +++++++++++++++ itl/plugins-contrib.d/storage.conf | 32 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 103410d2d..de36703a9 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3106,6 +3106,22 @@ ceph_client_key | **Optional.** Ceph client keyring file. ceph_whitelist | **Optional.** Whitelist regexp for ceph health warnings. ceph_details | **Optional.** Run 'ceph health detail'. +#### btrfs + +The [btrfs plugin](https://github.com/knorrie/python-btrfs/) +is used to check the btrfs storage health on the server. + +[monitoring-plugins-btrfs](https://packages.debian.org/monitoring-plugins-btrfs) provide the necessary binary on debian/ubuntu. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +-----------------|--------------------------------------------------------- +btrfs_awg | **Optional.** Exit with WARNING status if less than the specified amount of disk space (in GiB) is unallocated +btrfs_acg | **Optional.** Exit with CRITICAL status if less than the specified amount of disk space (in GiB) is unallocated +btrfs_awp | **Optional.** Exit with WARNING status if more than the specified percent of disk space is allocated +btrfs_acp | **Optional.** Exit with CRITICAL status if more than the specified percent of disk space is allocated +btrfs_mountpoint | **Required.** Path to the BTRFS mountpoint ### Virtualization diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index 3e413e0ab..3d1286b2e 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -102,3 +102,35 @@ object CheckCommand "ceph" { } } } + +object CheckCommand "btrfs" { + import "plugin-check-command" + [ "sudo", PluginDir + "/check_btrfs" ] + + arguments = { + "--allocated-warning-gib" = { + value = "$btrfs_awg$" + description = "Exit with WARNING status if less than the specified amount of disk space (in GiB) is unallocated" + } + "--allocated-critical-gib" = { + value = "$btrfs_acg$" + description = "Exit with CRITICAL status if less than the specified amount of disk space (in GiB) is unallocated" + } + "--allocated-warning-percent" = { + value = "$btrfs_awp$" + description = "Exit with WARNING status if more than the specified percent of disk space is allocated" + } + "--allocated-critical-percent" = { + value = "$btrfs_acp$" + description = "Exit with CRITICAL status if more than the specified percent of disk space is allocated" + } + "--mountpoint" = { + value = "$btrfs_mountpoint$" + description = "Path to the BTRFS mountpoint" + required = true + } + } + vars.btrfs_awp = 80 + vars.btrfs_acp = 90 +} + From ef0c68fe79567156e26deafdcfbf3c01b5c7cc2d Mon Sep 17 00:00:00 2001 From: BarbUk Date: Wed, 28 Nov 2018 11:37:49 +0400 Subject: [PATCH 0334/1162] correct command definition --- itl/plugins-contrib.d/storage.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index 3d1286b2e..c14bf6856 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -105,7 +105,7 @@ object CheckCommand "ceph" { object CheckCommand "btrfs" { import "plugin-check-command" - [ "sudo", PluginDir + "/check_btrfs" ] + command = [ "sudo", PluginDir + "/check_btrfs" ] arguments = { "--allocated-warning-gib" = { From b6e97a9eff56d4201cc943c979702d17f7ed8a72 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Wed, 28 Nov 2018 13:39:51 +0400 Subject: [PATCH 0335/1162] Add documentation for sudoers configuration --- doc/10-icinga-template-library.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index de36703a9..5b705a9b6 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3111,6 +3111,18 @@ ceph_details | **Optional.** Run 'ceph health detail'. The [btrfs plugin](https://github.com/knorrie/python-btrfs/) is used to check the btrfs storage health on the server. +The plugin requires `sudo` permissions. +You can add a sudoers file to allow your monitoring user to use the plugin, i.e. edit /etc/sudoers.d/nagios and add: +``` +nagios ALL=(root) NOPASSWD:/usr/lib/nagios/plugins/check_btrfs +``` + +and set the correct permissions: +```bash +chown -c root: /etc/sudoers.d/nagios +chmod -c 0440 /etc/sudoers.d/nagios +``` + [monitoring-plugins-btrfs](https://packages.debian.org/monitoring-plugins-btrfs) provide the necessary binary on debian/ubuntu. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): From 3b0bfd51bfaed69144dea09244fc7b563957ac40 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Wed, 28 Nov 2018 16:55:23 +0400 Subject: [PATCH 0336/1162] Add lsyncd CheckCommand definition --- doc/10-icinga-template-library.md | 17 +++++++++++++++++ itl/plugins-contrib.d/network-services.conf | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 103410d2d..ecedc252f 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2975,6 +2975,23 @@ nwc_health_oids | **Optional.** A list of oids which are downloaded and writte nwc_health_offline | **Optional.** The maximum number of seconds since the last update of cache file before it is considered too old. nwc_health_multiline | **Optional.** Multiline output +### Network Services + +This category contains plugins which receive details about network services + +#### lsyncd + +The [check_lsyncd](https://github.com/ohitz/check_lsyncd) plugin, +uses the `lsyncd` status file to monitor [lsyncd](https://axkibe.github.io/lsyncd/). + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|--------------------------------------------------------------------------- +lsyncd_statfile | **Optional.** Set status file path (default: /var/run/lsyncd.status). +lsyncd_warning | **Optional.** Warning if more than N delays (default: 10). +lsyncd_critical | **Optional.** Critical if more then N delays (default: 100). + ### Operating System diff --git a/itl/plugins-contrib.d/network-services.conf b/itl/plugins-contrib.d/network-services.conf index 0e1420d5b..5126dcc69 100644 --- a/itl/plugins-contrib.d/network-services.conf +++ b/itl/plugins-contrib.d/network-services.conf @@ -81,3 +81,23 @@ object CheckCommand "rbl" { vars.rbl_warning = 1 vars.rbl_critical = 1 } + +object CheckCommand "lsyncd" { + import "plugin-check-command" + command = [ PluginDir + "/check_lsyncd" ] + + arguments = { + "-s" = { + value = "$lsyncd_statfile$" + description = "Set status file path (default: /var/run/lsyncd.status)." + } + "-w" = { + value = "$lsyncd_warning$" + description = "Warning if more than N delays (default: 10)." + } + "-c" = { + value = "$lsyncd_critical$" + description = "Critical if more then N delays (default: 100)." + } + } +} From 8de5326d23cb0cb015e552a20d9d26f842ac1eab Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 29 Nov 2018 17:51:53 +0100 Subject: [PATCH 0337/1162] Remove redundand check for object existence on creation via API refs #3937 --- lib/remote/configobjectutility.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index 1fc8dcb92..708ec0303 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -120,11 +120,6 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full String path = GetObjectConfigPath(type, fullName); Utility::MkDirP(Utility::DirName(path), 0700); - if (Utility::PathExists(path)) { - errors->Add("Cannot create object '" + fullName + "'. Configuration file '" + path + "' already exists."); - return false; - } - std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc); fp << config; fp.close(); From d57d3cbb49fe0c8edc31be3f65bc1da977ccdfb7 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Fri, 30 Nov 2018 00:33:53 +0400 Subject: [PATCH 0338/1162] Indentation: space to tab --- itl/plugins-contrib.d/network-services.conf | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/itl/plugins-contrib.d/network-services.conf b/itl/plugins-contrib.d/network-services.conf index 5126dcc69..989a9eb05 100644 --- a/itl/plugins-contrib.d/network-services.conf +++ b/itl/plugins-contrib.d/network-services.conf @@ -83,21 +83,21 @@ object CheckCommand "rbl" { } object CheckCommand "lsyncd" { - import "plugin-check-command" - command = [ PluginDir + "/check_lsyncd" ] + import "plugin-check-command" + command = [ PluginDir + "/check_lsyncd" ] - arguments = { - "-s" = { - value = "$lsyncd_statfile$" - description = "Set status file path (default: /var/run/lsyncd.status)." - } - "-w" = { - value = "$lsyncd_warning$" - description = "Warning if more than N delays (default: 10)." - } - "-c" = { - value = "$lsyncd_critical$" - description = "Critical if more then N delays (default: 100)." - } - } + arguments = { + "-s" = { + value = "$lsyncd_statfile$" + description = "Set status file path (default: /var/run/lsyncd.status)." + } + "-w" = { + value = "$lsyncd_warning$" + description = "Warning if more than N delays (default: 10)." + } + "-c" = { + value = "$lsyncd_critical$" + description = "Critical if more then N delays (default: 100)." + } + } } From 9d1a6d74928acbe536405c6179918653081598bd Mon Sep 17 00:00:00 2001 From: BarbUk Date: Fri, 30 Nov 2018 00:36:06 +0400 Subject: [PATCH 0339/1162] Indentation: space to tab --- itl/plugins-contrib.d/web.conf | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index a5784963b..458de5a57 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -563,26 +563,26 @@ object CheckCommand "ssl_cert" { } object CheckCommand "varnish" { - import "plugin-check-command" - command = [ PluginDir + "/check_varnish" ] + import "plugin-check-command" + command = [ PluginDir + "/check_varnish" ] - arguments = { - "-n" = { - value = "$varnish_name$" - description = "Specify the Varnish instance name" - } - "-p" = { - value = "$varnish_param$" - description = "Specify the parameter to check (see below). The default is 'ratio'." - } - "-c" = { - value = "$varnish_critical$" - description = "Set critical threshold: [@][lo:]hi" - } - "-w" = { - value = "$varnish_warning$" - description = "Set warning threshold: [@][lo:]hi" - } - } + arguments = { + "-n" = { + value = "$varnish_name$" + description = "Specify the Varnish instance name" + } + "-p" = { + value = "$varnish_param$" + description = "Specify the parameter to check (see below). The default is 'ratio'." + } + "-c" = { + value = "$varnish_critical$" + description = "Set critical threshold: [@][lo:]hi" + } + "-w" = { + value = "$varnish_warning$" + description = "Set warning threshold: [@][lo:]hi" + } + } } From 4afbf2f987b7285aaf4f893b76e2772c36c42073 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Fri, 30 Nov 2018 00:40:05 +0400 Subject: [PATCH 0340/1162] Documentation: use icinga user instead of nagios --- doc/10-icinga-template-library.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 5b705a9b6..5d57d3275 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3114,13 +3114,13 @@ is used to check the btrfs storage health on the server. The plugin requires `sudo` permissions. You can add a sudoers file to allow your monitoring user to use the plugin, i.e. edit /etc/sudoers.d/nagios and add: ``` -nagios ALL=(root) NOPASSWD:/usr/lib/nagios/plugins/check_btrfs +icinga ALL=(root) NOPASSWD:/usr/lib/nagios/plugins/check_btrfs ``` and set the correct permissions: ```bash -chown -c root: /etc/sudoers.d/nagios -chmod -c 0440 /etc/sudoers.d/nagios +chown -c root: /etc/sudoers.d/icinga +chmod -c 0440 /etc/sudoers.d/icinga ``` [monitoring-plugins-btrfs](https://packages.debian.org/monitoring-plugins-btrfs) provide the necessary binary on debian/ubuntu. From 4944800d0953c2f1a43f6439d22a4e9515545754 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Fri, 30 Nov 2018 00:41:27 +0400 Subject: [PATCH 0341/1162] Indentation: space to tab --- itl/plugins-contrib.d/storage.conf | 54 +++++++++++++++--------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index c14bf6856..1d1822ea0 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -104,33 +104,33 @@ object CheckCommand "ceph" { } object CheckCommand "btrfs" { - import "plugin-check-command" - command = [ "sudo", PluginDir + "/check_btrfs" ] + import "plugin-check-command" + command = [ "sudo", PluginDir + "/check_btrfs" ] - arguments = { - "--allocated-warning-gib" = { - value = "$btrfs_awg$" - description = "Exit with WARNING status if less than the specified amount of disk space (in GiB) is unallocated" - } - "--allocated-critical-gib" = { - value = "$btrfs_acg$" - description = "Exit with CRITICAL status if less than the specified amount of disk space (in GiB) is unallocated" - } - "--allocated-warning-percent" = { - value = "$btrfs_awp$" - description = "Exit with WARNING status if more than the specified percent of disk space is allocated" - } - "--allocated-critical-percent" = { - value = "$btrfs_acp$" - description = "Exit with CRITICAL status if more than the specified percent of disk space is allocated" - } - "--mountpoint" = { - value = "$btrfs_mountpoint$" - description = "Path to the BTRFS mountpoint" - required = true - } - } - vars.btrfs_awp = 80 - vars.btrfs_acp = 90 + arguments = { + "--allocated-warning-gib" = { + value = "$btrfs_awg$" + description = "Exit with WARNING status if less than the specified amount of disk space (in GiB) is unallocated" + } + "--allocated-critical-gib" = { + value = "$btrfs_acg$" + description = "Exit with CRITICAL status if less than the specified amount of disk space (in GiB) is unallocated" + } + "--allocated-warning-percent" = { + value = "$btrfs_awp$" + description = "Exit with WARNING status if more than the specified percent of disk space is allocated" + } + "--allocated-critical-percent" = { + value = "$btrfs_acp$" + description = "Exit with CRITICAL status if more than the specified percent of disk space is allocated" + } + "--mountpoint" = { + value = "$btrfs_mountpoint$" + description = "Path to the BTRFS mountpoint" + required = true + } + } + vars.btrfs_awp = 80 + vars.btrfs_acp = 90 } From 160a7716c5a25d530853557b93a7567b7c9123af Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 29 Nov 2018 22:03:26 +0100 Subject: [PATCH 0342/1162] Fix state conditions in check_memory and check_swap This fixes the state conditions in check_memory and check_swap. This turns the if/else if/else statements in simple if statements, since they won't work properly when both thresholds are broken. This also implements a new function to get a given state as wstring. --- plugins/check_memory.cpp | 15 ++++++--------- plugins/check_swap.cpp | 13 +++++-------- plugins/thresholds.cpp | 9 +++++++++ plugins/thresholds.hpp | 2 ++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index e8cb8aae9..4b71517a4 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -164,7 +164,7 @@ static int printOutput(printInfoStruct& printInfo) if (l_Debug) std::wcout << L"Constructing output string" << '\n'; - state state; + state state = OK; std::wcout << L"MEMORY "; @@ -175,16 +175,13 @@ static int printOutput(printInfoStruct& printInfo) else currentValue = printInfo.tRam - printInfo.aRam; - if (printInfo.warn.rend(currentValue, printInfo.tRam)) { + if (printInfo.warn.rend(currentValue, printInfo.tRam)) state = WARNING; - std::wcout << L"WARNING"; - } else if (printInfo.crit.rend(currentValue, printInfo.tRam)) { + + if (printInfo.crit.rend(currentValue, printInfo.tRam)) state = CRITICAL; - std::wcout << L"CRITICAL"; - } else { - state = OK; - std::wcout << L"OK"; - } + + std::wcout << stateToString(state); if (!printInfo.showUsed) std::wcout << " - " << printInfo.percentFree << L"% free"; diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 7f6db013a..906a1017d 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -194,16 +194,13 @@ static int printOutput(printInfoStruct& printInfo) else currentValue = printInfo.tSwap - printInfo.aSwap; - if (printInfo.warn.rend(currentValue, printInfo.tSwap)) { + if (printInfo.warn.rend(currentValue, printInfo.tSwap)) state = WARNING; - std::wcout << L"WARNING - "; - } else if (printInfo.crit.rend(currentValue, printInfo.tSwap)) { + + if (printInfo.crit.rend(currentValue, printInfo.tSwap)) state = CRITICAL; - std::wcout << L"CRITICAL - "; - } else { - state = OK; - std::wcout << L"OK - "; - } + + std::wcout << stateToString(state) << " "; if (!printInfo.showUsed) std::wcout << printInfo.percentFree << L"% free "; diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index f32e6d360..acc2bcafb 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -281,4 +281,13 @@ std::wstring formatErrorInfo(unsigned long err) { } return out.str(); +} + +std::wstring stateToString(const state& state) { + switch (state) { + case OK: return L"OK"; + case WARNING: return L"WARNING"; + case CRITICAL: return L"CRITICAL"; + default: return L"UNKNOWN"; + } } \ No newline at end of file diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index 8348306f2..e7d77f745 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -76,4 +76,6 @@ std::wstring TunitStr(const Tunit&); void printErrorInfo(unsigned long err = 0); std::wstring formatErrorInfo(unsigned long err); +std::wstring stateToString(const state&); + #endif /* THRESHOLDS_H */ From fe42c091a4ce7a88be1cf87ab97102058f5e9f2b Mon Sep 17 00:00:00 2001 From: BarbUk Date: Fri, 30 Nov 2018 01:32:20 +0400 Subject: [PATCH 0343/1162] Documentation: fix sudoers file name --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 5d57d3275..b2e00fe55 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -3112,7 +3112,7 @@ The [btrfs plugin](https://github.com/knorrie/python-btrfs/) is used to check the btrfs storage health on the server. The plugin requires `sudo` permissions. -You can add a sudoers file to allow your monitoring user to use the plugin, i.e. edit /etc/sudoers.d/nagios and add: +You can add a sudoers file to allow your monitoring user to use the plugin, i.e. edit /etc/sudoers.d/icinga and add: ``` icinga ALL=(root) NOPASSWD:/usr/lib/nagios/plugins/check_btrfs ``` From 4382b87baa0f4fa433772b2b38814fce0d443200 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:49:27 +0100 Subject: [PATCH 0344/1162] Docs: First draft for development docs --- doc/21-development.md | 1571 +++++++++++++++++++++++++++++++++++------ 1 file changed, 1350 insertions(+), 221 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index d90d50def..1ff183434 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1,14 +1,19 @@ -# Develop Icinga 2 +# Development This chapter provides hints on Icinga 2 development -especially for debugging purposes. +and debugging. -> **Note** -> -> If you are planning to build your own development environment, -> please consult the `INSTALL.md` file from the source tree. +## Debug Icinga 2 -## Debug Requirements +This chapter targets all users who have been asked by developers to provide +a stack trace or coredump if the application crashed. It is also useful +for developers working with different debuggers. + +> **Note:** +> This is intentionally mentioned before any development insights +> as debugging is a more frequent and commonly asked question. + +### Debug Requirements Make sure that the debug symbols are available for Icinga 2. The Icinga 2 packages provide a debug package which must be @@ -17,43 +22,1364 @@ or `icinga2-ido-mysql`. Debian/Ubuntu: - # apt-get install icinga2-dbg +``` +apt-get install icinga2-dbg +``` RHEL/CentOS: - # yum install icinga2-debuginfo +``` +yum install icinga2-debuginfo +``` Fedora: - # dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` +dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` SLES/openSUSE: - # zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` +zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` - -Furthermore, you may also have to install debug symbols for Boost and your C library. +Furthermore, you may also have to install debug symbols for Boost and your C++ library. If you're building your own binaries, you should use the `-DCMAKE_BUILD_TYPE=Debug` cmake build flag for debug builds. -## GDB +### GDB as Debugger -Install gdb: +Install GDB in your development environment. Debian/Ubuntu: - # apt-get install gdb +``` +apt-get install gdb +``` RHEL/CentOS/Fedora: - # yum install gdb +``` +yum install gdb +``` SLES/openSUSE: - # zypper install gdb +``` +zypper install gdb +``` +#### GDB Run + +Call GDB with the binary (`/usr/sbin/icinga2` is a wrapper script calling +`/usr/lib64/icinga2/sbin/icinga2` since 2.4) and all arguments and run it in foreground. + +``` +gdb --args /usr/lib64/icinga2/sbin/icinga2 daemon -x debug +``` + +The exact path to the Icinga 2 binary differs on each distribution. On Ubuntu +it is installed into `/usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2` on 64-bit systems +for example. + +> **Note** +> +> If gdb tells you it's missing debug symbols, quit gdb and install +> them: `Missing separate debuginfos, use: debuginfo-install ...` + +Run/restart the application. + +``` +(gdb) r +``` + +Kill the running application. + +``` +(gdb) k +``` + +Continue after breakpoint. + +``` +(gdb) c +``` + +#### GDB Core Dump + +Either attach to the running process using `gdb -p PID` or start +a new gdb run. + +``` +(gdb) r +(gdb) generate-core-file +``` + +#### GDB Backtrace + +If Icinga 2 aborted its operation abnormally, generate a backtrace. +`thread apply all` is important here since this includes all running threads. +We need this information when e.g. debugging dead locks and hanging features. + +``` +(gdb) bt +(gdb) thread apply all bt full +``` + +If gdb stops at a SIGPIPE signal please disable the signal before +running Icinga 2. This isn't an error, but we need to workaround it. + +``` +(gdb) handle SIGPIPE nostop noprint pass +(gdb) r +``` + +If you create a [new issue](https://github.com/Icinga/icinga2/issues), +make sure to attach as much detail as possible. + +#### GDB Backtrace from Running Process + +If Icinga 2 is still running, generate a full backtrace from the running +process and store it into a new file (e.g. for debugging dead locks). + +Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs +and add them to the GitHub issue. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done +``` + +#### GDB Thread List from Running Process + +Instead of a full backtrace, you sometimes just need a list of running threads. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done +``` + +#### GDB Backtrace Stepping + +Identifying the problem may require stepping into the backtrace, analysing +the current scope, attributes, and possible unmet requirements. `p` prints +the value of the selected variable or function call result. + +``` +(gdb) up +(gdb) down +(gdb) p checkable +(gdb) p checkable.px->m_Name +``` + +#### GDB Breakpoints + +To set a breakpoint to a specific function call, or file specific line. + +``` +(gdb) b checkable.cpp:125 +(gdb) b icinga::Checkable::SetEnablePerfdata +``` + +GDB will ask about loading the required symbols later, select `yes` instead +of `no`. + +Then run Icinga 2 until it reaches the first breakpoint. Continue with `c` +afterwards. + +``` +(gdb) run +(gdb) c +``` + +In case you want to step into the next line of code, use `n`. If there is a +function call where you want to step into, use `s`. + +``` +(gdb) n + +(gdb) s +``` + +If you want to delete all breakpoints, use `d` and select `yes`. + +``` +(gdb) d +``` + +> **Tip** +> +> When debugging exceptions, set your breakpoint like this: `b __cxa_throw`. + +Breakpoint Example: + + (gdb) b __cxa_throw + (gdb) r + (gdb) up + .... + (gdb) up + #11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function const&, int) (path=..., pattern=..., callback=..., type=1) + at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609 + 609 callback(cpath); + (gdb) l + 604 + 605 #endif /* _WIN32 */ + 606 + 607 std::sort(files.begin(), files.end()); + 608 BOOST_FOREACH(const String& cpath, files) { + 609 callback(cpath); + 610 } + 611 + 612 std::sort(dirs.begin(), dirs.end()); + 613 BOOST_FOREACH(const String& cpath, dirs) { + (gdb) p files + $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}} + + +### Core Dump + +When the Icinga 2 daemon crashes with a `SIGSEGV` signal +a core dump file should be written. This will help +developers to analyze and fix the problem. + +#### Core Dump File Size Limit + +This requires setting the core dump file size to `unlimited`. + +Example for Systemd: + +``` +vim /usr/lib/systemd/system/icinga2.service + +[Service] +... +LimitCORE=infinity + +systemctl daemon-reload + +systemctl restart icinga2 +``` + +Example for init script: + +``` +vim /etc/init.d/icinga2 +... +ulimit -c unlimited + +service icinga2 restart +``` + +Verify that the Icinga 2 process core file size limit is set to `unlimited`. + +``` +cat /proc/`pidof icinga2`/limits +... +Max core file size unlimited unlimited bytes +``` + + +#### Core Dump Kernel Format + +The Icinga 2 daemon runs with the SUID bit set. Therefore you need +to explicitly enable core dumps for SUID on Linux. + +``` +sysctl -w fs.suid_dumpable=1 +``` + +Adjust the coredump kernel format and file location on Linux: + +``` +sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p + +install -m 1777 -d /var/lib/cores +``` + +MacOS: + +``` +sysctl -w kern.corefile=/cores/core.%P + +chmod 777 /cores +``` + +#### Core Dump Analysis + +Once Icinga 2 crashes again a new coredump file will be written. Please +attach this file to your bug report in addition to the general details. + +Simple test case for a `SIGSEGV` simulation with `sleep`: + +``` +ulimit -c unlimited +sleep 1800& +[1] +kill -SEGV +gdb `which sleep` /var/lib/cores/core.sleep. +(gdb) bt +rm /var/lib/cores/core.sleep.* +``` + +Analyzing Icinga 2: + +``` +gdb /usr/lib64/icinga2/sbin/icinga2 core.icinga2. +(gdb) bt +``` + +### LLDB as Debugger + +LLDB is available on macOS with the Xcode command line tools. + +``` +$ xcode-select --install +``` + +In order to run Icinga 2 with LLDB you need to pass the binary as argument. + +``` +lldb -- /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon +``` + +Full backtrace: + +``` +> bt all +``` + +Select thread: + +``` +> thr sel 5 +``` + +Step into: + +``` +> s +``` + +Next step: + +``` +> n +``` + +Continue: + +``` +> c +``` + +Up/down in stacktrace: + +``` +> up +> down +``` + + + +## Develop Icinga 2 + +Icinga 2 can be built on many platforms such as Linux, Unix and Windows. +There are limitations in terms of support, e.g. Windows is only supported for clients, +not a full-featured master or satellite. + +Before you start with actual development, there is a couple of pre-requisites. + +### Choose your Editor + +Icinga 2 can be developed with your favorite editor. Icinga developers prefer to use +the tools below: + +- vim +- CLion (macOS, Linux) +- MS Visual Studio (Windows) +- Atom + +Editors differ on the functionality. The more helpers you get for C++ development, +the faster your development workflow will be. + + +#### Whitespace Cleanup + +Patches must be cleaned up and follow the indent style (tabs instead of spaces). +You should also remove any training whitespaces. + +`git diff` allows to highlight such. + +``` +vim $HOME/.gitconfig + +[color "diff"] + whitespace = red reverse +[core] + whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol +``` + +`vim` also can match these and visually alert you to remove them. + +``` +vim $HOME/.vimrc + +highlight ExtraWhitespace ctermbg=red guibg=red +match ExtraWhitespace /\s\+$/ +autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ +autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@ + +Icinga 2 can run standalone or in distributed environments. It contains a whole lot +more than a simple check execution engine. + +Read more about it in the [Technical Concepts](#technical-concepts) chapter. + +### Get to know the code + +First off, you really need to know C++ and portions of C++11 and the boost libraries. +Best is to start with a book or online tutorial to get into the basics. +Icinga developers gained their knowledge through studies, training and self-teaching +code by trying it out and asking senior developers for guidance. + +Here's a few books we can recommend: + +* [Accelerated C++: Practical Programming by Example](https://www.amazon.com/Accelerated-C-Practical-Programming-Example/dp/020170353X) (Andrew Koenig, Barbara E. Moo) +* [Effective C++](https://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876) (Scott Meyers) +* [Der C++ Programmierer](https://www.amazon.de/Programmierer-lernen-Professionell-anwenden-L%C3%B6sungen/dp/3446416447), German (Ulrich Breymann) +* [C++11 programmieren](https://www.amazon.de/gp/product/3836217325/), German (Torsten T. Will) + +In addition, it is a good bet to also know SQL when diving into backend development. + +* [SQL Performance Explained](https://www.amazon.de/gp/product/3950307826/) (Markus Winand) + +Last but not least, if you are developing on Windows, get to know the internals about services and the Win32 API. + + +### Design Patterns + +Icinga 2 heavily relies on object-oriented programming and encapsulates common +functionality into classes and objects. It also uses modern programming techniques +to e.g. work with shared pointer memory management. + +Icinga 2 consists of libraries bundled into the main binary. Therefore you'll +find many code parts in the `lib/` directory wheras the actual application is +built from `icinga-app/`. Accompanied with Icinga 2, there's the Windows plugins +which are standalone and compiled from `plugins/`. + +Library | Description +---------------|------------------------------------ +base | Objects, values, types, streams, tockets, TLS, utilities, etc. +config | Configuration compiler, expressions, etc. +cli | CLI (sub) commands and helpers. +icinga | Icinga specific objects and event handling. +remote | Cluster and HTTP client/server and REST API related code. +checker | Checker feature, check scheduler. +notification | Notification feature, notification scheduler. +methods | Command execution methods, plugins and built-in checks. +perfdata | Performance data related, including Graphite, Elastic, etc. +db\_ido | IDO database abstraction layer. +db\_ido\_mysql | IDO database driver for MySQL. +db\_ido\_pgsql | IDO database driver for PgSQL. +mysql\_shin | Library stub for linking against the MySQL client libraries. +pgsql\_shim | Library stub for linking against the PgSQL client libraries. + +Another thing you will recognize are the `.ti` files which are compiled +by our own class compiler into actual source code. The meta language allows +developers to easily add object attributes and specify their behaviour. + +Some object attributes need to be stored over restarts in the state file +and therefore have the `state` attribute set. Others are treated as `config` +attribute and automatically get configuration validation functions created. +Hidden or read-only REST API attributes are marked with `no_user_view` and +`no_user_modify`. + +The most beneficial thing are getters and setters being generated. The actual object +inherits from `ObjectImpl` and therefore gets them "for free". + +Example: + +``` +vim lib/perfdata/gelfwriter.ti + + [config] enable_tls; + +vim lib/perfdata/gelfwriter.cpp + + if (GetEnableTls()) { +``` + +The logic is hidden in `tools/mkclass/` in case you want to learn more about it. +The first steps during CMake & make also tell you about code generation. + + +### Build Tool: CMake + +In its early development stages in 2012, Icinga 2 was built with autoconf/automake +and separate Windows project files. We've found this very fragile, and have changed +this into CMake as our build tool. + +The most common benefits: + +* Everything is described in CMakeLists.txt in each directory +* CMake only needs to know that a sub directory needs to be included. +* The global CMakeLists.txt acts as main entry point for requirement checks and library/header includes. +* Separate binary build directories, the actual source tree stays clean. +* CMake automatically generates a Visual Studio project file `icinga2.sln` on Windows. + +### Builds: Unity Builds + +Another thing you should be aware of: Unity builds on and off. + +Typically, we already use caching mechanisms to reduce recompile time with ccache. +For release builds, there's always a new build needed as the difference is huge compared +to a previous (major) release. + +Therefore we've invented the Unity builds, which basically concatenates all source files +into one big library source code file. The compiler then doesn't need to load the many small +files but compiles and links this huge one. + +Unity builds require more memory which is why you should disable them for development +builds in small sized VMs (Linux, Windows) and also Docker containers. + +There's a couple of header files which are included everywhere. If you touch/edit them, +the cache is invalidated and you need to recompile a lot more files then. `base/utility.hpp` +and `remote/zone.hpp` are good candidates for this. + + +### Linux Dev Environment + +Based on CentOS 7, we have an early draft available inside the Icinga Vagrant boxes: +[centos7-dev](https://github.com/Icinga/icinga-vagrant/tree/master/centos7-dev). + +If you're compiling Icinga 2 natively without any virtualization layer in between, +this usually is faster. This is also the reason why developers on macOS prefer native builds +over Linux or Windows VMs. Don't forget to test the actual code on Linux later! Socket specific +stuff like `epoll` is not available on Unix kernels. + +Depending on your workstation and environment, you may either develop and run locally, +use a container deployment pipeline or put everything in a high end resource remote VM. + +#### Prepare Linux Dev Environment + +Create two build directories for different binary builds. + +* `debug` contains the debug build binaries. They contain more debug information and run tremendously slower than release builds from packages. Don't use them for benchmarks. +* `release` contains the release build binaries, as you would install them on a live system. This helps comparing specific scenarios for race conditions and more. + +``` +mkdir -p release debug +``` + +Next, check the required packages to build Icinga 2, and install them. + +CentOS: + +``` + +``` + +Debian/Ubuntu: + +``` + +``` + +##### Debian Stretch + +``` +apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libyajl-dev libedit-dev monitoring-plugins + +ln -s /usr/bin/ccache /usr/local/bin/g++ + +groupadd icinga +groupadd icingacmd +useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga + +git clone https://github.com/icinga/icinga2.git && cd icinga2 + +mkdir debug release +cd debug +cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin +cd .. +make -j2 install -C debug +``` + + +``` +chown -R icinga:icinga /usr/local/icinga2/var/ + +cd /usr/local/icinga2 +./lib/icinga2/prepare-dirs etc/sysconfig/icinga2 +icinga2 api setup +vim etc/icinga2/conf.d/api-users.conf + +gdb --args ./lib/icinga2/sbin/icinga2 daemon +``` + + + +### macOS Dev Environment + +It is advised to use Homebrew to install all required build dependencies. +Macports have been reported to work as well, typically you'll get more help +with Homebrew. + +We will also build two different flavors. + +``` +mkdir -p release debug +``` + + + +### Windows Dev Environment + +The following sections explain how to setup the required build tools +and how to run and debug the code. + +#### Chocolatey + +Open an administrative command prompt (Win key, type “cmd”, right-click and “run as administrator”) and paste the following instructions: + +``` +@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin +``` + +#### Visual Studio + +Thanks to Microsoft they’ll now provide their Professional Edition of Visual Studio 2017 +as community version, free for use for open source projects such as Icinga. +The installation requires ~9GB disk space. [Download](https://www.visualstudio.com/downloads/) +the web installer and start the installation. + +You need a free Microsoft account to download and also store your preferences. + +Choose the following minimal set: + +* .NET Framework 4.x SDK +* C# Compiler +* Visual Studio C++ core features +* VC++ toolset +* Windows 10 SDK (10.0.10240.0 - required) +* Just-in-time debugger +* Windows 8 SDK (includes mscoree.lib required by clrchecktask) +* C++/CLI support +* Windows Universal C Runtime +* Git for Windows +* .NET Framework 3.5 development tools +* Github extension for Visual Studio + +After a while, Visual Studio will be ready. + +#### Flex and Bison + +Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html): + +``` +choco install -y winflexbison +``` + +Chocolatey installs these tools into the hidden directory `C:\ProgramData\chocolatey\lib\winflexbison\tools`. + +#### OpenSSL + +Icinga 2 requires the OpenSSL library. [Download](http://slproweb.com/products/Win32OpenSSL.html) +and install it into the default path. + +Once asked for `Copy OpenSSLs DLLs to` select `The Windows system directory`. That way CMake/Visual Studio +will automatically detect them for builds and packaging. + +> **Note** +> +> We cannot use the chocolatey package as this one does not provide any development headers. +> +> Choose 1.0.2 LTS from manual downloads for best compatibility if unsure. + +#### Boost + +In order to use the boost development header and library files you need to [download](http://www.boost.org/users/download/) +Boost and then extract it to e.g. `C:\boost_1_65_1`. + +> **Note** +> +> Just use `C:`, the zip file already contains the sub folder. Extraction takes a while, +> the archive contains more than 10k files. + +For integrating Boost into Visual Studio 2017, open the `Developer Command Prompt` from the start menu, +and navigate to `C:\boost_1_65_1`. + +Execute `bootstrap.bat` first. + +``` +cd C:\boost_1_65_1 +bootstrap.bat +``` + +Once finished, specify the required `toolset` to compile boost against Visual Studio. +This takes quite some time in a Windows VM. + +Visual Studio 2015: + +``` +b2 --toolset=msvc-14.0 +``` + +Visual Studio 2017: + +``` +b2 --toolset=msvc-14.1 +``` + +#### TortoiseGit + +TortoiseGit provides a graphical integration into the Windows explorer. This makes it easier to checkout, commit +and whatnot. + +[Download](https://tortoisegit.org/download/) TortoiseGit on your system. + +In order to clone via Git SSH you also need to create a new directory called `.ssh` +inside your user's home directory. +Therefore open a command prompt (win key, type `cmd`, enter) and run `mkdir .ssh`. +Add your `id_rsa` private key and `id_rsa.pub` public key files into that directory. + +Start the setup routine and choose `OpenSSH` as default secure transport when asked. + +Open a Windows Explorer window and navigate into + +Version | Project Location +--------------------|------------------------------ +Visual Studio 2015 | `C:\Users\michi\Documents\Visual Studio 2015\Projects` +Visual Studio 2017+ | `C:\Users\michi\source\repos` + +Right click and select `Git Clone` from the context menu. + +Use `ssh://git@github.com/icinga/icinga2.git` for SSH clones, `https://github.com/icinga/icinga2.git` otherwise. + +#### CMake + +Icinga 2 uses CMake to manage the build environment. You can generate the Visual Studio project files +using CMake. [Download](https://cmake.org/download/) and install CMake. Select to add it to PATH for all users +when asked. + +Once setup is completed, open a command prompt and navigate to + +Visual Studio 2015 + +``` +cd C:\Users\\Documents\Visual Studio 2015\Projects\icinga2 +``` + +Visual Studio 2017 + +``` +cd C:\Users\michi\source\repos +``` + +Run CMake with the following command. This generates a new Visual Studio project file called `icinga2.sln`. + +You need to specify the previously installed component paths: + +Variable | Value | Description +----------------------|----------------------------------------------------------------------| +BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. +BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. +FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. +ICINGA2_WITH_MYSQL | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. +ICINGA2_WITH_PGSQL | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. +ICINGA2_UNITY_BUILD | OFF | Disable unity builds for development environments. + +Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables. + +``` +cmake . -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF +``` + +Best is write a small batch/Powershell script which just executes these lines. + + +#### Icinga 2 in Visual Studio + +Navigate to + +Version | Project location +--------------------|------------------------- +Visual Studio 2015 | `C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2` +Visual Studio 2017+ | `C:\Users\michi\source\repos\icinga2` + +Open `icinga2.sln`. Log into Visual Studio when asked. + +On the right panel, select to build the `Bin/icinga-app` solution. + +The executable binaries are located in `Bin\Release\Debug` in your `icinga2` +project directory. + +Navigate there and run `icinga2.exe --version`. + +Example for Visual Studio 2017: + +``` +cd C:\Users\michi\source\repos\icinga2\Bin\Release\Debug +icinga2.exe --version +``` + + +#### Release Package + +CMake uses CPack and NSIS to create the setup executable including all binaries and libraries +in addition to setup dialogues and configuration. Therefore we’ll need to install [NSIS](http://nsis.sourceforge.net/Download) +first. + +We also need to install the Windows Installer XML (WIX) toolset. + +``` +choco install -y wixtoolset +``` + +Once completed open an administrative shell and navigate to your Visual Studio project. +Let CMake to build a release package. + +``` +cd "c:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2" +cmake --build . --target PACKAGE --config Release +``` + +Note: This will still use the debug builds. A yet more clean approach +is to run CMake with changed release parameters beforehand and then +re-run the release package builder. + +``` +C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2> +cmake . -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Release -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF + +cmake --build . --target PACKAGE --config Release +``` + +Again, put these lines into a batch/Powershell script and execute that. + + + +### Embedded Dev Env: Pi + +> **Note** +> +> This isn't officially supported yet, just a few hints how you can do it yourself. + +armhf on Raspberry Pi, ccache: + +``` +apt install -y ccache + +/usr/sbin/update-ccache-symlinks + +echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc + +source ~/.bashrc && echo $PATH +``` + +## Package Builds + +This documentation is explicitly meant for packagers and the Icinga +build infrastructure. + +The following requirements need to be fulfilled in order to build the +Icinga application using a dist tarball (including notes for distributions): + +* cmake >= 2.6 +* GNU make (make) or ninja-build +* C++ compiler which supports C++11 + - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below) + - Debian/Ubuntu: build-essential + - Alpine: build-base + - you can also use clang++ +* pkg-config +* OpenSSL library and header files >= 1.0.1 + - RHEL/Fedora: openssl-devel + - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel) + - Debian/Ubuntu: libssl-dev + - Alpine: libressl-dev +* Boost library and header files >= 1.48.0 + - RHEL/Fedora: boost148-devel + - Debian/Ubuntu: libboost-all-dev + - Alpine: boost-dev +* GNU bison (bison) +* GNU flex (flex) >= 2.5.35 +* Systemd headers + - Only required when using Systemd + - Debian/Ubuntu: libsystemd-dev + - RHEL/Fedora: systemd-devel + +### Optional features + +* MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) + - RHEL/Fedora: mysql-devel + - SUSE: libmysqlclient-devel + - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev + - Alpine: mariadb-dev +* PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`) + - RHEL/Fedora: postgresql-devel + - Debian/Ubuntu: libpq-dev + - postgresql-dev on Alpine +* YAJL (Faster JSON library) + - RHEL/Fedora: yajl-devel + - Debian: libyajl-dev + - Alpine: yajl-dev +* libedit (CLI console) + - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms) + - Debian/Ubuntu/Alpine: libedit-dev +* Termcap (only required if libedit doesn't already link against termcap/ncurses) + - RHEL/Fedora: libtermcap-devel + - Debian/Ubuntu: (not necessary) + +### Special requirements + +**FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) + +**RHEL6**: Requires a newer boost version which is available on packages.icinga.com +with a version suffixed name. + +### Runtime user environment + +By default Icinga will run as user `icinga` and group `icinga`. Additionally the +external command pipe and livestatus features require a dedicated command group +`icingacmd`. You can choose your own user/group names and pass them to CMake +using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. + +``` +# groupadd icinga +# groupadd icingacmd +# useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga +``` + +On Alpine (which uses ash busybox) you can run: + +``` +# addgroup -S icinga +# addgroup -S icingacmd +# adduser -S -D -H -h /var/spool/icinga2 -s /sbin/nologin -G icinga -g icinga icinga +# adduser icinga icingacmd +``` + +Add the web server user to the icingacmd group in order to grant it write +permissions to the external command pipe and livestatus socket: +``` +# usermod -a -G icingacmd www-data +``` + +Make sure to replace "www-data" with the name of the user your web server +is running as. + +### Building Icinga 2: Example + +Once you have installed all the necessary build requirements you can build +Icinga 2 using the following commands: + +``` +$ mkdir release && cd release +$ cmake .. +$ cd .. +$ make -C release +$ make install -C release +``` + +You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`: + +``` +$ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 +``` + +### CMake Variables + +In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. + +For all variables regarding defaults paths on in CMake, see +[GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html). + +Also see `CMakeLists.txt` for details. + +**System Environment** +- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` +- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` +- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2` +- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2` +- `ICINGA2_DATADIR`: Data directory for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2` +- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2` +- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2` +- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2` +- `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON` +- `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga` +- `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga` +- `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd` +- `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from; + defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2` +- `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` + +**Build Optimization** +- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware. +- `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF` + +**Init System** +- `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF` +- `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file + and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set. + Only use this for special packaging purposes and if you know what you are doing. + Defaults to `OFF`. + +**Features:** +- `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON` +- `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON` +- `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF` +- `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF` +- `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON` +- `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON` +- `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON` +- `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON` + +**MySQL or MariaDB:** + +The following settings can be tuned for the MySQL / MariaDB IDO feature. + +- `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON` +- `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient` +- `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty - + checking multiple paths like `/usr/include/mysql` + +See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation. + +**PostgreSQL:** + +The following settings can be tuned for the PostgreSQL IDO feature. + +- `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON` +- `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories +- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file) + +See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation. + +**Version detection:** + +CMake determines the Icinga 2 version number using `git describe` if the +source directory is contained in a Git repository. Otherwise the version number +is extracted from the [VERSION](VERSION) file. This behavior can be +overridden by creating a file called `icinga-version.h.force` in the source +directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake +can be used to disable the usage of `git describe`. + + +### Building RPMs + +#### Build Environment on RHEL, CentOS, Fedora, Amazon Linux + +Setup your build environment: +``` +yum -y install rpmdevtools +``` + +#### Build Environment on SuSE/SLES + +SLES: +``` +zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP3/devel:tools.repo +zypper refresh +zypper install rpmdevtools spectool +``` + +OpenSuSE: +``` +zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_15.0/devel:tools.repo +zypper refresh +zypper install rpmdevtools spectool +``` + +#### Package Builds + +Prepare the rpmbuild directory tree: +``` +cd $HOME +rpmdev-setuptree +``` + +Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: +``` +curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec +``` + +> **Note** +> +> The above command builds snapshot packages. Change to the `release` branch +> for release package builds. + +Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary +provided with `rpmdevtools`: +``` +cd $HOME/rpmbuild/SOURCES +spectool -g ../SPECS/icinga2.spec + +cd $HOME/rpmbuild +``` + +Install the build dependencies. Example for CentOS 7: +``` +yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ +cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ +selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc +``` + +Note: If you are using Amazon Linux, systemd is not required. + +A shorter way is available using the `yum-builddep` command on RHEL based systems: +``` +yum-builddep SPECS/icinga2.spec +``` + +Build the RPM: +``` +rpmbuild -ba SPECS/icinga2.spec +``` + +#### Additional Hints + +##### SELinux policy module + +The following packages are required to build the SELinux policy module: + +* checkpolicy +* selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7) +* selinux-policy-doc + +##### RHEL/CentOS 6 + +The RedHat Developer Toolset is required for building Icinga 2 beforehand. +This contains a modern version of flex and a C++ compiler which supports +C++11 features. +``` +cat >/etc/yum.repos.d/devtools-2.repo <$HOME/.rpmmacros < **WARNING:** This information is outdated! + +Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from +the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) +into your source tree and run the following command: +``` +$ dpkg-buildpackage -uc -us +``` + +## Build Alpine Linux packages + +A simple way to setup a build environment is installing Alpine in a chroot. +In this way, you can set up an Alpine build environment in a chroot under a +different Linux distro. +There is a script that simplifies these steps with just two commands, and +can be found [here](https://github.com/alpinelinux/alpine-chroot-install). + +Once the build environment is installed, you can setup the system to build +the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). + +# Build Post Install Tasks + +After building Icinga 2 yourself, your package build system should at least run the following post +install requirements: + +* enable the `checker`, `notification` and `mainlog` feature by default +* run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node + +## Run Icinga 2 + +Icinga 2 comes with a binary that takes care of loading all the relevant +components (e.g. for check execution, notifications, etc.): +``` +# icinga2 daemon +[2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) +[2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). +[2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). +... +``` + +### Init Script + +Icinga 2 can be started as a daemon using the provided init script: +``` +# /etc/init.d/icinga2 +Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} +``` + +### Systemd + +If your distribution uses Systemd: +``` +# systemctl {start|stop|reload|status|enable|disable} icinga2 +``` + +In case the distribution is running Systemd >227, you'll also +need to package and install the `etc/initsystem/icinga2.service.limits.conf` +file into `/etc/systemd/system/icinga2.service.d`. + +### openrc + +Or if your distribution uses openrc (like Alpine): +``` +# rc-service icinga2 +Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} + ``` + +Note: the openrc's init.d is not shipped by default. +A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. +Those few steps can be followed: +``` +# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd +# mv icinga2.initd /etc/init.d/icinga2 +# chmod +x /etc/init.d/icinga2 +``` + +Icinga 2 reads a single configuration file which is used to specify all +configuration settings (global settings, hosts, services, etc.). The +configuration format is explained in detail in the [doc/](doc/) directory. + +By default `make install` installs example configuration files in +`/usr/local/etc/icinga2` unless you have specified a different prefix or +sysconfdir. + + +### Windows + +The Windows MSI packages are located at https://packages.icinga.com/windows/ + +#### Requirements + +* 32 or 64-bit system +* Visual Studio >= 14 2015 +* CMake >= 2.6 +* OpenSSL >= 1.0.1 +* Flex and Bison + +##### Visual Studio + +Download the community edition from [visualstudio.com](https://www.visualstudio.com/en/downloads/) + +Workloads to install: +* C++ Desktop +* .NET Desktop + +##### OpenSSL for Icinga + +Download custom OpenSSL builds from [openssl-windows GitHub project](https://github.com/Icinga/openssl-windows/releases). + +You need to install a binary dist version to 'C:\\Program Files\\OpenSSL'. + +The Powershell script `.\tools\win32\download-openssl.ps1` can be used for automated downloads. + +##### Chocolatey + +A simple package manager for Windows, please see [install instructions](https://chocolatey.org/install). + +##### Git + +Use Chocolatey, see [package details](https://chocolatey.org/packages/git). + +``` +choco install git +``` + +##### Flex / Bison + +Use Chocolatey, see [package details](https://chocolatey.org/packages/winflexbison3). + +``` +choco install winflexbison3 +``` + +##### CMake + +Use Chocolatey, see [package details](https://chocolatey.org/packages/cmake) +or download from: [cmake.org](https://cmake.org/download/) + +``` +choco install cmake +``` + +##### WIX + +Use Chocolatey, see [package details](https://chocolatey.org/packages/wixtoolset). + +``` +choco install wixtoolset +``` + +##### Boost + +Download third party Windows binaries from: [boost.org](http://www.boost.org/users/download/) + +For example: `https://dl.bintray.com/boostorg/release/1.65.1/binaries/boost_1_65_1-msvc-14.1-64.exe` + +*Warning:* +* Must match your Visual Studio version! +* CMake might not support the latest Boost version (we used CMake 3.10 and Boost 1_65_1) + +Run the installer exe. + + +#### Build Icinga 2 + +Run with VC Native x64 Command Prompt: + +``` +powershell .\tools\win32\configure.ps1 +powershell .\tools\win32\build.ps1 +powershell .\tools\win32\test.ps1 +``` + +See these scripts for details. + +#### CI: AppVeyor + +We are building [Icinga 2 with AppVeyor](https://ci.appveyor.com/project/icinga/icinga2) for testing and CI integration. + +Please check `appveyor.yml` for instructions. + + + +## Advanced Development Tips + +### GDB Pretty Printers Install the `boost`, `python` and `icinga2` pretty printers. Absolute paths are required, so please make sure to update the installation paths accordingly (`pwd`). @@ -118,217 +1444,20 @@ the duplicate import in your `~/.gdbinit` file. RuntimeError: pretty-printer already registered: libstdc++-v6 -### GDB Run -Call GDB with the binary (`/usr/sbin/icinga2` is a wrapper script calling -`/usr/lib64/icinga2/sbin/icinga2` since 2.4) and all arguments and run it in foreground. +## Development Tests - # gdb --args /usr/lib64/icinga2/sbin/icinga2 daemon -x debug --no-stack-rlimit +Build the binaries and run the tests. -The exact path to the Icinga 2 binary differs on each distribution. On Ubuntu -it is installed into `/usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2` on 64-bit systems -for example. - -> **Note** -> -> If gdb tells you it's missing debug symbols, quit gdb and install -> them: `Missing separate debuginfos, use: debuginfo-install ...` - -Run the application. - - (gdb) r - -Kill the running application. - - (gdb) k - -Continue after breakpoint. - - (gdb) c - -### GDB Core Dump - -Either attach to the running process using `gdb -p PID` or start -a new gdb run. - - (gdb) r - (gdb) generate-core-file - -### GDB Backtrace - -If Icinga 2 aborted its operation abnormally, generate a backtrace. - - (gdb) bt - (gdb) thread apply all bt full - -If gdb stops at a SIGPIPE signal please disable the signal before -running Icinga 2. - - (gdb) handle SIGPIPE nostop noprint pass - (gdb) r - -If you create a [new issue](https://github.com/Icinga/icinga2/issues), -make sure to attach as much detail as possible. - -### GDB Backtrace from Running Process - -If Icinga 2 is still running, generate a full backtrace from the running -process and store it into a new file (e.g. for debugging dead locks): - -Icinga 2 runs with 2 processes, therefore generate two backtrace logs -and add them to the GitHub issue. ``` -for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done +make -j4 -C debug +make test -C debug ``` -### GDB Thread List from Running Process - -Instead of a full backtrace, you sometimes just need a list of running threads. +Run a specific boost test: ``` -for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done +debug/Bin/Debug/boosttest-test-base --run_test=remote_url ``` -### GDB Backtrace Stepping - -Identifying the problem may require stepping into the backtrace, analysing -the current scope, attributes, and possible unmet requirements. `p` prints -the value of the selected variable or function call result. - - (gdb) up - (gdb) down - (gdb) p checkable - (gdb) p checkable.px->m_Name - - -### GDB Breakpoints - -To set a breakpoint to a specific function call, or file specific line. - - (gdb) b checkable.cpp:125 - (gdb) b icinga::Checkable::SetEnablePerfdata - -GDB will ask about loading the required symbols later, select `yes` instead -of `no`. - -Then run Icinga 2 until it reaches the first breakpoint. Continue with `c` -afterwards. - - (gdb) run - (gdb) c - -If you want to delete all breakpoints, use `d` and select `yes`. - - (gdb) d - -> **Tip** -> -> When debugging exceptions, set your breakpoint like this: `b __cxa_throw`. - -Breakpoint Example: - - (gdb) b __cxa_throw - (gdb) r - (gdb) up - .... - (gdb) up - #11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function const&, int) (path=..., pattern=..., callback=..., type=1) - at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609 - 609 callback(cpath); - (gdb) l - 604 - 605 #endif /* _WIN32 */ - 606 - 607 std::sort(files.begin(), files.end()); - 608 BOOST_FOREACH(const String& cpath, files) { - 609 callback(cpath); - 610 } - 611 - 612 std::sort(dirs.begin(), dirs.end()); - 613 BOOST_FOREACH(const String& cpath, dirs) { - (gdb) p files - $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}} - - -## Core Dump - -When the Icinga 2 daemon crashes with a `SIGSEGV` signal -a core dump file should be written. This will help -developers to analyze and fix the problem. - -### Core Dump File Size Limit - -This requires setting the core dump file size to `unlimited`. - -Example for Systemd: - - vim /usr/lib/systemd/system/icinga2.service - - [Service] - ... - LimitCORE=infinity - - systemctl daemon-reload - - systemctl restart icinga2 - -Example for init script: - - vim /etc/init.d/icinga2 - ... - ulimit -c unlimited - - service icinga2 restart - -Verify that the Icinga 2 process core file size limit is set to `unlimited`. - - cat /proc/`pidof icinga2`/limits - ... - Max core file size unlimited unlimited bytes - - -### Core Dump Kernel Format - -The Icinga 2 daemon runs with the SUID bit set. Therefore you need -to explicitly enable core dumps for SUID on Linux. - - sysctl -w fs.suid_dumpable=1 - -Adjust the coredump kernel format and file location on Linux: - - sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p - - install -m 1777 -d /var/lib/cores - -MacOS: - - sysctl -w kern.corefile=/cores/core.%P - - chmod 777 /cores - -### Core Dump Analysis - -Once Icinga 2 crashes again a new coredump file will be written. Please -attach this file to your bug report in addition to the general details. - -Simple test case for a `SIGSEGV` simulation with `sleep`: - - ulimit -c unlimited - sleep 1800& - [1] - kill -SEGV - gdb `which sleep` /var/lib/cores/core.sleep. - (gdb) bt - rm /var/lib/cores/core.sleep.* - -Analyzing Icinga 2: - - gdb /usr/lib64/icinga2/sbin/icinga2 core.icinga2. - (gdb) bt - From c6fc144102eada72ff8146f4be00fd48ceb0d423 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:49:42 +0100 Subject: [PATCH 0345/1162] Docs: Delete extra docs for windows builds This should be visible in icinga.com/docs, no extra docs needed. --- BUILD_WINDOWS.md | 103 ----------------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 BUILD_WINDOWS.md diff --git a/BUILD_WINDOWS.md b/BUILD_WINDOWS.md deleted file mode 100644 index 28e75259e..000000000 --- a/BUILD_WINDOWS.md +++ /dev/null @@ -1,103 +0,0 @@ -# Build Icinga 2 on Windows - -The Icinga Project is providing Windows MSI packages under https://packages.icinga.com/windows/ - -> **Note:** -> This is a developer documentation on how to build Icinga 2 on Windows! - -Also see [INSTALL.md](INSTALL.md) for Linux build instructions. - -## Requirements - -* 32 or 64-bit system -* Visual Studio >= 14 2015 -* CMake >= 2.6 -* OpenSSL >= 1.0.1 -* Flex and Bison - -## Install Requirements - -**Visual Studio** - -Download from [visualstudio.com](https://www.visualstudio.com/en/downloads/) - -The Community Edition is available for free, and is what we use to build. - -Workloads to install: -* C++ Desktop -* .NET Desktop - -**OpenSSL for Icinga** - -See our [openssl-windows GitHub project](https://github.com/Icinga/openssl-windows). - -You will need to install a binary dist version to 'C:\\Program Files\\OpenSSL'. - -There is a Powershell script to help you downloading: `.\tools\win32\download-openssl.ps1` - -**Chocolatey** - -A simple package manager for Windows, please see [install instructions](https://chocolatey.org/install). - -**Git** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/git). - -``` -choco install git -``` - -**Flex / Bison** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/winflexbison3). - -``` -choco install winflexbison3 -``` - -**CMake** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/cmake) -or download from: [cmake.org](https://cmake.org/download/) - -``` -choco install cmake -``` - -**WIX** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/wixtoolset). - -``` -choco install wixtoolset -``` - -**Boost** - -Download third party Windows binaries from: [boost.org](http://www.boost.org/users/download/) - -For example: `https://dl.bintray.com/boostorg/release/1.65.1/binaries/boost_1_65_1-msvc-14.1-64.exe` - -*Warnings:* -* Must match your Visual Studio version! -* CMake might not support the latest Boost version (we used CMake 3.10 and Boost 1_65_1) - -Run the installer exe. - -## Build Icinga 2 - -Run with VC Native x64 Command Prompt: - -``` -powershell .\tools\win32\configure.ps1 -powershell .\tools\win32\build.ps1 -powershell .\tools\win32\test.ps1 -``` - -See these scripts for details. - -## AppVeyor - -We are building [Icinga 2 with AppVeyor](https://ci.appveyor.com/project/icinga/icinga2) for testing and CI integration. - -Please check `appveyor.yml` for our instructions. From 3827e15c4abf49b4ecdbd23d36e76cb4fdab67a0 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:50:39 +0100 Subject: [PATCH 0346/1162] Docs: Simplify INSTALL.md and point to icinga.com/docs --- INSTALL.md | 396 +---------------------------------------------------- 1 file changed, 2 insertions(+), 394 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index e0573e0ec..d6121e999 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,398 +16,6 @@ not use the official packages it is advisable to build your own Debian or RPM packages. You can use the source packages from [packages.icinga.com](https://packages.icinga.com) for this purpose. -> **Disclaimer** -> -> This information is intended for developers and packagers. It might be incomplete or unclear -> in some cases. Ensure to check our [packaging scripts on GitHub](https://github.com/Icinga/icinga-packaging) too! +For a more detailed introduction into developing Icinga and building +packages, please visit the [online documentation](https://icinga.com/docs/icinga2/latest/doc/21-development/). -# Build Requirements - -The following requirements need to be fulfilled in order to build the -application using a dist tarball (including notes for distributions): - -* cmake >= 2.6 -* GNU make (make) or ninja-build -* C++ compiler which supports C++11 - - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below) - - Debian/Ubuntu: build-essential - - Alpine: build-base - - you can also use clang++ -* pkg-config -* OpenSSL library and header files >= 1.0.1 - - RHEL/Fedora: openssl-devel - - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel) - - Debian/Ubuntu: libssl-dev - - Alpine: libressl-dev -* Boost library and header files >= 1.48.0 - - RHEL/Fedora: boost148-devel - - Debian/Ubuntu: libboost-all-dev - - Alpine: boost-dev -* GNU bison (bison) -* GNU flex (flex) >= 2.5.35 -* Systemd headers - - Only required when using Systemd - - Debian/Ubuntu: libsystemd-dev - - RHEL/Fedora: systemd-devel - -## Optional features - -* MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) - - RHEL/Fedora: mysql-devel - - SUSE: libmysqlclient-devel - - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev - - Alpine: mariadb-dev -* PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`) - - RHEL/Fedora: postgresql-devel - - Debian/Ubuntu: libpq-dev - - postgresql-dev on Alpine -* YAJL (Faster JSON library) - - RHEL/Fedora: yajl-devel - - Debian: libyajl-dev - - Alpine: yajl-dev -* libedit (CLI console) - - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms) - - Debian/Ubuntu/Alpine: libedit-dev -* Termcap (only required if libedit doesn't already link against termcap/ncurses) - - RHEL/Fedora: libtermcap-devel - - Debian/Ubuntu: (not necessary) - -## Special requirements - -**FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) - -**RHEL6**: Requires a newer boost version which is available on packages.icinga.com -with a version suffixed name. - -## Runtime user environment - -By default Icinga will run as user `icinga` and group `icinga`. Additionally the -external command pipe and livestatus features require a dedicated command group -`icingacmd`. You can choose your own user/group names and pass them to CMake -using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. - -``` -# groupadd icinga -# groupadd icingacmd -# useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga -``` - -On Alpine (which uses ash busybox) you can run: - -``` -# addgroup -S icinga -# addgroup -S icingacmd -# adduser -S -D -H -h /var/spool/icinga2 -s /sbin/nologin -G icinga -g icinga icinga -# adduser icinga icingacmd -``` - -Add the web server user to the icingacmd group in order to grant it write -permissions to the external command pipe and livestatus socket: -``` -# usermod -a -G icingacmd www-data -``` - -Make sure to replace "www-data" with the name of the user your web server -is running as. - -# Building Icinga 2 - -Once you have installed all the necessary build requirements you can build -Icinga 2 using the following commands: - -``` -$ mkdir release && cd release -$ cmake .. -$ cd .. -$ make -C release -$ make install -C release -``` - -You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`: - -``` -$ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 -``` - -## CMake Variables - -In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. - -For all variables regarding defaults paths on in CMake, see -[GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html). - -Also see `CMakeLists.txt` for details. - -**System Environment** -- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` -- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` -- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2` -- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2` -- `ICINGA2_DATADIR`: Data directory for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2` -- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2` -- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2` -- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2` -- `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON` -- `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga` -- `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga` -- `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd` -- `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from; - defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2` -- `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` - -**Build Optimization** -- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware. -- `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF` - -**Init System** -- `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF` -- `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file - and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set. - Only use this for special packaging purposes and if you know what you are doing. - Defaults to `OFF`. - -**Features:** -- `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON` -- `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON` -- `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF` -- `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF` -- `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON` -- `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON` -- `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON` -- `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON` - -**MySQL or MariaDB:** - -The following settings can be tuned for the MySQL / MariaDB IDO feature. - -- `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON` -- `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient` -- `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty - - checking multiple paths like `/usr/include/mysql` - -See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation. - -**PostgreSQL:** - -The following settings can be tuned for the PostgreSQL IDO feature. - -- `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON` -- `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories -- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file) - -See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation. - -**Version detection:** - -CMake determines the Icinga 2 version number using `git describe` if the -source directory is contained in a Git repository. Otherwise the version number -is extracted from the [VERSION](VERSION) file. This behavior can be -overridden by creating a file called `icinga-version.h.force` in the source -directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake -can be used to disable the usage of `git describe`. - -# Building packages - -> **WARNING:** Some of this information is outdated! - -## Building RPMs - -### Build Environment on RHEL, CentOS, Fedora, Amazon Linux - -Setup your build environment: -``` -yum -y install rpmdevtools -``` - -### Build Environment on SuSE/SLES - -SLES: -``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP2/devel:tools.repo -zypper refresh -zypper install rpmdevtools spectool -``` - -OpenSuSE: -``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_42.3/devel:tools.repo -zypper refresh -zypper install rpmdevtools spectool -``` - -### Package Builds - -Prepare the rpmbuild directory tree: -``` -cd $HOME -rpmdev-setuptree -``` - -Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: -``` -curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec -``` - -> **Note** -> -> The above command builds snapshot packages. Change to the `release` branch -> for release package builds. - -Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary -provided with `rpmdevtools`: -``` -cd $HOME/rpmbuild/SOURCES -spectool -g ../SPECS/icinga2.spec - -cd $HOME/rpmbuild -``` - -Install the build dependencies. Example for CentOS 7: -``` -yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ -cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ -selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc -``` - -Note: If you are using Amazon Linux, systemd is not required. - -A shorter way is available using the `yum-builddep` command on RHEL based systems: -``` -yum-builddep SPECS/icinga2.spec -``` - -Build the RPM: -``` -rpmbuild -ba SPECS/icinga2.spec -``` - -### Additional Hints - -#### SELinux policy module - -The following packages are required to build the SELinux policy module: - -* checkpolicy -* selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7) -* selinux-policy-doc - -#### RHEL/CentOS 6 - -The RedHat Developer Toolset is required for building Icinga 2 beforehand. -This contains a modern version of flex and a C++ compiler which supports -C++11 features. -``` -cat >/etc/yum.repos.d/devtools-2.repo <$HOME/.rpmmacros < **WARNING:** This information is outdated! - -Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from -the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) -into your source tree and run the following command: -``` -$ dpkg-buildpackage -uc -us -``` - -## Build Alpine Linux packages - -A simple way to setup a build environment is installing Alpine in a chroot. -In this way, you can set up an Alpine build environment in a chroot under a -different Linux distro. -There is a script that simplifies these steps with just two commands, and -can be found [here](https://github.com/alpinelinux/alpine-chroot-install). - -Once the build environment is installed, you can setup the system to build -the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). - -# Build Post Install Tasks - -After building Icinga 2 yourself, your package build system should at least run the following post -install requirements: - -* enable the `checker`, `notification` and `mainlog` feature by default -* run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node - -## Run Icinga 2 - -Icinga 2 comes with a binary that takes care of loading all the relevant -components (e.g. for check execution, notifications, etc.): -``` -# icinga2 daemon -[2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) -[2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). -[2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). -... -``` - -### Init Script - -Icinga 2 can be started as a daemon using the provided init script: -``` -# /etc/init.d/icinga2 -Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} -``` - -### Systemd - -If your distribution uses Systemd: -``` -# systemctl {start|stop|reload|status|enable|disable} icinga2 -``` - -In case the distribution is running Systemd >227, you'll also -need to package and install the `etc/initsystem/icinga2.service.limits.conf` -file into `/etc/systemd/system/icinga2.service.d`. - -### openrc - -Or if your distribution uses openrc (like Alpine): -``` -# rc-service icinga2 -Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} - ``` - -Note: the openrc's init.d is not shipped by default. -A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. -Those few steps can be followed: -``` -# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd -# mv icinga2.initd /etc/init.d/icinga2 -# chmod +x /etc/init.d/icinga2 -``` - -Icinga 2 reads a single configuration file which is used to specify all -configuration settings (global settings, hosts, services, etc.). The -configuration format is explained in detail in the [doc/](doc/) directory. - -By default `make install` installs example configuration files in -`/usr/local/etc/icinga2` unless you have specified a different prefix or -sysconfdir. From ec39a74453f673032cd52edb29eb747d80cb5fe9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:11:16 +0100 Subject: [PATCH 0347/1162] Docs: More updates on dev environments, add mini TOC --- doc/21-development.md | 297 +++++++++++++++++++++++++++++++++++------- 1 file changed, 250 insertions(+), 47 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1ff183434..ff672fe1e 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1,7 +1,17 @@ # Development -This chapter provides hints on Icinga 2 development -and debugging. +This chapter provides hints on Icinga 2 debugging, +development, package builds and tests. + +* [Debug Icinga 2](#development-debug) +* [Develop Icinga 2](#development-develop) + * [Linux Dev Environment](#development-linux-dev-env) + * [macOS Dev Environment](#development-macos-dev-env) + * [Windows Dev Environment](#development-windows-dev-env) +* [Package Builds](#development-package-builds) +* [Advanced Tips](#development-advanced) +* [Tests](#development-tests) + ## Debug Icinga 2 @@ -348,6 +358,13 @@ In order to run Icinga 2 with LLDB you need to pass the binary as argument. lldb -- /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` +Breakpoint: + +``` +> b checkable.cpp:57 +> b icinga::Checkable::ProcessCheckResult +``` + Full backtrace: ``` @@ -494,6 +511,8 @@ db\_ido\_pgsql | IDO database driver for PgSQL. mysql\_shin | Library stub for linking against the MySQL client libraries. pgsql\_shim | Library stub for linking against the PgSQL client libraries. +#### Class Compiler + Another thing you will recognize are the `.ti` files which are compiled by our own class compiler into actual source code. The meta language allows developers to easily add object attributes and specify their behaviour. @@ -570,7 +589,7 @@ stuff like `epoll` is not available on Unix kernels. Depending on your workstation and environment, you may either develop and run locally, use a container deployment pipeline or put everything in a high end resource remote VM. -#### Prepare Linux Dev Environment +Fork https://github.com/Icinga/icinga2 into your own repository, e.g. `https://github.com/dnsmichi/icinga2`. Create two build directories for different binary builds. @@ -581,25 +600,55 @@ Create two build directories for different binary builds. mkdir -p release debug ``` -Next, check the required packages to build Icinga 2, and install them. +Proceed with the specific distribution examples below. -CentOS: +* [CentOS 7](#development-linux-dev-env-centos) +* [Debian 9](#development-linux-dev-env-debian) + +#### CentOS 7 + +``` +yum -y install gdb git bash-completion htop rpmdevtools \ + ccache cmake make gcc-c++ flex bison \ + openssl-devel boost-devel systemd-devel mysql-devel \ + postgresql-devel libedit-devel libstdc++-devel + +groupadd icinga +groupadd icingacmd +useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga + +ln -s /bin/ccache /usr/local/bin/gcc +ln -s /bin/ccache /usr/local/bin/g++ + +git clone https://github.com/icinga/icinga2.git && cd icinga2 + +mkdir debug release +cd debug +cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin +cd .. +make -j2 install -C debug +``` + + +``` +chown -R icinga:icinga /usr/local/icinga2/var/ + +/usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2 +/usr/local/icinga2/sbin/icinga2 api setup +vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf + +gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` ``` -Debian/Ubuntu: - -``` - -``` - -##### Debian Stretch +##### Debian 9 ``` apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libyajl-dev libedit-dev monitoring-plugins +ln -s /usr/bin/ccache /usr/local/bin/gcc ln -s /usr/bin/ccache /usr/local/bin/g++ groupadd icinga @@ -619,31 +668,154 @@ make -j2 install -C debug ``` chown -R icinga:icinga /usr/local/icinga2/var/ -cd /usr/local/icinga2 -./lib/icinga2/prepare-dirs etc/sysconfig/icinga2 -icinga2 api setup -vim etc/icinga2/conf.d/api-users.conf +/usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2 +/usr/local/icinga2/sbin/icinga2 api setup +vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf -gdb --args ./lib/icinga2/sbin/icinga2 daemon +gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` ### macOS Dev Environment -It is advised to use Homebrew to install all required build dependencies. +It is advised to use Homebrew to install required build dependencies. Macports have been reported to work as well, typically you'll get more help -with Homebrew. +with Homebrew from Icinga developers. -We will also build two different flavors. +#### Users and Groups + +First off, create the following from `Settings - Users & Groups`: + +* Users: `icinga` +* Groups: `icinga` with `icinga` as member +* Groups: `icingaweb2` + +Then disallow login for these users. + +``` +dscl +list Local/Default/Users +read Local/Default/Users/icinga +change Local/Default/Users/icinga UserShell /bin/bash /usr/bin/false +sudo dscl . create /Users/icinga IsHidden 1 +sudo dseditgroup -o edit -a _www -t user icingaweb2 +``` + +#### Requirements + +OpenSSL 1.0.x doesn't build anymore, so we're explicitly using 1.1.x here. + +``` +brew install ccache boost cmake bison flex yajl openssl@1.1 mysql-connector-c++ postgresql libpq +``` + +##### ccache + +``` +sudo mkdir /opt/ccache + +sudo ln -s `which ccache` /opt/ccache/clang +sudo ln -s `which ccache` /opt/ccache/clang++ + +vim $HOME/.bashrc + +# ccache is managed with symlinks to avoid collision with cgo +export PATH="/opt/ccache:$PATH" + +source $HOME/.bashrc +``` + +#### Builds + +We will build two different flavors on macOS. ``` mkdir -p release debug + +cd debug +cmake -DICINGA2_UNITY_BUILD=OFF -DICINGA2_WITH_STUDIO=ON -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib .. +cd .. + +make -j4 -C debug +sudo make -j4 install -C debug +``` + +##### Build Aliases + +This is derived from dnsmichi's flavour and not generally best practice. + +``` +vim $HOME/.bashrc + +export PATH=/usr/local/icinga2/sbin/:$PATH +source /usr/local/icinga2/etc/bash_completion.d/icinga2 + +export I2_GENERIC="-DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib -DICINGA2_PLUGINDIR=/usr/local/sbin" + +export I2_DEBUG="-DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF $I2_GENERIC" +export I2_RELEASE="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DICINGA2_WITH_TESTS=ON -DICINGA2_UNITY_BUILD=ON $I2_GENERIC" + +alias i2_debug="mkdir -p debug; cd debug; cmake $I2_DEBUG ..; make -j4; sudo make -j4 install; cd .." +alias i2_release="mkdir -p release; cd release; cmake $I2_RELEASE ..; make -j4; sudo make -j4 install; cd .." + +source $HOME/.bashrc +``` + +#### Run + +``` +chown -R icinga:icinga /usr/local/icinga2 +chown -R icinga:_www /usr/local/icinga2/var/run/icinga2/cmd + +icinga2 daemon +``` + +#### Plugins + +``` +brew install nagios-plugins + +sudo vim /usr/local/icinga2/etc/icinga2/constants.conf +const PluginDir = "/usr/local/sbin" +``` + +#### Databases: MariaDB + +``` +brew install mariadb +ln -sfv /usr/local/opt/mariadb/*.plist ~/Library/LaunchAgents +launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist +mysql_secure_installation +``` + +``` +vim $HOME/.my.cnf + +[client] +user = root +password = supersecurerootpassword + +sudo -i +ln -s /Users/michi/.my.cnf $HOME/.my.cnf +exit +``` + +``` +cd $HOME/coding/icinga/icinga2 + +sudo mysql + +CREATE DATABASE icinga; +GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga'; +quit +sudo mysql icinga < lib/db_ido_mysql/schema/mysql.sql ``` -### Windows Dev Environment + +### Windows Dev Environment The following sections explain how to setup the required build tools and how to run and debug the code. @@ -791,7 +963,7 @@ Run CMake with the following command. This generates a new Visual Studio project You need to specify the previously installed component paths: Variable | Value | Description -----------------------|----------------------------------------------------------------------| +----------------------|----------------------------------------------------------------------|------------------------------------------------------- BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. @@ -875,7 +1047,9 @@ Again, put these lines into a batch/Powershell script and execute that. > > This isn't officially supported yet, just a few hints how you can do it yourself. -armhf on Raspberry Pi, ccache: +The following examples source from armhf on Raspberry Pi. + +#### ccache ``` apt install -y ccache @@ -887,6 +1061,20 @@ echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc source ~/.bashrc && echo $PATH ``` +#### Build + +Copy the icinga2 source code into `$HOME/icinga2`. Clone the `deb-icinga2` repository into `debian/`. + +``` +git clone https://github.com/Icinga/icinga2 $HOME/icinga2 +git clone https://github.com/Icinga/deb-icinga2 $HOME/icinga2/debian +``` + +Then build a Debian package and install it like normal. +``` +dpkg-buildpackage -uc -us +``` + ## Package Builds This documentation is explicitly meant for packagers and the Icinga @@ -919,7 +1107,7 @@ Icinga application using a dist tarball (including notes for distributions): - Debian/Ubuntu: libsystemd-dev - RHEL/Fedora: systemd-devel -### Optional features +### Optional features * MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) - RHEL/Fedora: mysql-devel @@ -941,14 +1129,14 @@ Icinga application using a dist tarball (including notes for distributions): - RHEL/Fedora: libtermcap-devel - Debian/Ubuntu: (not necessary) -### Special requirements +### Special requirements **FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) **RHEL6**: Requires a newer boost version which is available on packages.icinga.com with a version suffixed name. -### Runtime user environment +### Runtime user environment By default Icinga will run as user `icinga` and group `icinga`. Additionally the external command pipe and livestatus features require a dedicated command group @@ -972,6 +1160,7 @@ On Alpine (which uses ash busybox) you can run: Add the web server user to the icingacmd group in order to grant it write permissions to the external command pipe and livestatus socket: + ``` # usermod -a -G icingacmd www-data ``` @@ -979,7 +1168,7 @@ permissions to the external command pipe and livestatus socket: Make sure to replace "www-data" with the name of the user your web server is running as. -### Building Icinga 2: Example +### Building Icinga 2: Example Once you have installed all the necessary build requirements you can build Icinga 2 using the following commands: @@ -998,7 +1187,7 @@ You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX $ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 ``` -### CMake Variables +### CMake Variables In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. @@ -1076,11 +1265,12 @@ directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake can be used to disable the usage of `git describe`. -### Building RPMs +### Building RPMs #### Build Environment on RHEL, CentOS, Fedora, Amazon Linux Setup your build environment: + ``` yum -y install rpmdevtools ``` @@ -1088,28 +1278,32 @@ yum -y install rpmdevtools #### Build Environment on SuSE/SLES SLES: + ``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP3/devel:tools.repo +zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP4/devel:tools.repo zypper refresh zypper install rpmdevtools spectool ``` OpenSuSE: + ``` zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_15.0/devel:tools.repo zypper refresh zypper install rpmdevtools spectool ``` -#### Package Builds +#### Package Builds Prepare the rpmbuild directory tree: + ``` cd $HOME rpmdev-setuptree ``` -Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: +Snapshot builds: + ``` curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec ``` @@ -1121,6 +1315,7 @@ curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary provided with `rpmdevtools`: + ``` cd $HOME/rpmbuild/SOURCES spectool -g ../SPECS/icinga2.spec @@ -1129,6 +1324,7 @@ cd $HOME/rpmbuild ``` Install the build dependencies. Example for CentOS 7: + ``` yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ @@ -1138,16 +1334,18 @@ selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc Note: If you are using Amazon Linux, systemd is not required. A shorter way is available using the `yum-builddep` command on RHEL based systems: + ``` yum-builddep SPECS/icinga2.spec ``` Build the RPM: + ``` rpmbuild -ba SPECS/icinga2.spec ``` -#### Additional Hints +#### Additional Hints ##### SELinux policy module @@ -1182,28 +1380,27 @@ cat >$HOME/.rpmmacros < **WARNING:** This information is outdated! +### Build Debian/Ubuntu packages Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) into your source tree and run the following command: + ``` $ dpkg-buildpackage -uc -us ``` -## Build Alpine Linux packages +### Build Alpine Linux packages A simple way to setup a build environment is installing Alpine in a chroot. In this way, you can set up an Alpine build environment in a chroot under a @@ -1214,7 +1411,7 @@ can be found [here](https://github.com/alpinelinux/alpine-chroot-install). Once the build environment is installed, you can setup the system to build the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). -# Build Post Install Tasks +### Build Post Install Tasks After building Icinga 2 yourself, your package build system should at least run the following post install requirements: @@ -1222,29 +1419,33 @@ install requirements: * enable the `checker`, `notification` and `mainlog` feature by default * run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node -## Run Icinga 2 +### Run Icinga 2 Icinga 2 comes with a binary that takes care of loading all the relevant components (e.g. for check execution, notifications, etc.): + ``` -# icinga2 daemon +icinga2 daemon + [2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) [2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). [2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). ... ``` -### Init Script +#### Init Script Icinga 2 can be started as a daemon using the provided init script: + ``` # /etc/init.d/icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} ``` -### Systemd +### Systemd If your distribution uses Systemd: + ``` # systemctl {start|stop|reload|status|enable|disable} icinga2 ``` @@ -1253,9 +1454,10 @@ In case the distribution is running Systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. -### openrc +### openrc Or if your distribution uses openrc (like Alpine): + ``` # rc-service icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} @@ -1264,6 +1466,7 @@ Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} Note: the openrc's init.d is not shipped by default. A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. Those few steps can be followed: + ``` # wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd # mv icinga2.initd /etc/init.d/icinga2 @@ -1279,11 +1482,11 @@ By default `make install` installs example configuration files in sysconfdir. -### Windows +### Windows Builds The Windows MSI packages are located at https://packages.icinga.com/windows/ -#### Requirements +#### Requirements * 32 or 64-bit system * Visual Studio >= 14 2015 From ac9ed41537b36d7a41e26e8535e208579cccbfc2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:15:04 +0100 Subject: [PATCH 0348/1162] Docs: Update anchors --- doc/21-development.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index ff672fe1e..6bd13e939 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -3,14 +3,14 @@ This chapter provides hints on Icinga 2 debugging, development, package builds and tests. -* [Debug Icinga 2](#development-debug) -* [Develop Icinga 2](#development-develop) - * [Linux Dev Environment](#development-linux-dev-env) - * [macOS Dev Environment](#development-macos-dev-env) - * [Windows Dev Environment](#development-windows-dev-env) -* [Package Builds](#development-package-builds) -* [Advanced Tips](#development-advanced) -* [Tests](#development-tests) +* [Debug Icinga 2](21-development.md#development-debug) +* [Develop Icinga 2](21-development.md#development-develop) + * [Linux Dev Environment](21-development.md#development-linux-dev-env) + * [macOS Dev Environment](21-development.md#development-macos-dev-env) + * [Windows Dev Environment](21-development.md#development-windows-dev-env) +* [Package Builds](21-development.md#development-package-builds) +* [Advanced Tips](21-development.md#development-advanced) +* [Tests](21-development.md#development-tests) ## Debug Icinga 2 @@ -460,7 +460,7 @@ autocmd BufWinLeave * call clearmatches() Icinga 2 can run standalone or in distributed environments. It contains a whole lot more than a simple check execution engine. -Read more about it in the [Technical Concepts](#technical-concepts) chapter. +Read more about it in the [Technical Concepts](19-technical-concepts.md#technical-concepts) chapter. ### Get to know the code @@ -511,7 +511,7 @@ db\_ido\_pgsql | IDO database driver for PgSQL. mysql\_shin | Library stub for linking against the MySQL client libraries. pgsql\_shim | Library stub for linking against the PgSQL client libraries. -#### Class Compiler +#### Class Compiler Another thing you will recognize are the `.ti` files which are compiled by our own class compiler into actual source code. The meta language allows @@ -542,7 +542,7 @@ The logic is hidden in `tools/mkclass/` in case you want to learn more about it. The first steps during CMake & make also tell you about code generation. -### Build Tool: CMake +### Builds: CMake In its early development stages in 2012, Icinga 2 was built with autoconf/automake and separate Windows project files. We've found this very fragile, and have changed @@ -556,7 +556,7 @@ The most common benefits: * Separate binary build directories, the actual source tree stays clean. * CMake automatically generates a Visual Studio project file `icinga2.sln` on Windows. -### Builds: Unity Builds +### Builds: Unity Builds Another thing you should be aware of: Unity builds on and off. @@ -602,8 +602,8 @@ mkdir -p release debug Proceed with the specific distribution examples below. -* [CentOS 7](#development-linux-dev-env-centos) -* [Debian 9](#development-linux-dev-env-debian) +* [CentOS 7](21-development.md#development-linux-dev-env-centos) +* [Debian 9](21-development.md#development-linux-dev-env-debian) #### CentOS 7 From e0b3e05c636db082da264c92fc02593f7ff44ded Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:28:39 +0100 Subject: [PATCH 0349/1162] Docs: Update README.md with a better description and direct URLs to icinga.com/docs --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 1935d12d4..b0bcd681e 100644 --- a/README.md +++ b/README.md @@ -8,27 +8,42 @@ #### Table of Contents 1. [About][About] -2. [License][License] -3. [Installation][Installation] -4. [Documentation][Documentation] -5. [Support][Support] +2. [Installation][Installation] +3. [Documentation][Documentation] +4. [Support][Support] +5. [License][License] 6. [Contributing][Contributing] ## About -Icinga 2 is an open source monitoring system which checks the availability of your -network resources, notifies users of outages, and generates performance data for reporting. +[Icinga 2](https://icinga.com/products/icinga-2/) is a monitoring system which checks +the availability of your network resources, notifies users of outages, and generates +performance data for reporting. Scalable and extensible, Icinga 2 can monitor large, complex environments across multiple locations. -Icinga 2 as monitoring core works best with [Icinga Web 2](https://icinga.com/products/icinga-web-2/) -as web interface. +Icinga 2 as core requires [Icinga Web 2](https://icinga.com/products/icinga-web-2/) +on top in your Icinga Stack. -More information can be found at [icinga.com](https://icinga.com/products/icinga-2/) -and inside the [documentation](https://icinga.com/docs/icinga2/latest/). +![Icinga Dashboard](https://icinga.com/wp-content/uploads/2017/12/icingaweb2-2.5.0-dashboard.png) -## Licensing +## Installation + +For installing Icinga please check the [installation chapter](https://icinga.com/docs/icinga2/latest/doc/02-getting-started/) +in the documentation. + +## Documentation + +The documentation is available on [icinga.com/docs](https://icinga.com/docs/icinga2/latest/). + +## Support + +Check the [project website](https://icinga.com) for status updates. Join the +[community channels](https://icinga.com/community/) for questions +or ask an Icinga partner for [professional support](https://icinga.com/support/). + +## License Icinga 2 and the Icinga 2 documentation are licensed under the terms of the GNU General Public License Version 2, you will find a copy of this license in the @@ -48,21 +63,6 @@ so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. -## Installation - -Read the [INSTALL.md](INSTALL.md) file for more information about how to install it. - -## Documentation - -The documentation is located in the [doc/](doc/) directory. The latest documentation -is also available on https://docs.icinga.com - -## Support - -Check the project website at https://icinga.com for status updates. Join the -[community channels](https://icinga.com/community) for questions -or ask an Icinga partner for [professional support](https://icinga.com/services/support/). - ## Contributing There are many ways to contribute to Icinga -- whether it be sending patches, From a83dbc9de5777f89d79b9669b9da66888b926905 Mon Sep 17 00:00:00 2001 From: Sven Wegener Date: Mon, 3 Dec 2018 14:27:37 +0100 Subject: [PATCH 0350/1162] Restore 'Connection: close' behaviour in HTTP responses Actually the `corked` functionality caused problems with not closing connections properly. Full Analysis: https://github.com/Icinga/icinga2/issues/6799#issuecomment-443710338 Full credits to @swegener :) fixes #6799 --- lib/remote/httpresponse.cpp | 3 +++ lib/remote/httpserverconnection.cpp | 7 ------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index fe67052c9..ef0df7e81 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -111,6 +111,9 @@ void HttpResponse::Finish() } m_State = HttpResponseEnd; + + if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") + m_Stream->Shutdown(); } bool HttpResponse::Parse(StreamReadContext& src, bool may_wait) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 356a0ffba..01a58aa8d 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -362,13 +362,6 @@ void HttpServerConnection::DataAvailableHandler() close = true; } - - /* Request finished, decide whether to explicitly close the connection. */ - if (m_CurrentRequest.ProtocolVersion == HttpVersion10 || - m_CurrentRequest.Headers->Get("connection") == "close") { - m_Stream->Shutdown(); - close = true; - } } else close = true; From 5f25eb6b2dda2737a98b429def496bb1bdd950cf Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 14:40:50 +0100 Subject: [PATCH 0351/1162] Add a code comment for connection: close handling --- lib/remote/httpresponse.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index ef0df7e81..de029b701 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -112,6 +112,12 @@ void HttpResponse::Finish() m_State = HttpResponseEnd; + /* Close the connection on + * a) HTTP/1.0 + * b) Connection: close in the sent header. + * + * Do this here and not in DataAvailableHandler - there might still be incoming data in there. + */ if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") m_Stream->Shutdown(); } From 30e6d0f809c47de4204b949263fa209da42e975c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 3 Dec 2018 16:38:52 +0100 Subject: [PATCH 0352/1162] ThreadPool#Stop(): discard non-processed queue items --- lib/base/threadpool.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index 1dad249bc..b6b01ea78 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -73,6 +73,7 @@ void ThreadPool::Stop() for (auto& queue : m_Queues) { boost::mutex::scoped_lock lock(queue.Mutex); queue.Stopped = true; + queue.Items.clear(); queue.CV.notify_all(); } From 7e630c7732c6ce52987509ec36200e5baee4eefe Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 3 Dec 2018 19:05:41 +0100 Subject: [PATCH 0353/1162] HttpServerConnection#DataAvailableHandler(): be aware of being called multiple times concurrently refs #6816 --- lib/remote/httpserverconnection.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 356a0ffba..88234e837 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -351,7 +351,11 @@ void HttpServerConnection::DataAvailableHandler() bool close = false; if (!m_Stream->IsEof()) { - boost::recursive_mutex::scoped_lock lock(m_DataHandlerMutex); + boost::recursive_mutex::scoped_try_lock lock(m_DataHandlerMutex); + if (!lock.owns_lock()) { + Log(LogInformation, "HttpServerConnection", "Unable to process available data, they're already being processed in another thread"); + return; + } try { while (ProcessMessage()) From 8cbe286e676a56c536cee517b898cbe2f25b2547 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:51:04 +0100 Subject: [PATCH 0354/1162] Fix formatting in dev docs --- doc/21-development.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 6bd13e939..b6ae7eca4 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -407,15 +407,15 @@ Up/down in stacktrace: ## Develop Icinga 2 Icinga 2 can be built on many platforms such as Linux, Unix and Windows. -There are limitations in terms of support, e.g. Windows is only supported for clients, +There are limitations in terms of support, e.g. Windows is only supported for agents, not a full-featured master or satellite. Before you start with actual development, there is a couple of pre-requisites. ### Choose your Editor -Icinga 2 can be developed with your favorite editor. Icinga developers prefer to use -the tools below: +Icinga 2 can be developed with your favorite editor. Icinga developers prefer +these tools: - vim - CLion (macOS, Linux) @@ -641,8 +641,6 @@ vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` -``` - ##### Debian 9 ``` From 9801b8b7a040fd4c91aa05d596ec644ddd294bdc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:54:39 +0100 Subject: [PATCH 0355/1162] Purge INSTALL.md and add packager info to README.md Everything is located in the online documentation, where the README.md points to. --- INSTALL.md | 21 --------------------- README.md | 3 +++ 2 files changed, 3 insertions(+), 21 deletions(-) delete mode 100644 INSTALL.md diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index d6121e999..000000000 --- a/INSTALL.md +++ /dev/null @@ -1,21 +0,0 @@ -# Installing Icinga 2 - -The recommended way of installing Icinga 2 is to use [packages](https://packages.icinga.com). -The Icinga project provides both release and development packages for a number -of operating systems. - -Please check the documentation in the [doc/](doc/) directory for a current list -of available packages and detailed installation instructions. - -The online documentation is available on [icinga.com/docs](https://icinga.com/docs/) -and will guide you step by step. - -There are a number of known caveats when installing from source such as -incorrect directory and file permissions. So even if you're planning to -not use the official packages it is advisable to build your own Debian -or RPM packages. You can use the source packages from [packages.icinga.com](https://packages.icinga.com) -for this purpose. - -For a more detailed introduction into developing Icinga and building -packages, please visit the [online documentation](https://icinga.com/docs/icinga2/latest/doc/21-development/). - diff --git a/README.md b/README.md index b0bcd681e..f81f6c940 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ on top in your Icinga Stack. For installing Icinga please check the [installation chapter](https://icinga.com/docs/icinga2/latest/doc/02-getting-started/) in the documentation. +If you are a packager, please read the [development chapter](https://icinga.com/docs/icinga2/latest/doc/21-development/) +for more details. + ## Documentation The documentation is available on [icinga.com/docs](https://icinga.com/docs/icinga2/latest/). From 01d2a17683659e17b0cc311135937e0d5748a05d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:58:44 +0100 Subject: [PATCH 0356/1162] Update TOC --- doc/21-development.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index b6ae7eca4..1b43724fe 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -4,11 +4,16 @@ This chapter provides hints on Icinga 2 debugging, development, package builds and tests. * [Debug Icinga 2](21-development.md#development-debug) + * [GDB Backtrace](21-development.md#development-debug-gdb-backtrace) + * [Core Dump](21-development.md#development-debug-core-dump) * [Develop Icinga 2](21-development.md#development-develop) - * [Linux Dev Environment](21-development.md#development-linux-dev-env) - * [macOS Dev Environment](21-development.md#development-macos-dev-env) - * [Windows Dev Environment](21-development.md#development-windows-dev-env) + * [Linux Dev Environment](21-development.md#development-linux-dev-env) + * [macOS Dev Environment](21-development.md#development-macos-dev-env) + * [Windows Dev Environment](21-development.md#development-windows-dev-env) * [Package Builds](21-development.md#development-package-builds) + * [RPM](21-development.md#development-package-builds-rpms) + * [DEB](21-development.md#development-package-builds-deb) + * [Windows](21-development.md#development-package-builds-windows) * [Advanced Tips](21-development.md#development-advanced) * [Tests](21-development.md#development-tests) @@ -20,6 +25,7 @@ a stack trace or coredump if the application crashed. It is also useful for developers working with different debuggers. > **Note:** +> > This is intentionally mentioned before any development insights > as debugging is a more frequent and commonly asked question. @@ -131,6 +137,12 @@ a new gdb run. #### GDB Backtrace If Icinga 2 aborted its operation abnormally, generate a backtrace. + +> **Note** +> +> Please install the [required debug symbols](21-development.md#debug-requirements) +> prior to generating a backtrace. + `thread apply all` is important here since this includes all running threads. We need this information when e.g. debugging dead locks and hanging features. @@ -155,6 +167,11 @@ make sure to attach as much detail as possible. If Icinga 2 is still running, generate a full backtrace from the running process and store it into a new file (e.g. for debugging dead locks). +> **Note** +> +> Please install the [required debug symbols](21-development.md#debug-requirements) +> prior to generating a backtrace. + Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs and add them to the GitHub issue. @@ -1395,7 +1412,7 @@ the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) into your source tree and run the following command: ``` -$ dpkg-buildpackage -uc -us +dpkg-buildpackage -uc -us ``` ### Build Alpine Linux packages From 43c171056f826cf08b4155472ad9a6a4d14ba8a9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 12:14:01 +0100 Subject: [PATCH 0357/1162] Minor updates for core dumps The main parts are discussed in #6723 --- doc/21-development.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1b43724fe..1d08add4e 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -279,10 +279,11 @@ developers to analyze and fix the problem. This requires setting the core dump file size to `unlimited`. -Example for Systemd: + +##### Systemd ``` -vim /usr/lib/systemd/system/icinga2.service +systemctl edit icinga2.service [Service] ... @@ -293,7 +294,7 @@ systemctl daemon-reload systemctl restart icinga2 ``` -Example for init script: +##### Init Script ``` vim /etc/init.d/icinga2 @@ -303,10 +304,13 @@ ulimit -c unlimited service icinga2 restart ``` +##### Verify + Verify that the Icinga 2 process core file size limit is set to `unlimited`. ``` -cat /proc/`pidof icinga2`/limits +for pid in $(pidof icinga2); do cat /proc/$pid/limits; done + ... Max core file size unlimited unlimited bytes ``` @@ -318,7 +322,7 @@ The Icinga 2 daemon runs with the SUID bit set. Therefore you need to explicitly enable core dumps for SUID on Linux. ``` -sysctl -w fs.suid_dumpable=1 +sysctl -w fs.suid_dumpable=2 ``` Adjust the coredump kernel format and file location on Linux: From 00673cd75911e56cf977fdb5c14c809a97c01e6d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 12:21:54 +0100 Subject: [PATCH 0358/1162] Docs: Formatting for dev requirements --- doc/21-development.md | 64 ++++++++++++------------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1d08add4e..9abf3df4c 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -36,29 +36,12 @@ The Icinga 2 packages provide a debug package which must be installed separately for all involved binaries, like `icinga2-bin` or `icinga2-ido-mysql`. -Debian/Ubuntu: - -``` -apt-get install icinga2-dbg -``` - -RHEL/CentOS: - -``` -yum install icinga2-debuginfo -``` - -Fedora: - -``` -dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo -``` - -SLES/openSUSE: - -``` -zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo -``` +Distribution | Command +-------------------|------------------------------------------ +Debian/Ubuntu | `apt-get install icinga2-dbg` +RHEL/CentOS | `yum install icinga2-debuginfo` +Fedora | `dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo` +SLES/openSUSE | `zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo` Furthermore, you may also have to install debug symbols for Boost and your C++ library. @@ -70,23 +53,12 @@ build flag for debug builds. Install GDB in your development environment. -Debian/Ubuntu: - -``` -apt-get install gdb -``` - -RHEL/CentOS/Fedora: - -``` -yum install gdb -``` - -SLES/openSUSE: - -``` -zypper install gdb -``` +Distribution | Command +-------------------|------------------------------------------ +Debian/Ubuntu | `apt-get install gdb` +RHEL/CentOS | `yum install gdb` +Fedora | `dnf install gdb` +SLES/openSUSE | `zypper install gdb` #### GDB Run @@ -983,12 +955,12 @@ You need to specify the previously installed component paths: Variable | Value | Description ----------------------|----------------------------------------------------------------------|------------------------------------------------------- -BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. -BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. -FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. -ICINGA2_WITH_MYSQL | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. -ICINGA2_WITH_PGSQL | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. -ICINGA2_UNITY_BUILD | OFF | Disable unity builds for development environments. +`BOOST_ROOT` | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. +`BISON_EXECUTABLE` | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. +`FLEX_EXECUTABLE` | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. +`ICINGA2_WITH_MYSQL` | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. +`ICINGA2_WITH_PGSQL` | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. +`ICINGA2_UNITY_BUILD` | OFF | Disable unity builds for development environments. Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables. From fd9b2dece1dfa481d1afe22271b5f1005a4a3b0e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 15:20:37 +0100 Subject: [PATCH 0359/1162] Only create downtimes from non-paused ScheduledDowntime objects in HA enabled cluster zones --- lib/icinga/scheduleddowntime.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index c092ca9f0..449507e0c 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -95,13 +95,14 @@ void ScheduledDowntime::Start(bool runtimeCreated) l_Timer->Start(); }); - Utility::QueueAsyncCallback(std::bind(&ScheduledDowntime::CreateNextDowntime, this)); + if (!IsPaused()) + Utility::QueueAsyncCallback(std::bind(&ScheduledDowntime::CreateNextDowntime, this)); } void ScheduledDowntime::TimerProc() { for (const ScheduledDowntime::Ptr& sd : ConfigType::GetObjectsByType()) { - if (sd->IsActive()) + if (sd->IsActive() && !sd->IsPaused()) sd->CreateNextDowntime(); } } @@ -235,6 +236,13 @@ std::pair ScheduledDowntime::FindNextSegment() void ScheduledDowntime::CreateNextDowntime() { + /* HA enabled zones. */ + if (IsActive() && IsPaused()) { + Log(LogNotice, "Checkable") + << "Skipping downtime creation for HA-paused Scheduled Downtime object '" << GetName() << "'"; + return; + } + double minEnd = 0; for (const Downtime::Ptr& downtime : GetCheckable()->GetDowntimes()) { From 3a4f075f72c5e6e3dd239cf1c53a088851079b47 Mon Sep 17 00:00:00 2001 From: Adam James Date: Wed, 5 Dec 2018 09:13:03 +0000 Subject: [PATCH 0360/1162] ITL: Support --list argument to check_apt --- doc/10-icinga-template-library.md | 1 + itl/command-plugins.conf | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 103410d2d..d258cffd5 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -197,6 +197,7 @@ apt_exclude | **Optional.** Exclude packages matching REGEXP from th apt_critical | **Optional.** If the full package information of any of the upgradable packages match this REGEXP, the plugin will return CRITICAL status. Can be specified multiple times. apt_timeout | **Optional.** Seconds before plugin times out (default: 10). apt_only_critical | **Optional.** Only warn about critical upgrades. +apt_list | **Optional.** List packages available for upgrade. ### breeze diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 8868b0456..9960d10a7 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1958,6 +1958,10 @@ object CheckCommand "apt" { set_if = "$apt_only_critical$" description = "Only warn about critical upgrades." } + "--list" = { + set_if = "$apt_list$" + description = "List packages available for upgrade." + } } timeout = 5m From 18de1f7e1102fcf76c08c9aa87f83c0faba213f8 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Thu, 29 Nov 2018 22:03:26 +0100 Subject: [PATCH 0361/1162] Fix state conditions in check_memory and check_swap This fixes the state conditions in check_memory and check_swap. This turns the if/else if/else statements in simple if statements, since they won't work properly when both thresholds are broken. This also implements a new function to get a given state as wstring. --- plugins/check_memory.cpp | 15 ++++++--------- plugins/check_swap.cpp | 13 +++++-------- plugins/thresholds.cpp | 9 +++++++++ plugins/thresholds.hpp | 2 ++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index e8cb8aae9..4b71517a4 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -164,7 +164,7 @@ static int printOutput(printInfoStruct& printInfo) if (l_Debug) std::wcout << L"Constructing output string" << '\n'; - state state; + state state = OK; std::wcout << L"MEMORY "; @@ -175,16 +175,13 @@ static int printOutput(printInfoStruct& printInfo) else currentValue = printInfo.tRam - printInfo.aRam; - if (printInfo.warn.rend(currentValue, printInfo.tRam)) { + if (printInfo.warn.rend(currentValue, printInfo.tRam)) state = WARNING; - std::wcout << L"WARNING"; - } else if (printInfo.crit.rend(currentValue, printInfo.tRam)) { + + if (printInfo.crit.rend(currentValue, printInfo.tRam)) state = CRITICAL; - std::wcout << L"CRITICAL"; - } else { - state = OK; - std::wcout << L"OK"; - } + + std::wcout << stateToString(state); if (!printInfo.showUsed) std::wcout << " - " << printInfo.percentFree << L"% free"; diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 7f6db013a..906a1017d 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -194,16 +194,13 @@ static int printOutput(printInfoStruct& printInfo) else currentValue = printInfo.tSwap - printInfo.aSwap; - if (printInfo.warn.rend(currentValue, printInfo.tSwap)) { + if (printInfo.warn.rend(currentValue, printInfo.tSwap)) state = WARNING; - std::wcout << L"WARNING - "; - } else if (printInfo.crit.rend(currentValue, printInfo.tSwap)) { + + if (printInfo.crit.rend(currentValue, printInfo.tSwap)) state = CRITICAL; - std::wcout << L"CRITICAL - "; - } else { - state = OK; - std::wcout << L"OK - "; - } + + std::wcout << stateToString(state) << " "; if (!printInfo.showUsed) std::wcout << printInfo.percentFree << L"% free "; diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index f32e6d360..acc2bcafb 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -281,4 +281,13 @@ std::wstring formatErrorInfo(unsigned long err) { } return out.str(); +} + +std::wstring stateToString(const state& state) { + switch (state) { + case OK: return L"OK"; + case WARNING: return L"WARNING"; + case CRITICAL: return L"CRITICAL"; + default: return L"UNKNOWN"; + } } \ No newline at end of file diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index 8348306f2..e7d77f745 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -76,4 +76,6 @@ std::wstring TunitStr(const Tunit&); void printErrorInfo(unsigned long err = 0); std::wstring formatErrorInfo(unsigned long err); +std::wstring stateToString(const state&); + #endif /* THRESHOLDS_H */ From 080f666b55a7570de68ccd6659f12766d5efe179 Mon Sep 17 00:00:00 2001 From: Sven Wegener Date: Mon, 3 Dec 2018 14:27:37 +0100 Subject: [PATCH 0362/1162] Restore 'Connection: close' behaviour in HTTP responses Actually the `corked` functionality caused problems with not closing connections properly. Full Analysis: https://github.com/Icinga/icinga2/issues/6799#issuecomment-443710338 Full credits to @swegener :) fixes #6799 --- lib/remote/httpresponse.cpp | 3 +++ lib/remote/httpserverconnection.cpp | 7 ------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index fe67052c9..ef0df7e81 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -111,6 +111,9 @@ void HttpResponse::Finish() } m_State = HttpResponseEnd; + + if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") + m_Stream->Shutdown(); } bool HttpResponse::Parse(StreamReadContext& src, bool may_wait) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 4f619d2f1..cd3e542f2 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -362,13 +362,6 @@ void HttpServerConnection::DataAvailableHandler() close = true; } - - /* Request finished, decide whether to explicitly close the connection. */ - if (m_CurrentRequest.ProtocolVersion == HttpVersion10 || - m_CurrentRequest.Headers->Get("connection") == "close") { - m_Stream->Shutdown(); - close = true; - } } else close = true; From 1c8fba182c575f44ad277fd7d777441faf812b42 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 14:40:50 +0100 Subject: [PATCH 0363/1162] Add a code comment for connection: close handling --- lib/remote/httpresponse.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index ef0df7e81..de029b701 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -112,6 +112,12 @@ void HttpResponse::Finish() m_State = HttpResponseEnd; + /* Close the connection on + * a) HTTP/1.0 + * b) Connection: close in the sent header. + * + * Do this here and not in DataAvailableHandler - there might still be incoming data in there. + */ if (m_Request->ProtocolVersion == HttpVersion10 || m_Request->Headers->Get("connection") == "close") m_Stream->Shutdown(); } From 797ecd1539c91d3dd02dc7d164ce602c52a6f802 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 3 Dec 2018 16:38:52 +0100 Subject: [PATCH 0364/1162] ThreadPool#Stop(): discard non-processed queue items --- lib/base/threadpool.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index 1dad249bc..b6b01ea78 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -73,6 +73,7 @@ void ThreadPool::Stop() for (auto& queue : m_Queues) { boost::mutex::scoped_lock lock(queue.Mutex); queue.Stopped = true; + queue.Items.clear(); queue.CV.notify_all(); } From 1d6cec5a99abffc3c7e51084cd3401781666111b Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 3 Dec 2018 19:05:41 +0100 Subject: [PATCH 0365/1162] HttpServerConnection#DataAvailableHandler(): be aware of being called multiple times concurrently refs #6816 --- lib/remote/httpserverconnection.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index cd3e542f2..c0550bfae 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -351,7 +351,11 @@ void HttpServerConnection::DataAvailableHandler() bool close = false; if (!m_Stream->IsEof()) { - boost::recursive_mutex::scoped_lock lock(m_DataHandlerMutex); + boost::recursive_mutex::scoped_try_lock lock(m_DataHandlerMutex); + if (!lock.owns_lock()) { + Log(LogInformation, "HttpServerConnection", "Unable to process available data, they're already being processed in another thread"); + return; + } try { while (ProcessMessage()) From 78e470996d4b541acdfa248e4d950a87f4dca598 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 15:20:37 +0100 Subject: [PATCH 0366/1162] Only create downtimes from non-paused ScheduledDowntime objects in HA enabled cluster zones --- lib/icinga/scheduleddowntime.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 6436487b4..978115e61 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -95,13 +95,14 @@ void ScheduledDowntime::Start(bool runtimeCreated) l_Timer->Start(); }); - Utility::QueueAsyncCallback(std::bind(&ScheduledDowntime::CreateNextDowntime, this)); + if (!IsPaused()) + Utility::QueueAsyncCallback(std::bind(&ScheduledDowntime::CreateNextDowntime, this)); } void ScheduledDowntime::TimerProc() { for (const ScheduledDowntime::Ptr& sd : ConfigType::GetObjectsByType()) { - if (sd->IsActive()) + if (sd->IsActive() && !sd->IsPaused()) sd->CreateNextDowntime(); } } @@ -167,6 +168,13 @@ std::pair ScheduledDowntime::FindNextSegment() void ScheduledDowntime::CreateNextDowntime() { + /* HA enabled zones. */ + if (IsActive() && IsPaused()) { + Log(LogNotice, "Checkable") + << "Skipping downtime creation for HA-paused Scheduled Downtime object '" << GetName() << "'"; + return; + } + for (const Downtime::Ptr& downtime : GetCheckable()->GetDowntimes()) { if (downtime->GetScheduledBy() != GetName() || downtime->GetStartTime() < Utility::GetTime()) @@ -261,4 +269,4 @@ void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const Va } catch (const std::exception&) { BOOST_THROW_EXCEPTION(ValidationError(this, { "child_options" }, "Invalid child_options specified")); } -} \ No newline at end of file +} From 0b03a3d8f8c2bbf6d10fc709089fa1a397fc3a79 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 24 Jul 2018 14:24:56 +0200 Subject: [PATCH 0367/1162] SocketEvents: inherit from Stream refs #6477 --- lib/base/socketevents.hpp | 5 ++++- lib/base/tlsstream.hpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 486ec4df1..26dc77019 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -22,6 +22,7 @@ #include "base/i2-base.hpp" #include "base/socket.hpp" +#include "base/stream.hpp" #include #include @@ -37,9 +38,11 @@ namespace icinga * * @ingroup base */ -class SocketEvents +class SocketEvents : public Stream { public: + DECLARE_PTR_TYPEDEFS(SocketEvents); + ~SocketEvents(); virtual void OnEvent(int revents); diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index 8e4ceb08e..45519b5b1 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -43,7 +43,7 @@ enum TlsAction * * @ingroup base */ -class TlsStream final : public Stream, private SocketEvents +class TlsStream final : public SocketEvents { public: DECLARE_PTR_TYPEDEFS(TlsStream); From ad06c4f5ab5ef4a92288f1e6e45ae50f54ddebc6 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 24 Jul 2018 14:40:35 +0200 Subject: [PATCH 0368/1162] Make SocketEventDescriptor#EventInterface a SocketEvents::Ptr refs #6477 --- lib/base/socketevents.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 26dc77019..45fad4617 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -82,7 +82,7 @@ private: struct SocketEventDescriptor { int Events{POLLIN}; - SocketEvents *EventInterface{nullptr}; + SocketEvents::Ptr EventInterface; Object *LifesupportObject{nullptr}; }; From f3f402fa7efc2d932e725aef914ffc8e67d3bea8 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 24 Jul 2018 15:06:55 +0200 Subject: [PATCH 0369/1162] Socket engine: drop life support objects refs #6477 --- lib/base/socketevents-epoll.cpp | 5 +---- lib/base/socketevents-poll.cpp | 5 +---- lib/base/socketevents.cpp | 8 ++++---- lib/base/socketevents.hpp | 12 +++++------- lib/base/tlsstream.cpp | 2 +- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/lib/base/socketevents-epoll.cpp b/lib/base/socketevents-epoll.cpp index ba2e7e25b..932323c6e 100644 --- a/lib/base/socketevents-epoll.cpp +++ b/lib/base/socketevents-epoll.cpp @@ -113,8 +113,6 @@ void SocketEventEngineEpoll::ThreadProc(int tid) EventDescription event; event.REvents = SocketEventEngineEpoll::EpollToPoll(pevents[i].events); event.Descriptor = m_Sockets[tid][pevents[i].data.fd]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); events.emplace_back(std::move(event)); } @@ -134,7 +132,7 @@ void SocketEventEngineEpoll::ThreadProc(int tid) } } -void SocketEventEngineEpoll::Register(SocketEvents *se, Object *lifesupportObject) +void SocketEventEngineEpoll::Register(SocketEvents *se) { int tid = se->m_ID % SOCKET_IOTHREADS; @@ -145,7 +143,6 @@ void SocketEventEngineEpoll::Register(SocketEvents *se, Object *lifesupportObjec SocketEventDescriptor desc; desc.EventInterface = se; - desc.LifesupportObject = lifesupportObject; VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); diff --git a/lib/base/socketevents-poll.cpp b/lib/base/socketevents-poll.cpp index e46dd2c45..afb43177e 100644 --- a/lib/base/socketevents-poll.cpp +++ b/lib/base/socketevents-poll.cpp @@ -111,8 +111,6 @@ void SocketEventEnginePoll::ThreadProc(int tid) EventDescription event; event.REvents = pfds[i].revents; event.Descriptor = descriptors[i]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); events.emplace_back(std::move(event)); } @@ -132,7 +130,7 @@ void SocketEventEnginePoll::ThreadProc(int tid) } } -void SocketEventEnginePoll::Register(SocketEvents *se, Object *lifesupportObject) +void SocketEventEnginePoll::Register(SocketEvents *se) { int tid = se->m_ID % SOCKET_IOTHREADS; @@ -144,7 +142,6 @@ void SocketEventEnginePoll::Register(SocketEvents *se, Object *lifesupportObject SocketEventDescriptor desc; desc.Events = 0; desc.EventInterface = se; - desc.LifesupportObject = lifesupportObject; VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 1400396a4..286460eab 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -111,12 +111,12 @@ void SocketEvents::InitializeEngine() /** * Constructor for the SocketEvents class. */ -SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject) +SocketEvents::SocketEvents(const Socket::Ptr& socket) : m_ID(m_NextID++), m_FD(socket->GetFD()), m_EnginePrivate(nullptr) { boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeEngine); - Register(lifesupportObject); + Register(); } SocketEvents::~SocketEvents() @@ -124,9 +124,9 @@ SocketEvents::~SocketEvents() VERIFY(m_FD == INVALID_SOCKET); } -void SocketEvents::Register(Object *lifesupportObject) +void SocketEvents::Register() { - l_SocketIOEngine->Register(this, lifesupportObject); + l_SocketIOEngine->Register(this); } void SocketEvents::Unregister() diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 45fad4617..44bca3071 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -57,7 +57,7 @@ public: void SetEnginePrivate(void *priv); protected: - SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject); + SocketEvents(const Socket::Ptr& socket); private: int m_ID; @@ -71,7 +71,7 @@ private: void WakeUpThread(bool wait = false); - void Register(Object *lifesupportObject); + void Register(); friend class SocketEventEnginePoll; friend class SocketEventEngineEpoll; @@ -83,14 +83,12 @@ struct SocketEventDescriptor { int Events{POLLIN}; SocketEvents::Ptr EventInterface; - Object *LifesupportObject{nullptr}; }; struct EventDescription { int REvents; SocketEventDescriptor Descriptor; - Object::Ptr LifesupportReference; }; class SocketEventEngine @@ -105,7 +103,7 @@ public: protected: virtual void InitializeThread(int tid) = 0; virtual void ThreadProc(int tid) = 0; - virtual void Register(SocketEvents *se, Object *lifesupportObject) = 0; + virtual void Register(SocketEvents *se) = 0; virtual void Unregister(SocketEvents *se) = 0; virtual void ChangeEvents(SocketEvents *se, int events) = 0; @@ -122,7 +120,7 @@ protected: class SocketEventEnginePoll final : public SocketEventEngine { public: - void Register(SocketEvents *se, Object *lifesupportObject) override; + void Register(SocketEvents *se) override; void Unregister(SocketEvents *se) override; void ChangeEvents(SocketEvents *se, int events) override; @@ -135,7 +133,7 @@ protected: class SocketEventEngineEpoll : public SocketEventEngine { public: - virtual void Register(SocketEvents *se, Object *lifesupportObject); + virtual void Register(SocketEvents *se); virtual void Unregister(SocketEvents *se); virtual void ChangeEvents(SocketEvents *se, int events); diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index c51530395..e3c232bd0 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -43,7 +43,7 @@ bool TlsStream::m_SSLIndexInitialized = false; * @param sslContext The SSL context for the client. */ TlsStream::TlsStream(const Socket::Ptr& socket, const String& hostname, ConnectionRole role, const std::shared_ptr& sslContext) - : SocketEvents(socket, this), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0), + : SocketEvents(socket), m_Eof(false), m_HandshakeOK(false), m_VerifyOK(true), m_ErrorCode(0), m_ErrorOccurred(false), m_Socket(socket), m_Role(role), m_SendQ(new FIFO()), m_RecvQ(new FIFO()), m_CurrentAction(TlsActionNone), m_Retry(false), m_Shutdown(false) { From ce6ab9a9485f7d4ad8ec2c5ccd196f5ae975fb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:09:20 +0200 Subject: [PATCH 0370/1162] Remove dead code Remove some dead code in ScheduledDowntime::CreateNextDowntime(). --- lib/icinga/scheduleddowntime.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 978115e61..278e3d166 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -189,15 +189,8 @@ void ScheduledDowntime::CreateNextDowntime() std::pair segment = FindNextSegment(); - if (segment.first == 0 && segment.second == 0) { - tm reference = Utility::LocalTime(Utility::GetTime()); - reference.tm_mday++; - reference.tm_hour = 0; - reference.tm_min = 0; - reference.tm_sec = 0; - + if (segment.first == 0 && segment.second == 0) return; - } String downtimeName = Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), segment.first, segment.second, From e76ec0d42e706f25675748a10c660ca52f8c5405 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:35:14 +0200 Subject: [PATCH 0371/1162] Remove spurious string in debug message Remove a spurious " at " in the "Evaluating segment" debug message in ScheduledDowntime::FindNextSegment(). --- lib/icinga/scheduleddowntime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 278e3d166..8b0be7e83 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -139,7 +139,7 @@ std::pair ScheduledDowntime::FindNextSegment() ObjectLock olock(ranges); for (const Dictionary::Pair& kv : ranges) { Log(LogDebug, "ScheduledDowntime") - << "Evaluating segment: " << kv.first << ": " << kv.second << " at "; + << "Evaluating segment: " << kv.first << ": " << kv.second; Dictionary::Ptr segment = LegacyTimePeriod::FindNextSegment(kv.first, kv.second, &reference); From 3b4dc854cffc55e53be0e593fad4d1f0ec9e0b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Fu=C3=9F?= Date: Thu, 18 Oct 2018 18:42:21 +0200 Subject: [PATCH 0372/1162] Put running downtimes in effect If Icinga2 was restarted with a newly configured downtime that should be in effect at the time of restart, the should-be-running segment of it was not put into effect. Add new LegacyTimePeriod::FindRunningSegment() and ScheduledDowntime::FindRunningSegment() functions, call the latter in ScheduledDowntime::CreateNextDowntime() before trying the old ScheduledDowntime::FindNextSegment(). --- lib/icinga/legacytimeperiod.cpp | 50 ++++++++++++++++ lib/icinga/legacytimeperiod.hpp | 1 + lib/icinga/scheduleddowntime.cpp | 100 +++++++++++++++++++++++++++---- lib/icinga/scheduleddowntime.hpp | 1 + 4 files changed, 140 insertions(+), 12 deletions(-) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 427f6903a..eea88e2ca 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -388,6 +388,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; + + 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; diff --git a/lib/icinga/legacytimeperiod.hpp b/lib/icinga/legacytimeperiod.hpp index 28f1e8052..9e6ee257a 100644 --- a/lib/icinga/legacytimeperiod.hpp +++ b/lib/icinga/legacytimeperiod.hpp @@ -48,6 +48,7 @@ public: static Dictionary::Ptr ProcessTimeRange(const String& timerange, tm *reference); static void ProcessTimeRanges(const String& timeranges, tm *reference, const Array::Ptr& result); static Dictionary::Ptr FindNextSegment(const String& daydef, const String& timeranges, tm *reference); + static Dictionary::Ptr FindRunningSegment(const String& daydef, const String& timeranges, tm *reference); private: LegacyTimePeriod(); diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 8b0be7e83..449507e0c 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -117,6 +117,67 @@ Checkable::Ptr ScheduledDowntime::GetCheckable() const return host->GetServiceByShortName(GetServiceName()); } +std::pair ScheduledDowntime::FindRunningSegment(double minEnd) +{ + time_t refts = Utility::GetTime(); + tm reference = Utility::LocalTime(refts); + + Log(LogDebug, "ScheduledDowntime") + << "Finding running scheduled downtime segment for time " << refts + << " (minEnd " << (minEnd > 0 ? Utility::FormatDateTime("%c", minEnd) : "-") << ")"; + + Dictionary::Ptr ranges = GetRanges(); + + if (!ranges) + return std::make_pair(0, 0); + + Array::Ptr segments = new Array(); + + Dictionary::Ptr bestSegment; + double bestBegin, bestEnd; + double now = Utility::GetTime(); + + ObjectLock olock(ranges); + + /* Find the longest lasting (and longer than minEnd, if given) segment that's already running */ + for (const Dictionary::Pair& kv : ranges) { + Log(LogDebug, "ScheduledDowntime") + << "Evaluating (running?) segment: " << kv.first << ": " << kv.second; + + Dictionary::Ptr segment = LegacyTimePeriod::FindRunningSegment(kv.first, kv.second, &reference); + + if (!segment) + continue; + + double begin = segment->Get("begin"); + double end = segment->Get("end"); + + Log(LogDebug, "ScheduledDowntime") + << "Considering (running?) segment: " << Utility::FormatDateTime("%c", begin) << " -> " << Utility::FormatDateTime("%c", end); + + if (begin >= now || end < now) { + Log(LogDebug, "ScheduledDowntime") << "not running."; + continue; + } + if (minEnd && end <= minEnd) { + Log(LogDebug, "ScheduledDowntime") << "ending too early."; + continue; + } + + if (!bestSegment || end > bestEnd) { + Log(LogDebug, "ScheduledDowntime") << "(best match yet)"; + bestSegment = segment; + bestBegin = begin; + bestEnd = end; + } + } + + if (bestSegment) + return std::make_pair(bestBegin, bestEnd); + + return std::make_pair(0, 0); +} + std::pair ScheduledDowntime::FindNextSegment() { time_t refts = Utility::GetTime(); @@ -133,10 +194,12 @@ std::pair ScheduledDowntime::FindNextSegment() Array::Ptr segments = new Array(); Dictionary::Ptr bestSegment; - double bestBegin; + double bestBegin, bestEnd; double now = Utility::GetTime(); ObjectLock olock(ranges); + + /* Find the segment starting earliest */ for (const Dictionary::Pair& kv : ranges) { Log(LogDebug, "ScheduledDowntime") << "Evaluating segment: " << kv.first << ": " << kv.second; @@ -146,24 +209,29 @@ std::pair ScheduledDowntime::FindNextSegment() if (!segment) continue; - Log(LogDebug, "ScheduledDowntime") - << "Considering segment: " << Utility::FormatDateTime("%c", segment->Get("begin")) << " -> " << Utility::FormatDateTime("%c", segment->Get("end")); - double begin = segment->Get("begin"); + double end = segment->Get("end"); - if (begin < now) + Log(LogDebug, "ScheduledDowntime") + << "Considering segment: " << Utility::FormatDateTime("%c", begin) << " -> " << Utility::FormatDateTime("%c", end); + + if (begin < now) { + Log(LogDebug, "ScheduledDowntime") << "already running."; continue; + } if (!bestSegment || begin < bestBegin) { + Log(LogDebug, "ScheduledDowntime") << "(best match yet)"; bestSegment = segment; bestBegin = begin; + bestEnd = end; } } if (bestSegment) - return std::make_pair(bestSegment->Get("begin"), bestSegment->Get("end")); - else - return std::make_pair(0, 0); + return std::make_pair(bestBegin, bestEnd); + + return std::make_pair(0, 0); } void ScheduledDowntime::CreateNextDowntime() @@ -175,7 +243,13 @@ void ScheduledDowntime::CreateNextDowntime() return; } + double minEnd = 0; + for (const Downtime::Ptr& downtime : GetCheckable()->GetDowntimes()) { + double end = downtime->GetEndTime(); + if (end > minEnd) + minEnd = end; + if (downtime->GetScheduledBy() != GetName() || downtime->GetStartTime() < Utility::GetTime()) continue; @@ -187,10 +261,12 @@ void ScheduledDowntime::CreateNextDowntime() Log(LogDebug, "ScheduledDowntime") << "Creating new Downtime for ScheduledDowntime \"" << GetName() << "\""; - std::pair segment = FindNextSegment(); - - if (segment.first == 0 && segment.second == 0) - return; + std::pair segment = FindRunningSegment(minEnd); + if (segment.first == 0 && segment.second == 0) { + segment = FindNextSegment(); + if (segment.first == 0 && segment.second == 0) + return; + } String downtimeName = Downtime::AddDowntime(GetCheckable(), GetAuthor(), GetComment(), segment.first, segment.second, diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index c3891676f..158349291 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -58,6 +58,7 @@ protected: private: static void TimerProc(); + std::pair FindRunningSegment(double minEnd = 0); std::pair FindNextSegment(); void CreateNextDowntime(); From 173455de229d0d207c9ce6c802dcb198a8aefed7 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 10 Sep 2018 16:10:16 +0200 Subject: [PATCH 0373/1162] Call SSL_shutdown() at least twice --- lib/base/tlsstream.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index e3c232bd0..a694f86bf 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -398,7 +398,20 @@ void TlsStream::CloseInternal(bool inDestructor) if (!m_SSL) return; - (void)SSL_shutdown(m_SSL.get()); + /* https://www.openssl.org/docs/manmaster/man3/SSL_shutdown.html + * + * It is recommended to do a bidirectional shutdown by checking + * the return value of SSL_shutdown() and call it again until + * it returns 1 or a fatal error. A maximum of 2x pending + 2x data + * is recommended. + */ + int rc = 0; + + for (int i = 0; i < 4; i++) { + if ((rc = SSL_shutdown(m_SSL.get()))) + break; + } + m_SSL.reset(); m_Socket->Close(); From a5659e469afa477b5dbc99508a67f30b184a7a85 Mon Sep 17 00:00:00 2001 From: Leon Stringer Date: Wed, 31 Oct 2018 11:46:12 +0000 Subject: [PATCH 0374/1162] Doc fix: error in example path. --- doc/05-service-monitoring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index cdaa8ed1a..eda3089ae 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -16,7 +16,7 @@ and create a new global constant, e.g. `CustomPluginDir` in your [constants.conf configuration file: # cp check_snmp_int.pl /opt/monitoring/plugins - # chmod +x /opt/plugins/check_snmp_int.pl + # chmod +x /opt/monitoring/plugins/check_snmp_int.pl # cat /etc/icinga2/constants.conf /** From 62fcbe3c015499f36d8333103143c13d005d110b Mon Sep 17 00:00:00 2001 From: David Lublink Date: Thu, 1 Nov 2018 18:51:42 -0400 Subject: [PATCH 0375/1162] * BugFix : Wrong operator on stride variable causing incorrect behaviour ( #6749 ) --- lib/icinga/legacytimeperiod.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index eea88e2ca..6433d0d6c 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -42,7 +42,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; From 9800e69f9f553c1edf7a85b0efb320cfba6dd86e Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 2 Nov 2018 07:45:48 +0100 Subject: [PATCH 0376/1162] Doc fix: documentation link for apt Fixes `check_apt` documentation link to point to the right man page. --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a9a861651..382e9b52d 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -182,7 +182,7 @@ which contains the path of the plugins from the Monitoring Plugins project. ### apt -The plugin [apt](https://www.monitoring-plugins.org/doc/index.html) checks for software updates on systems that use +The plugin [apt](https://www.monitoring-plugins.org/doc/man/check_apt.html) checks for software updates on systems that use package management systems based on the apt-get(8) command found in Debian based systems. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): From 29a3a6d4d79e000504316bb57495066c2efdf711 Mon Sep 17 00:00:00 2001 From: fluxX04 Date: Thu, 15 Nov 2018 09:54:58 +0100 Subject: [PATCH 0377/1162] update apache status command to be identical according the itl --- doc/05-service-monitoring.md | 2 +- doc/08-advanced-topics.md | 2 +- doc/10-icinga-template-library.md | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/05-service-monitoring.md b/doc/05-service-monitoring.md index eda3089ae..b8e7375c0 100644 --- a/doc/05-service-monitoring.md +++ b/doc/05-service-monitoring.md @@ -226,7 +226,7 @@ Instead, choose a plugin and configure its parameters and thresholds. The follow * [ftp](10-icinga-template-library.md#plugin-check-command-ftp) * [webinject](10-icinga-template-library.md#plugin-contrib-command-webinject) * [squid](10-icinga-template-library.md#plugin-contrib-command-squid) -* [apache_status](10-icinga-template-library.md#plugin-contrib-command-apache_status) +* [apache-status](10-icinga-template-library.md#plugin-contrib-command-apache-status) * [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) * [kdc](10-icinga-template-library.md#plugin-contrib-command-kdc) * [rbl](10-icinga-template-library.md#plugin-contrib-command-rbl) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index 58ce96310..de87c40da 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -521,7 +521,7 @@ Database | MySQL | [mysql_health](10-icinga-template-library.md#plugin-contri Database | PostgreSQL | [postgres](10-icinga-template-library.md#plugin-contrib-command-postgres) Database | Housekeeping | Check the database size and growth and analyse metrics to examine trends. Database | DB IDO | [ido](10-icinga-template-library.md#itl-icinga-ido) (more below) -Webserver | Apache2, Nginx, etc. | [http](10-icinga-template-library.md#plugin-check-command-http), [apache_status](10-icinga-template-library.md#plugin-contrib-command-apache_status), [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) +Webserver | Apache2, Nginx, etc. | [http](10-icinga-template-library.md#plugin-check-command-http), [apache-status](10-icinga-template-library.md#plugin-contrib-command-apache-status), [nginx_status](10-icinga-template-library.md#plugin-contrib-command-nginx_status) Webserver | Certificates | [http](10-icinga-template-library.md#plugin-check-command-http) Webserver | Authorization | [http](10-icinga-template-library.md#plugin-check-command-http) Notifications | Mail (queue) | [smtp](10-icinga-template-library.md#plugin-check-command-smtp), [mailq](10-icinga-template-library.md#plugin-check-command-mailq) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 382e9b52d..45172ac78 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1667,8 +1667,8 @@ Thresholds will always be "1". > **Note** > -> If they are enabled, performance data will be shown in the web interface. -> If run without the optional parameters, the plugin will output critical if any important updates are available. +> If they are enabled, performance data will be shown in the web interface. +> If run without the optional parameters, the plugin will output critical if any important updates are available. ### uptime-windows @@ -5138,7 +5138,7 @@ vmware_multiline | **Optional.** Multiline output in overview. This mean This category includes all plugins for web-based checks. -#### apache_status +#### apache-status The [check_apache_status.pl](https://github.com/lbetz/check_apache_status) plugin uses the [/server-status](https://httpd.apache.org/docs/current/mod/mod_status.html) From 190f381c7acc7a47e98aa75eaf34cb8eca2f0ecb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 21 Nov 2018 11:20:54 +0100 Subject: [PATCH 0378/1162] Docs: Add a section for DB IDO Cleanup refs #6784 --- doc/14-features.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/doc/14-features.md b/doc/14-features.md index 378161acd..0ecafd62c 100644 --- a/doc/14-features.md +++ b/doc/14-features.md @@ -87,6 +87,30 @@ status_update_time A detailed list on the available table attributes can be found in the [DB IDO Schema documentation](24-appendix.md#schema-db-ido). +### DB IDO Cleanup + +Objects get deactivated when they are deleted from the configuration. +This is visible with the `is_active` column in the `icinga_objects` table. +Therefore all queries need to join this table and add `WHERE is_active=1` as +condition. Deleted objects preserve their history table entries for later SLA +reporting. + +Historical data isn't purged by default. You can enable the least +kept data age inside the `cleanup` configuration attribute for the +IDO features [IdoMysqlConnection](09-object-types.md#objecttype-idomysqlconnection) +and [IdoPgsqlConnection](09-object-types.md#objecttype-idopgsqlconnection). + +Example if you prefer to keep notification history for 30 days: + +``` + cleanup = { + notifications_age = 30d + contactnotifications_age = 30d + } +``` + +The historical tables are populated depending on the data `categories` specified. +Some tables are empty by default. ### DB IDO Tuning From c8a1155e3d3a3723befdbef553db4a00c0a4239b Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 29 Nov 2018 17:51:53 +0100 Subject: [PATCH 0379/1162] Remove redundand check for object existence on creation via API refs #3937 --- lib/remote/configobjectutility.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index 1fc8dcb92..708ec0303 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -120,11 +120,6 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full String path = GetObjectConfigPath(type, fullName); Utility::MkDirP(Utility::DirName(path), 0700); - if (Utility::PathExists(path)) { - errors->Add("Cannot create object '" + fullName + "'. Configuration file '" + path + "' already exists."); - return false; - } - std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc); fp << config; fp.close(); From 1352b1522010f5899bee166792e50a24cad5bbb3 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Wed, 5 Dec 2018 20:12:06 +0100 Subject: [PATCH 0380/1162] Fix string comparison on edge cases This fixes a few edge cases where the string comparison failed before. --- lib/cli/nodeutility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index d7ea8bce3..b8df144a0 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -293,7 +293,7 @@ bool NodeUtility::GetConfigurationIncludeState(const String& value, bool recursi * First hit breaks out of the loop. */ - if (!line.compare(affectedInclude)) { + if (line.compare(0, affectedInclude.GetLength(), affectedInclude) == 0) { isIncluded = true; /* From ea64467c65d0e5f6dc684fdb6fed20801f33abb8 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 6 Dec 2018 09:55:42 +0100 Subject: [PATCH 0381/1162] Revert "ThreadPool#Stop(): discard non-processed queue items" This reverts commit 797ecd1539c91d3dd02dc7d164ce602c52a6f802. --- lib/base/threadpool.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index b6b01ea78..1dad249bc 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -73,7 +73,6 @@ void ThreadPool::Stop() for (auto& queue : m_Queues) { boost::mutex::scoped_lock lock(queue.Mutex); queue.Stopped = true; - queue.Items.clear(); queue.CV.notify_all(); } From bf4ecbed692028a836be87a70ed344d1a96d1f05 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 6 Dec 2018 09:56:49 +0100 Subject: [PATCH 0382/1162] Revert "ThreadPool#Stop(): discard non-processed queue items" This reverts commit 30e6d0f809c47de4204b949263fa209da42e975c. refs #6815 --- lib/base/threadpool.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index b6b01ea78..1dad249bc 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -73,7 +73,6 @@ void ThreadPool::Stop() for (auto& queue : m_Queues) { boost::mutex::scoped_lock lock(queue.Mutex); queue.Stopped = true; - queue.Items.clear(); queue.CV.notify_all(); } From 00757919b322bc930360694c30485977cfb5506a Mon Sep 17 00:00:00 2001 From: Max Rosin Date: Wed, 5 Dec 2018 16:28:03 +0100 Subject: [PATCH 0383/1162] Document that retry_interval is only used after an active check result fixes #6795 --- doc/09-object-types.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index d1d2006e2..fbfff8083 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -723,7 +723,7 @@ Configuration Attributes: check\_period | Object name | **Optional.** The name of a time period which determines when this host should be checked. Not set by default. check\_timeout | Duration | **Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval | Duration | **Optional.** The check interval (in seconds). This interval is used for checks when the host is in a `HARD` state. Defaults to `5m`. - retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the host is in a `SOFT` state. Defaults to `1m`. + retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the host is in a `SOFT` state. Defaults to `1m`. Note: This does not affect the scheduling [after a passive check result](08-advanced-topics.md#check-result-freshness). enable\_notifications | Boolean | **Optional.** Whether notifications are enabled. Defaults to true. enable\_active\_checks | Boolean | **Optional.** Whether active checks are enabled. Defaults to true. enable\_passive\_checks | Boolean | **Optional.** Whether passive checks are enabled. Defaults to true. @@ -1454,7 +1454,7 @@ Configuration Attributes: check\_period | Object name | **Optional.** The name of a time period which determines when this service should be checked. Not set by default. check\_timeout | Duration | **Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval | Duration | **Optional.** The check interval (in seconds). This interval is used for checks when the service is in a `HARD` state. Defaults to `5m`. - retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the service is in a `SOFT` state. Defaults to `1m`. + retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the service is in a `SOFT` state. Defaults to `1m`. Note: This does not affect the scheduling [after a passive check result](08-advanced-topics.md#check-result-freshness). enable\_notifications | Boolean | **Optional.** Whether notifications are enabled. Defaults to `true`. enable\_active\_checks | Boolean | **Optional.** Whether active checks are enabled. Defaults to `true`. enable\_passive\_checks | Boolean | **Optional.** Whether passive checks are enabled. Defaults to `true`. From bbcf469af1c584a92d028446c6ff1f558950cd97 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 6 Dec 2018 12:41:49 +0100 Subject: [PATCH 0384/1162] Implement ScheduledDowntime::AllConfigIsLoaded() refs #6542 --- lib/icinga/scheduleddowntime.cpp | 9 +++++++++ lib/icinga/scheduleddowntime.hpp | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index c092ca9f0..054f63628 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -80,6 +80,8 @@ void ScheduledDowntime::OnAllConfigLoaded() if (!GetCheckable()) BOOST_THROW_EXCEPTION(ScriptError("ScheduledDowntime '" + GetName() + "' references a host/service which doesn't exist.", GetDebugInfo())); + + m_AllConfigLoaded.store(true); } void ScheduledDowntime::Start(bool runtimeCreated) @@ -331,3 +333,10 @@ void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const Va BOOST_THROW_EXCEPTION(ValidationError(this, { "child_options" }, "Invalid child_options specified")); } } + +bool ScheduledDowntime::AllConfigIsLoaded() +{ + return m_AllConfigLoaded.load(); +} + +std::atomic ScheduledDowntime::m_AllConfigLoaded (false); diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 158349291..4322999b7 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -23,6 +23,7 @@ #include "icinga/i2-icinga.hpp" #include "icinga/scheduleddowntime-ti.hpp" #include "icinga/checkable.hpp" +#include namespace icinga { @@ -47,6 +48,7 @@ public: static void EvaluateApplyRules(const intrusive_ptr& host); static void EvaluateApplyRules(const intrusive_ptr& service); + static bool AllConfigIsLoaded(); void ValidateRanges(const Lazy& lvalue, const ValidationUtils& utils) override; void ValidateChildOptions(const Lazy& lvalue, const ValidationUtils& utils) override; @@ -62,6 +64,8 @@ private: std::pair FindNextSegment(); void CreateNextDowntime(); + static std::atomic m_AllConfigLoaded; + static bool EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, const String& name, ScriptFrame& frame, const ApplyRule& rule); static bool EvaluateApplyRule(const Checkable::Ptr& checkable, const ApplyRule& rule); }; From 39e0d787e82c187de64b29e4979f4caac0907441 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 6 Dec 2018 12:50:48 +0100 Subject: [PATCH 0385/1162] Downtime#HasValidConfigOwner(): wait for ScheduledDowntimes refs #6542 --- lib/icinga/downtime.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 336329bc2..4180747ac 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -210,6 +210,10 @@ bool Downtime::IsExpired() const bool Downtime::HasValidConfigOwner() const { + if (!ScheduledDowntime::AllConfigIsLoaded()) { + return true; + } + String configOwner = GetConfigOwner(); return configOwner.IsEmpty() || GetObject(configOwner); } From ba8d79f3c52ff67e7803732a79cb80c368496548 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 7 Dec 2018 09:37:03 +0100 Subject: [PATCH 0386/1162] API Event Streams: Add 'command' for Notification events fixes #6824 --- doc/12-icinga2-api.md | 1 + lib/icinga/apievents.cpp | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index 8709438d1..2b982c9aa 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -1333,6 +1333,7 @@ Example for all downtime events: timestamp | Timestamp | Unix timestamp when the event happened. host | String | [Host](09-object-types.md#objecttype-host) name. service | String | [Service](09-object-types.md#objecttype-service) name. Optional if this is a host notification. + command | String | [NotificationCommand](09-object-types.md#objecttype-notificationcommand) name. users | Array | List of notified [user](09-object-types.md#objecttype-user) names. notification\_type | String | [$notification.type$](03-monitoring-basics.md#notification-runtime-macros) runtime macro value. author | String | [$notification.author$](03-monitoring-basics.md#notification-runtime-macros) runtime macro value. diff --git a/lib/icinga/apievents.cpp b/lib/icinga/apievents.cpp index 3097280ad..55c8a541b 100644 --- a/lib/icinga/apievents.cpp +++ b/lib/icinga/apievents.cpp @@ -19,6 +19,7 @@ #include "icinga/apievents.hpp" #include "icinga/service.hpp" +#include "icinga/notificationcommand.hpp" #include "remote/eventqueue.hpp" #include "base/initialize.hpp" #include "base/serializer.hpp" @@ -129,6 +130,11 @@ void ApiEvents::NotificationSentToAllUsersHandler(const Notification::Ptr& notif if (service) result->Set("service", service->GetShortName()); + NotificationCommand::Ptr command = notification->GetCommand(); + + if (command) + result->Set("command", command->GetName()); + ArrayData userNames; for (const User::Ptr& user : users) { From 5431eae116df92d0b856e7f856da24df5a948144 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 4 Dec 2018 17:44:42 +0100 Subject: [PATCH 0387/1162] Add and populate Downtime#authoritative_zone refs #6542 --- lib/icinga/downtime.cpp | 4 ++++ lib/icinga/downtime.ti | 1 + 2 files changed, 5 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 336329bc2..47ef789cb 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -247,6 +247,10 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth attrs->Set("config_owner", scheduledDowntime); attrs->Set("entry_time", Utility::GetTime()); + if (!scheduledDowntime.IsEmpty()) { + attrs->Set("authoritative_zone", Zone::GetLocalZone()->GetName()); + } + Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(checkable); diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index 17c8cfe91..fe80e0e77 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -84,6 +84,7 @@ class Downtime : ConfigObject < DowntimeNameComposer [state] int legacy_id; [state] bool was_cancelled; [config] String config_owner; + [config] String authoritative_zone; }; } From c98d6a52545bf0e10b9b0d644b0d15813ab7de48 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 4 Dec 2018 17:45:54 +0100 Subject: [PATCH 0388/1162] Downtime#HasValidConfigOwner(): respect Downtime#authoritative_zone refs #6542 --- lib/icinga/downtime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 47ef789cb..549b721c1 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -211,7 +211,7 @@ bool Downtime::IsExpired() const bool Downtime::HasValidConfigOwner() const { String configOwner = GetConfigOwner(); - return configOwner.IsEmpty() || GetObject(configOwner); + return configOwner.IsEmpty() || Zone::GetByName(GetAuthoritativeZone()) != Zone::GetLocalZone() || GetObject(configOwner); } int Downtime::GetNextDowntimeID() From fcfde9ac22ff6bfde73ecfe1672bb686e1559e28 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 18 Dec 2018 11:52:06 +0100 Subject: [PATCH 0389/1162] tools/win32: Invalidate CMake cache on build --- tools/win32/configure.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1 index 1f40875ce..57fc03188 100644 --- a/tools/win32/configure.ps1 +++ b/tools/win32/configure.ps1 @@ -53,6 +53,11 @@ cd "$env:ICINGA2_BUILDPATH" #-DCMAKE_INSTALL_PREFIX="C:\Program Files\Icinga2" ` +# Invalidate cache in case something in the build environment changed +if (Test-Path CMakeCache.txt) { + Remove-Item -Force CMakeCache.txt | Out-Null +} + & cmake.exe "$sourcePath" ` -DCMAKE_BUILD_TYPE=RelWithDebInfo ` -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX ` From ace12db110e565b20f8b1141e62e488b9c4abc8f Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 18 Dec 2018 12:08:41 +0100 Subject: [PATCH 0390/1162] appveyor: Run Debug builds [skip travis] --- appveyor.yml | 1 + tools/win32/configure.ps1 | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 6e7f09b73..9d1150f72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ environment: BOOST_LIBRARYDIR: 'C:\Libraries\boost_1_65_1\lib64-msvc-14.1' BISON_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_bison.exe' FLEX_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_flex.exe' + CMAKE_BUILD_TYPE: Debug branches: only: diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1 index 57fc03188..0ea0a50cb 100644 --- a/tools/win32/configure.ps1 +++ b/tools/win32/configure.ps1 @@ -2,6 +2,9 @@ if (-not (Test-Path env:ICINGA2_BUILDPATH)) { $env:ICINGA2_BUILDPATH = '.\build' } +if (-not (Test-Path env:CMAKE_BUILD_TYPE)) { + $env:CMAKE_BUILD_TYPE = 'RelWithDebInfo' +} if (-not (Test-Path "$env:ICINGA2_BUILDPATH")) { mkdir "$env:ICINGA2_BUILDPATH" | out-null } @@ -59,7 +62,7 @@ if (Test-Path CMakeCache.txt) { } & cmake.exe "$sourcePath" ` - -DCMAKE_BUILD_TYPE=RelWithDebInfo ` + -DCMAKE_BUILD_TYPE="$env:CMAKE_BUILD_TYPE" ` -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX ` -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF ` -DOPENSSL_ROOT_DIR="$env:OPENSSL_ROOT_DIR" ` From 18250896ca49276791ff475d6e26845adc72eee5 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Thu, 20 Dec 2018 11:59:28 +0400 Subject: [PATCH 0391/1162] Add fail2ban CheckCommand definition The check_fail2ban plugin use the fail2ban-client binary to monitor fail2ban jails. --- doc/10-icinga-template-library.md | 27 +++++++++++++++++ itl/plugins-contrib.d/network-services.conf | 33 +++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 3ff76f7f4..6c72cc463 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2993,6 +2993,33 @@ lsyncd_statfile | **Optional.** Set status file path (default: /var/run/ lsyncd_warning | **Optional.** Warning if more than N delays (default: 10). lsyncd_critical | **Optional.** Critical if more then N delays (default: 100). +#### fail2ban + +The [check_fail2ban](https://github.com/fail2ban/fail2ban/tree/master/files/nagios) plugin +uses the `fail2ban-client` binary to monitor [fail2ban](http://www.fail2ban.org) jails. + +The plugin requires `sudo` permissions. +You can add a sudoers file to allow your monitoring user to use the plugin, i.e. edit /etc/sudoers.d/icinga and add: +``` +icinga ALL=(root) NOPASSWD:/usr/lib/nagios/plugins/check_fail2ban +``` + +and set the correct permissions: +```bash +chown -c root: /etc/sudoers.d/icinga +chmod -c 0440 /etc/sudoers.d/icinga +``` + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|--------------------------------------------------------------------------- +fail2ban_display | **Optional.** To modify the output display, default is 'CHECK FAIL2BAN ACTIVITY' +fail2ban_path | **Optional.** Specify the path to the tw_cli binary, default value is /usr/bin/fail2ban-client +fail2ban_warning | **Optional.** Specify a warning threshold, default is 1 +fail2ban_critical | **Optional.** Specify a critical threshold, default is 2 +fail2ban_socket | **Optional.** Specify a socket path, default is unset +fail2ban_perfdata | **Optional.** If set to true, activate the perfdata output, default value for the plugin is set to true. ### Operating System diff --git a/itl/plugins-contrib.d/network-services.conf b/itl/plugins-contrib.d/network-services.conf index 989a9eb05..d8034fe8b 100644 --- a/itl/plugins-contrib.d/network-services.conf +++ b/itl/plugins-contrib.d/network-services.conf @@ -101,3 +101,36 @@ object CheckCommand "lsyncd" { } } } + +object CheckCommand "fail2ban" { + command = [ "sudo", PluginDir + "/check_fail2ban" ] + + arguments = { + "-D" = { + value = "$fail2ban_display$" + description = "To modify the output display, default is 'CHECK FAIL2BAN ACTIVITY'" + } + "-P" = { + value = "$fail2ban_path$" + description = "Specify the path to the tw_cli binary, default value is /usr/bin/fail2ban-client" + } + "-w" = { + value = "$fail2ban_warning$" + description = "Specify a warning threshold, default is 1" + } + "-c" = { + value = "$fail2ban_critical$" + description = "Specify a critical threshold, default is 2" + } + "-s" = { + value = "$fail2ban_socket$" + description = "Specify a socket path, default is unset" + } + "-p" = { + set_if = "$fail2ban_perfdata$" + description = "If set to true, activate the perfdata output" + } + } + + vars.fail2ban_perfdata = true +} From c97c42bff405a3c6b7c6f8f36ce8ef9303da7c90 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Thu, 20 Dec 2018 13:22:59 +0400 Subject: [PATCH 0392/1162] Fix ITL CheckCommand disk Add -N/--include-type option, available since release 1.5. --- doc/10-icinga-template-library.md | 1 + itl/command-plugins.conf | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 3ff76f7f4..05f94654b 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -347,6 +347,7 @@ disk\_ignore\_ereg\_path | **Optional.** Regular expression to ignore selected disk\_timeout | **Optional.** Seconds before connection times out (default: 10). disk\_units | **Optional.** Choose bytes, kB, MB, GB, TB (default: MB). disk\_exclude\_type | **Optional.** Ignore all filesystems of indicated type. Multiple regular expression strings must be defined as array. Defaults to "none", "tmpfs", "sysfs", "proc", "configfs", "devtmpfs", "devfs", "mtmfs", "tracefs", "cgroup", "fuse.gvfsd-fuse", "fuse.gvfs-fuse-daemon", "fdescfs", "overlay", "nsfs", "squashfs". +disk\_include\_type | **Optional.** Check only filesystems of indicated type. Multiple regular expression strings must be defined as array. ### disk_smb diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 9960d10a7..e5b365539 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1475,6 +1475,11 @@ object CheckCommand "disk" { description = "Ignore all filesystems of indicated type (may be repeated)" repeat_key = true } + "-N" = { + value = "$disk_include_type$" + description = "Check only filesystems of indicated type (may be repeated)" + repeat_key = true + } } vars.disk_wfree = "20%" From 5109f7f788eb349bc816295a6b815ab85e168611 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Thu, 20 Dec 2018 14:39:15 +0400 Subject: [PATCH 0393/1162] Add haproxy CheckCommand definition Haproxy plugin check haproxy csv statistics page and reports response time and backends sessions count --- doc/10-icinga-template-library.md | 26 +++++++++++++++++++++++++ itl/plugins-contrib.d/web.conf | 32 +++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 3ff76f7f4..17e9c1e0d 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5388,3 +5388,29 @@ uptime | How long the cache has been running (in seconds) ratio | The cache hit ratio expressed as a percentage of hits to hits + misses. Default thresholds are 95 and 90. usage | Cache file usage as a percentage of the total cache space. +#### haproxy + +The [check_haproxy](https://salsa.debian.org/nagios-team/pkg-nagios-plugins-contrib/blob/master/check_haproxy/check_haproxy) plugin, +also available in the [monitoring-plugins-contrib](https://packages.debian.org/nagios-plugins-contrib) on debian, +uses the `haproxy` csv statistics page to monitor [haproxy](http://www.haproxy.org/) response time. The plugin outputa performance data for backends sessions and statistics response time. + +This plugin need to access the csv statistics page. You can configure it in haproxy by adding a new frontend: +``` +frontend stats + bind 127.0.0.1:80 + stats enablestats + stats uri /stats +``` + +The statistics page will be available at `http://127.0.0.1/stats;csv;norefresh`. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|---------------------------------------------------------------------------------- +haproxy_username | **Optional.** Username for HTTP Auth +haproxy_password | **Optional.** Password for HTTP Auth +haproxy_url | **Required.** URL of the HAProxy csv statistics page. +haproxy_timeout | **Optional.** Seconds before plugin times out (default: 10) +haproxy_warning | **Optional.** Warning request time threshold (in seconds) +haproxy_critical | **Optional.** Critical request time threshold (in seconds) diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 458de5a57..73266e3b1 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -586,3 +586,35 @@ object CheckCommand "varnish" { } } +object CheckCommand "haproxy" { + import "plugin-check-command" + command = [ PluginDir + "/check_haproxy" ] + + arguments = { + "--username" = { + value = "$haproxy_username$" + description = "Username for HTTP Auth" + } + "--password" = { + value = "$haproxy_password$" + description = "Password for HTTP Auth" + } + "--url" = { + value = "$haproxy_url$" + description = "URL of the HAProxy csv statistics page" + required = true + } + "--timeout" = { + value = "$haproxy_timeout$" + description = "Seconds before plugin times out (default: 10)" + } + "-w" = { + value = "$haproxy_warning$" + description = "Warning request time threshold (in seconds)" + } + "-c" = { + value = "$haproxy_critical$" + description = "Critical request time threshold (in seconds)" + } + } +} From 12f3149eef2af2af89d8f15a479c50e1b214260f Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 20 Dec 2018 13:59:28 +0100 Subject: [PATCH 0394/1162] Checkable: require zone to be set if command_endpoint is set refs #6666 --- lib/icinga/checkable.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index fe2fed9e3..cb970aa1b 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -57,14 +57,16 @@ void Checkable::OnAllConfigLoaded() if (endpoint) { Zone::Ptr checkableZone = static_pointer_cast(GetZone()); - if (!checkableZone) - checkableZone = Zone::GetLocalZone(); + if (checkableZone) { + Zone::Ptr cmdZone = endpoint->GetZone(); - Zone::Ptr cmdZone = endpoint->GetZone(); - - if (checkableZone && cmdZone != checkableZone && cmdZone->GetParent() != checkableZone) { + if (cmdZone != checkableZone && cmdZone->GetParent() != checkableZone) { + BOOST_THROW_EXCEPTION(ValidationError(this, { "command_endpoint" }, + "Command endpoint must be in zone '" + checkableZone->GetName() + "' or in a direct child zone thereof.")); + } + } else { BOOST_THROW_EXCEPTION(ValidationError(this, { "command_endpoint" }, - "Command endpoint must be in zone '" + checkableZone->GetName() + "' or in a direct child zone thereof.")); + "Command endpoint must not be set.")); } } } From 17e86f98a23707e37e4b643e243e9bc0cecebc0a Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 20 Dec 2018 15:48:10 +0100 Subject: [PATCH 0395/1162] Make UnameHelper() efficient refs #6452 --- lib/base/utility.cpp | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 466a236de..e6582de59 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -49,6 +49,7 @@ #ifndef _WIN32 # include +# include # include # include # include @@ -1463,28 +1464,23 @@ String Utility::UnescapeString(const String& s) #ifndef _WIN32 static String UnameHelper(char type) { - /* Unfortunately the uname() system call doesn't support some of the - * query types we're interested in - so we're using popen() instead. */ + struct utsname name; + uname(&name); - char cmd[] = "uname -X 2>&1"; - cmd[7] = type; - - FILE *fp = popen(cmd, "r"); - - if (!fp) - return "Unknown"; - - char line[1024]; - std::ostringstream msgbuf; - - while (fgets(line, sizeof(line), fp)) - msgbuf << line; - - pclose(fp); - - String result = msgbuf.str(); - - return result.Trim(); + switch (type) { + case 'm': + return (char*)name.machine; + case 'n': + return (char*)name.nodename; + case 'r': + return (char*)name.release; + case 's': + return (char*)name.sysname; + case 'v': + return (char*)name.version; + default: + VERIFY(!"Invalid uname query."); + } } #endif /* _WIN32 */ static bool ReleaseHelper(String *platformName, String *platformVersion) From eeb609d4ae1a3953d7cc9e0cf5e2a4282aee26cd Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 21 Dec 2018 11:52:37 +0100 Subject: [PATCH 0396/1162] Url#m_Query: preserve order refs #6536 --- lib/remote/apiclient.cpp | 20 +++++----- lib/remote/httputility.cpp | 10 ++++- lib/remote/url.cpp | 76 ++++---------------------------------- lib/remote/url.hpp | 10 ++--- test/remote-url.cpp | 53 +++++++++++++++++--------- 5 files changed, 66 insertions(+), 103 deletions(-) diff --git a/lib/remote/apiclient.cpp b/lib/remote/apiclient.cpp index 793bd1547..8846de922 100644 --- a/lib/remote/apiclient.cpp +++ b/lib/remote/apiclient.cpp @@ -42,11 +42,11 @@ void ApiClient::ExecuteScript(const String& session, const String& command, bool url->SetPort(m_Connection->GetPort()); url->SetPath({ "v1", "console", "execute-script" }); - std::map > params; - params["session"].push_back(session); - params["command"].push_back(command); - params["sandboxed"].emplace_back(sandboxed ? "1" : "0"); - url->SetQuery(params); + url->SetQuery({ + {"session", session}, + {"command", command}, + {"sandboxed", sandboxed ? "1" : "0"} + }); try { std::shared_ptr req = m_Connection->NewRequest(); @@ -121,11 +121,11 @@ void ApiClient::AutocompleteScript(const String& session, const String& command, url->SetPort(m_Connection->GetPort()); url->SetPath({ "v1", "console", "auto-complete-script" }); - std::map > params; - params["session"].push_back(session); - params["command"].push_back(command); - params["sandboxed"].emplace_back(sandboxed ? "1" : "0"); - url->SetQuery(params); + url->SetQuery({ + {"session", session}, + {"command", command}, + {"sandboxed", sandboxed ? "1" : "0"} + }); try { std::shared_ptr req = m_Connection->NewRequest(); diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 5231e7ee9..243209b4a 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -20,6 +20,8 @@ #include "remote/httputility.hpp" #include "base/json.hpp" #include "base/logger.hpp" +#include +#include using namespace icinga; @@ -44,8 +46,12 @@ Dictionary::Ptr HttpUtility::FetchRequestParameters(HttpRequest& request) if (!result) result = new Dictionary(); - typedef std::pair > kv_pair; - for (const kv_pair& kv : request.RequestUrl->GetQuery()) { + std::map> query; + for (const auto& kv : request.RequestUrl->GetQuery()) { + query[kv.first].emplace_back(kv.second); + } + + for (auto& kv : query) { result->Set(kv.first, Array::FromVector(kv.second)); } diff --git a/lib/remote/url.cpp b/lib/remote/url.cpp index ed79fe3b4..cc88bf35f 100644 --- a/lib/remote/url.cpp +++ b/lib/remote/url.cpp @@ -138,33 +138,11 @@ const std::vector& Url::GetPath() const return m_Path; } -const std::map >& Url::GetQuery() const +const std::vector>& Url::GetQuery() const { return m_Query; } -String Url::GetQueryElement(const String& name) const -{ - auto it = m_Query.find(name); - - if (it == m_Query.end()) - return String(); - - return it->second.back(); -} - -const std::vector& Url::GetQueryElements(const String& name) const -{ - auto it = m_Query.find(name); - - if (it == m_Query.end()) { - static std::vector emptyVector; - return emptyVector; - } - - return it->second; -} - String Url::GetFragment() const { return m_Fragment; @@ -200,7 +178,7 @@ void Url::SetPath(const std::vector& path) m_Path = path; } -void Url::SetQuery(const std::map >& query) +void Url::SetQuery(const std::vector>& query) { m_Query = query; } @@ -212,16 +190,7 @@ void Url::SetArrayFormatUseBrackets(bool useBrackets) void Url::AddQueryElement(const String& name, const String& value) { - auto it = m_Query.find(name); - if (it == m_Query.end()) { - m_Query[name] = std::vector { value }; - } else - m_Query[name].push_back(value); -} - -void Url::SetQueryElements(const String& name, const std::vector& values) -{ - m_Query[name] = values; + m_Query.emplace_back(name, value); } void Url::SetFragment(const String& fragment) { @@ -255,38 +224,16 @@ String Url::Format(bool onlyPathAndQuery, bool printCredentials) const if (!m_Query.empty()) { typedef std::pair > kv_pair; - for (const kv_pair& kv : m_Query) { + for (const auto& kv : m_Query) { String key = Utility::EscapeString(kv.first, ACQUERY_ENCODE, false); if (param.IsEmpty()) param = "?"; else param += "&"; - // Just one (or one empty) value - if (kv.second.size() == 1) { - param += key; - param += kv.second[0].IsEmpty() ? - String() : "=" + Utility::EscapeString(kv.second[0], ACQUERY_ENCODE, false); - continue; - } - - // Array - String temp; - for (const String& s : kv.second) { - if (!temp.IsEmpty()) - temp += "&"; - - temp += key; - - if (m_ArrayFormatUseBrackets) { - if (kv.second.size() > 1) - temp += "[]"; - } - - if (!s.IsEmpty()) - temp += "=" + Utility::EscapeString(s, ACQUERY_ENCODE, false); - } - param += temp; + param += key; + param += kv.second.IsEmpty() ? + String() : "=" + Utility::EscapeString(kv.second, ACQUERY_ENCODE, false); } } @@ -408,14 +355,7 @@ bool Url::ParseQuery(const String& query) if (!ValidateToken(key, ACQUERY)) return false; - key = Utility::UnescapeString(key); - - auto it = m_Query.find(key); - - if (it == m_Query.end()) { - m_Query[key] = std::vector { std::move(value) }; - } else - m_Query[key].emplace_back(std::move(value)); + m_Query.emplace_back(Utility::UnescapeString(key), std::move(value)); } return true; diff --git a/lib/remote/url.hpp b/lib/remote/url.hpp index d25b5607c..1f74097b6 100644 --- a/lib/remote/url.hpp +++ b/lib/remote/url.hpp @@ -26,6 +26,7 @@ #include "base/array.hpp" #include "base/value.hpp" #include +#include #include namespace icinga @@ -53,9 +54,7 @@ public: String GetHost() const; String GetPort() const; const std::vector& GetPath() const; - const std::map >& GetQuery() const; - String GetQueryElement(const String& name) const; - const std::vector& GetQueryElements(const String& name) const; + const std::vector>& GetQuery() const; String GetFragment() const; void SetScheme(const String& scheme); @@ -64,11 +63,10 @@ public: void SetHost(const String& host); void SetPort(const String& port); void SetPath(const std::vector& path); - void SetQuery(const std::map >& query); + void SetQuery(const std::vector>& query); void SetArrayFormatUseBrackets(bool useBrackets = true); void AddQueryElement(const String& name, const String& query); - void SetQueryElements(const String& name, const std::vector& query); void SetFragment(const String& fragment); private: @@ -78,7 +76,7 @@ private: String m_Host; String m_Port; std::vector m_Path; - std::map > m_Query; + std::vector> m_Query; bool m_ArrayFormatUseBrackets; String m_Fragment; diff --git a/test/remote-url.cpp b/test/remote-url.cpp index 19e5ffe06..892685bb9 100644 --- a/test/remote-url.cpp +++ b/test/remote-url.cpp @@ -53,31 +53,50 @@ BOOST_AUTO_TEST_CASE(get_and_set) BOOST_CHECK(url->Format(false, true) == "ftp://Horst:Seehofer@koenigreich.bayern:1918/path/to/m%C3%BCnchen"); - std::map > m; - std::vector v1 { "hip", "hip", "hurra" }; - std::vector v2 { "äü^ä+#ül-" }; - std::vector v3 { "1", "2" }; - m.insert(std::make_pair("shout", v1)); - m.insert(std::make_pair("sonderzeichen", v2)); - url->SetQuery(m); - url->SetQueryElements("count", v3); + url->SetQuery({ + {"shout", "hip"}, + {"shout", "hip"}, + {"shout", "hurra"}, + {"sonderzeichen", "äü^ä+#ül-"} + }); url->AddQueryElement("count", "3"); - std::map > mn = url->GetQuery(); - BOOST_CHECK(mn["shout"][0] == v1[0]); - BOOST_CHECK(mn["sonderzeichen"][0] == v2[0]); - BOOST_CHECK(mn["count"][2] == "3"); + auto mn (url->GetQuery()); + + BOOST_CHECK(mn.size() == 5); + + BOOST_CHECK(mn[0].first == "shout"); + BOOST_CHECK(mn[0].second == "hip"); + + BOOST_CHECK(mn[1].first == "shout"); + BOOST_CHECK(mn[1].second == "hip"); + + BOOST_CHECK(mn[2].first == "shout"); + BOOST_CHECK(mn[2].second == "hurra"); + + BOOST_CHECK(mn[3].first == "sonderzeichen"); + BOOST_CHECK(mn[3].second == "äü^ä+#ül-"); + + BOOST_CHECK(mn[4].first == "count"); + BOOST_CHECK(mn[4].second == "3"); } BOOST_AUTO_TEST_CASE(parameters) { Url::Ptr url = new Url("https://icinga.com/hya/?rain=karl&rair=robert&foo[]=bar"); - BOOST_CHECK(url->GetQueryElement("rair") == "robert"); - BOOST_CHECK(url->GetQueryElement("rain") == "karl"); - std::vector test = url->GetQueryElements("foo"); - BOOST_CHECK(test.size() == 1); - BOOST_CHECK(test[0] == "bar"); + auto query (url->GetQuery()); + + BOOST_CHECK(query.size() == 3); + + BOOST_CHECK(query[0].first == "rain"); + BOOST_CHECK(query[0].second == "karl"); + + BOOST_CHECK(query[1].first == "rair"); + BOOST_CHECK(query[1].second == "robert"); + + BOOST_CHECK(query[2].first == "foo"); + BOOST_CHECK(query[2].second == "bar"); } BOOST_AUTO_TEST_CASE(format) From 268bd85752b8ae76132d5f290cc2155793831f9c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 21 Dec 2018 11:54:48 +0100 Subject: [PATCH 0397/1162] Url#m_Query: test order preservation refs #6536 --- test/remote-url.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/remote-url.cpp b/test/remote-url.cpp index 892685bb9..6675a56dd 100644 --- a/test/remote-url.cpp +++ b/test/remote-url.cpp @@ -83,17 +83,17 @@ BOOST_AUTO_TEST_CASE(get_and_set) BOOST_AUTO_TEST_CASE(parameters) { - Url::Ptr url = new Url("https://icinga.com/hya/?rain=karl&rair=robert&foo[]=bar"); + Url::Ptr url = new Url("https://icinga.com/hya/?rair=robert&rain=karl&foo[]=bar"); auto query (url->GetQuery()); BOOST_CHECK(query.size() == 3); - BOOST_CHECK(query[0].first == "rain"); - BOOST_CHECK(query[0].second == "karl"); + BOOST_CHECK(query[0].first == "rair"); + BOOST_CHECK(query[0].second == "robert"); - BOOST_CHECK(query[1].first == "rair"); - BOOST_CHECK(query[1].second == "robert"); + BOOST_CHECK(query[1].first == "rain"); + BOOST_CHECK(query[1].second == "karl"); BOOST_CHECK(query[2].first == "foo"); BOOST_CHECK(query[2].second == "bar"); From 61860563a6f321248a3fcb4965ceb619a475fff9 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 21 Dec 2018 12:43:04 +0100 Subject: [PATCH 0398/1162] Make string builder reusable --- lib/base/CMakeLists.txt | 1 + lib/base/object-packer.cpp | 26 +++++++++---------- lib/base/stringbuilder.cpp | 53 ++++++++++++++++++++++++++++++++++++++ lib/base/stringbuilder.hpp | 53 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 lib/base/stringbuilder.cpp create mode 100644 lib/base/stringbuilder.hpp diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 5dda17939..e1cbd6669 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -81,6 +81,7 @@ set(base_SOURCES stream.cpp stream.hpp streamlogger.cpp streamlogger.hpp streamlogger-ti.hpp string.cpp string.hpp string-script.cpp + stringbuilder.cpp stringbuilder.hpp sysloglogger.cpp sysloglogger.hpp sysloglogger-ti.hpp tcpsocket.cpp tcpsocket.hpp threadpool.cpp threadpool.hpp diff --git a/lib/base/object-packer.cpp b/lib/base/object-packer.cpp index 03e61b971..4100ba52e 100644 --- a/lib/base/object-packer.cpp +++ b/lib/base/object-packer.cpp @@ -22,6 +22,7 @@ #include "base/dictionary.hpp" #include "base/array.hpp" #include "base/objectlock.hpp" +#include "base/stringbuilder.hpp" #include #include #include @@ -30,9 +31,6 @@ using namespace icinga; -// Just for the sake of code readability -typedef std::vector StringBuilder; - union EndiannessDetector { EndiannessDetector() @@ -105,7 +103,7 @@ static inline void PackUInt64BE(uint_least64_t i, StringBuilder& builder) UIntToByte(i & 255u) }; - builder.insert(builder.end(), (char*)buf, (char*)buf + 8); + builder.Append((char*)buf, (char*)buf + 8); } union Double2BytesConverter @@ -142,7 +140,7 @@ static inline void PackFloat64BE(double f, StringBuilder& builder) SwapBytes(converter.buf[3], converter.buf[4]); } - builder.insert(builder.end(), (char*)converter.buf, (char*)converter.buf + 8); + builder.Append((char*)converter.buf, (char*)converter.buf + 8); } /** @@ -151,7 +149,7 @@ static inline void PackFloat64BE(double f, StringBuilder& builder) static inline void PackString(const String& string, StringBuilder& builder) { PackUInt64BE(string.GetLength(), builder); - builder.insert(builder.end(), string.Begin(), string.End()); + builder.Append(string); } /** @@ -161,7 +159,7 @@ static inline void PackArray(const Array::Ptr& arr, StringBuilder& builder) { ObjectLock olock(arr); - builder.emplace_back(5); + builder.Append('\5'); PackUInt64BE(arr->GetLength(), builder); for (const Value& value : arr) { @@ -176,7 +174,7 @@ static inline void PackDictionary(const Dictionary::Ptr& dict, StringBuilder& bu { ObjectLock olock(dict); - builder.emplace_back(6); + builder.Append('\6'); PackUInt64BE(dict->GetLength(), builder); for (const Dictionary::Pair& kv : dict) { @@ -192,21 +190,21 @@ static void PackAny(const Value& value, StringBuilder& builder) { switch (value.GetType()) { case ValueString: - builder.emplace_back(4); + builder.Append('\4'); PackString(value.Get(), builder); break; case ValueNumber: - builder.emplace_back(3); + builder.Append('\3'); PackFloat64BE(value.Get(), builder); break; case ValueBoolean: - builder.emplace_back(value.ToBool() ? 2 : 1); + builder.Append(value.ToBool() ? '\2' : '\1'); break; case ValueEmpty: - builder.emplace_back(0); + builder.Append('\0'); break; case ValueObject: @@ -226,7 +224,7 @@ static void PackAny(const Value& value, StringBuilder& builder) } } - builder.emplace_back(0); + builder.Append('\0'); break; default: @@ -262,5 +260,5 @@ String icinga::PackObject(const Value& value) StringBuilder builder; PackAny(value, builder); - return String(builder.begin(), builder.end()); + return builder.ToString(); } diff --git a/lib/base/stringbuilder.cpp b/lib/base/stringbuilder.cpp new file mode 100644 index 000000000..f0c44c8c4 --- /dev/null +++ b/lib/base/stringbuilder.cpp @@ -0,0 +1,53 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#include "base/stringbuilder.hpp" +#include + +using namespace icinga; + +void StringBuilder::Append(const String& str) +{ + m_Buffer.insert(m_Buffer.end(), str.Begin(), str.End()); +} + +void StringBuilder::Append(const std::string& str) +{ + m_Buffer.insert(m_Buffer.end(), str.begin(), str.end()); +} + +void StringBuilder::Append(const char *begin, const char *end) +{ + m_Buffer.insert(m_Buffer.end(), begin, end); +} + +void StringBuilder::Append(const char *cstr) +{ + m_Buffer.insert(m_Buffer.end(), cstr, cstr + std::strlen(cstr)); +} + +void StringBuilder::Append(char chr) +{ + m_Buffer.emplace_back(chr); +} + +String StringBuilder::ToString() const +{ + return String(m_Buffer.data(), m_Buffer.data() + m_Buffer.size()); +} diff --git a/lib/base/stringbuilder.hpp b/lib/base/stringbuilder.hpp new file mode 100644 index 000000000..841ce19bf --- /dev/null +++ b/lib/base/stringbuilder.hpp @@ -0,0 +1,53 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#ifndef STRINGBUILDER_H +#define STRINGBUILDER_H + +#include "base/i2-base.hpp" +#include "base/string.hpp" +#include +#include + +namespace icinga +{ + +/** + * A string builder. + * + * @ingroup base + */ +class StringBuilder final +{ +public: + void Append(const String&); + void Append(const std::string&); + void Append(const char *, const char *); + void Append(const char *); + void Append(char); + + String ToString() const; + +private: + std::vector m_Buffer; +}; + +} + +#endif /* STRINGBUILDER_H */ From 375a0344363249f9d8f7364d3058e91628329cd2 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Sat, 22 Dec 2018 10:43:35 +0400 Subject: [PATCH 0399/1162] Add temp CheckCommand definition --- doc/10-icinga-template-library.md | 13 +++++++++++++ itl/plugins-contrib.d/hardware.conf | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index e8f48ab28..76e287a9e 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2579,6 +2579,19 @@ openmanage_timeout | **Optional.** Plugin timeout in seconds [default=30] openmanage_vdisk_critical | **Optional.** Make any alerts on virtual disks critical openmanage_warning | **Optional.** Custom temperature warning limits +#### temp + +The [check_temp](https://github.com/jackbenny/check_temp) plugin, +uses the `lm-sensors` binary to monitor temperature sensors. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|---------------------------------------------------------------------------------- +temp_warning | **Required.** Exit with WARNING status if above INTEGER degrees +temp_critical | **Required.** Exit with CRITICAL status if above INTEGER degrees +temp_sensor | **Optional.** Set what to monitor, for example CPU or MB (or M/B). Check sensors for the correct word. Default is CPU. + #### adaptec-raid The [check_adaptec_raid](https://github.com/thomas-krenn/check_adaptec_raid) plugin diff --git a/itl/plugins-contrib.d/hardware.conf b/itl/plugins-contrib.d/hardware.conf index e88b611d2..53455a242 100644 --- a/itl/plugins-contrib.d/hardware.conf +++ b/itl/plugins-contrib.d/hardware.conf @@ -204,3 +204,28 @@ object CheckCommand "openmanage" { } } } + +object CheckCommand "temp" { + command = [ PluginDir + "/check_temp" ] + + arguments = { + "-w" = { + value = "$temp_warning$" + description = "Exit with WARNING status if above INTEGER degrees" + required = true + } + "-c" = { + value = "$temp_critical$" + description = "Exit with CRITICAL status if above INTEGER degrees" + required = true + } + "--sensor" = { + value = "$temp_sensor$" + description = "Set what to monitor, for example CPU or MB (or M/B). Check sensors for the correct word. Default is CPU." + } + } + + vars.temp_warning = "75" + vars.temp_critical = "80" + vars.temp_sensor = "Core" +} From 5f58414aea39eec869095f709b6257484e99b01d Mon Sep 17 00:00:00 2001 From: BarbUk Date: Sat, 22 Dec 2018 11:01:30 +0400 Subject: [PATCH 0400/1162] Add proxysql CheckCommand definition --- doc/10-icinga-template-library.md | 22 ++++++++++ itl/plugins-contrib.d/databases.conf | 61 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index e8f48ab28..4f6283d29 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2492,6 +2492,28 @@ redis_memory_utilization | **Optional.** This calculates percent of total memory redis_total_memory | **Optional.** Amount of memory on a system for memory utilization calculation. Use system memory or max_memory setting of redis. redis_replication_delay | **Optional.** Allows to set threshold on replication delay info. +#### proxysql + +The [check_proxysql](https://github.com/sysown/proxysql-nagios) plugin, +uses the `proxysql` binary to monitor [proxysql](https://proxysql.com/). + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +-----------------------------|---------------------------------------------------------------------------------- +proxysql_user | **Optional.** ProxySQL admin username (default=admin) +proxysql_password | **Optional.** ProxySQL admin password (default=admin) +proxysql_host | **Optional.** ProxySQL hostname / IP (default=127.0.0.1) +proxysql_port | **Optional.** ProxySQL admin port (default=6032) +proxysql_defaultfile | **Optional.** ProxySQL defaults file +proxysql_type | **Required.** ProxySQL check type (one of conns,hg,rules,status,var) +proxysql_name | **Optional.** ProxySQL variable name to check +proxysql_lower | **Optional.** Alert if ProxySQL value are LOWER than defined WARN / CRIT thresholds (only applies to 'var' check type) +proxysql_runtime | **Optional.** Force ProxySQL Nagios check to query the runtime_mysql_XXX tables rather than the mysql_XXX tables +proxysql_warning | **Optional.** Warning threshold +proxysql_critical | **Optional.** Critical threshold +proxysql\_include\_hostgroup | **Optional.** ProxySQL hostgroup(s) to include (only applies to '--type hg' checks, accepts comma-separated list) +proxysql\_ignore\_hostgroup | **Optional.** ProxySQL hostgroup(s) to ignore (only applies to '--type hg' checks, accepts comma-separated list) ### Hardware diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index c12475d19..18ddc7311 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -842,3 +842,64 @@ object CheckCommand "redis" { vars.redis_perfparse = false vars.redis_prev_perfdata = false } + +object CheckCommand "proxysql" { + import "plugin-check-command" + command = [ PluginDir + "/check_proxysql" ] + + arguments = { + "--user" = { + value = "$proxysql_user$" + description = "ProxySQL admin username (default=admin)" + } + "--password" = { + value = "$proxysql_password$" + description = "ProxySQL admin password (default=admin)" + } + "--host" = { + value = "$proxysql_host$" + description = "ProxySQL hostname / IP (default=127.0.0.1)" + } + "--port" = { + value = "$proxysql_port$" + description = "ProxySQL admin port (default=6032)" + } + "--defaults-file" = { + value = "$proxysql_defaultfile$" + description = "ProxySQL defaults file" + } + "--type" = { + value = "$proxysql_type$" + description = "ProxySQL check type (one of conns,hg,rules,status,var)" + required = true + } + "--name" = { + value = "$proxysql_name$" + description = "ProxySQL variable name to check" + } + "--lower" = { + value = "$proxysql_lower$" + description = "Alert if ProxySQL value are LOWER than defined WARN / CRIT thresholds (only applies to 'var' check type)" + } + "--runtime" = { + value = "$proxysql_runtime$" + description = "Force ProxySQL Nagios check to query the runtime_mysql_XXX tables rather than the mysql_XXX tables" + } + "--warning" = { + value = "$proxysql_warning$" + description = "Warning threshold" + } + "--critical" = { + value = "$proxysql_critical$" + description = "Critical threshold" + } + "--include-hostgroup" = { + value = "$proxysql_include_hostgroup$" + description = "ProxySQL hostgroup(s) to include (only applies to '--type hg' checks, accepts comma-separated list)" + } + "--ignore-hostgroup" = { + value = "$proxysql_ignore_hostgroup$" + description = "ProxySQL hostgroup(s) to ignore (only applies to '--type hg' checks, accepts comma-separated list)" + } + } +} From 3e2449716b37f369527e7e11b792f13acee32524 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Sat, 22 Dec 2018 11:19:18 +0400 Subject: [PATCH 0401/1162] Add hddtemp CheckCommand definition --- doc/10-icinga-template-library.md | 28 +++++++++++++++ itl/plugins-contrib.d/hardware.conf | 53 +++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index e8f48ab28..04d28af81 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2579,6 +2579,34 @@ openmanage_timeout | **Optional.** Plugin timeout in seconds [default=30] openmanage_vdisk_critical | **Optional.** Make any alerts on virtual disks critical openmanage_warning | **Optional.** Custom temperature warning limits +#### hddtemp + +The [check_hddtemp](https://github.com/vint21h/nagios-check-hddtemp) plugin, +uses the `hddtemp` binary to monitor hard drive temperature. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +------------------------|---------------------------------------------------------------------------------- +hddtemp_server | **Required.** server name or address +hddtemp_port | **Optional.** port number +hddtemp_devices | **Optional.** comma separated devices list, or empty for all devices in hddtemp response +hddtemp_separator | **Optional.** hddtemp separator +hddtemp_warning | **Required.** warning temperature +hddtemp_critical | **Required.** critical temperature +hddtemp_timeout | **Optional.** receiving data from hddtemp operation network timeout +hddtemp_performance | **Optional.** If set, return performance data +hddtemp_quiet | **Optional.** If set, be quiet + +The following sane default value are specified: +``` +vars.hddtemp_server = "127.0.0.1" +vars.hddtemp_warning = 55 +vars.hddtemp_critical = 60 +vars.hddtemp_performance = true +vars.hddtemp_timeout = 5 +``` + #### adaptec-raid The [check_adaptec_raid](https://github.com/thomas-krenn/check_adaptec_raid) plugin diff --git a/itl/plugins-contrib.d/hardware.conf b/itl/plugins-contrib.d/hardware.conf index e88b611d2..3a5fefeac 100644 --- a/itl/plugins-contrib.d/hardware.conf +++ b/itl/plugins-contrib.d/hardware.conf @@ -204,3 +204,56 @@ object CheckCommand "openmanage" { } } } + +object CheckCommand "hddtemp" { + import "plugin-check-command" + command = [ PluginDir + "/check_hddtemp" ] + + arguments = { + "--server" = { + value = "$hddtemp_server$" + description = "server name or address" + required = true + } + "--port" = { + value = "$hddtemp_port$" + description = "port number" + } + "--devices" = { + value = "$hddtemp_devices$" + description = "comma separated devices list, or empty for all devices in hddtemp response" + } + "--separator" = { + value = "$hddtemp_separator$" + description = "hddtemp separator" + } + "--warning" = { + value = "$hddtemp_warning$" + description = "warning temperature" + required = true + } + "--critical" = { + value = "$hddtemp_critical$" + description = "critical temperature" + required = true + } + "--timeout" = { + value = "$hddtemp_timeout$" + description = "receiving data from hddtemp operation network timeout" + } + "--performance-data" = { + set_if = "$hddtemp_performance$" + description = "return performance data" + } + "--quiet" = { + set_if = "$hddtemp_quiet$" + description = "be quiet" + } + } + + vars.hddtemp_server = "127.0.0.1" + vars.hddtemp_warning = 55 + vars.hddtemp_critical = 60 + vars.hddtemp_performance = true + vars.hddtemp_timeout = 5 +} From dae69dc49b2651971063aa6ea76b9710c65086ed Mon Sep 17 00:00:00 2001 From: BarbUk Date: Sat, 22 Dec 2018 13:51:27 +0400 Subject: [PATCH 0402/1162] Add phpfpm-status CheckCommand definition --- doc/10-icinga-template-library.md | 25 +++++++++++ itl/plugins-contrib.d/web.conf | 71 +++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index e8f48ab28..136bc326a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5415,3 +5415,28 @@ haproxy_url | **Required.** URL of the HAProxy csv statistics page. haproxy_timeout | **Optional.** Seconds before plugin times out (default: 10) haproxy_warning | **Optional.** Warning request time threshold (in seconds) haproxy_critical | **Optional.** Critical request time threshold (in seconds) + +#### phpfpm_status + +The [check_phpfpm_status](http://github.com/regilero/check_phpfpm_status) plugin, +uses the `php-fpm` status page to monitor php-fpm. + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +--------------------------|---------------------------------------------------------------------------------- +phpfpm\_status\_hostname | **Required.** name or IP address of host to check +phpfpm\_status\_port | **Optional.** Http port, or Fastcgi port when using --fastcgi +phpfpm\_status\_url | **Optional.** Specific URL (only the path part of it in fact) to use, instead of the default /fpm-status +phpfpm\_status\_servername| **Optional.** ServerName, (host header of HTTP request) use it if you specified an IP in -H to match the good Virtualhost in your target +phpfpm\_status\_fastcgi | **Optional.** If set, connect directly to php-fpm via network or local socket, using fastcgi protocol instead of HTTP. +phpfpm\_status\_user | **Optional.** Username for basic auth +phpfpm\_status\_pass | **Optional.** Password for basic auth +phpfpm\_status\_realm | **Optional.** Realm for basic auth +phpfpm\_status\_debug | **Optional.** If set, debug mode (show http request response) +phpfpm\_status\_timeout | **Optional.** timeout in seconds (Default: 15) +phpfpm\_status\_ssl | **Optional.** Wether we should use HTTPS instead of HTTP. Note that you can give some extra parameters to this settings. Default value is 'TLSv1' but you could use things like 'TLSv1_1' or 'TLSV1_2' (or even 'SSLv23:!SSLv2:!SSLv3' for old stuff). +phpfpm\_status\_verifyssl | **Optional.** If set, verify certificate and hostname from ssl cert, default is 0 (no security), set it to 1 to really make SSL peer name and certificater checks. +phpfpm\_status\_cacert | **Optional.** Full path to the cacert.pem certificate authority used to verify ssl certificates (use with --verifyssl). if not given the cacert from Mozilla::CA cpan plugin will be used. +phpfpm\_status\_warn | **Optional.** MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED number of available workers, or max states reached that will cause a warning. -1 for no warning +phpfpm\_status\_critical | **Optional.** MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED number of available workers, or max states reached that will cause an error, -1 for no CRITICAL diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 73266e3b1..cccadefc1 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -618,3 +618,74 @@ object CheckCommand "haproxy" { } } } + +object CheckCommand "phpfpm_status" { + import "plugin-check-command" + command = [ PluginDir + "/check_phpfpm_status" ] + + arguments = { + "-H" = { + value = "$phpfpm_status_hostname$" + description = "name or IP address of host to check" + required = true + } + "-p" = { + value = "$phpfpm_status_port$" + description = "Http port, or Fastcgi port when using --fastcgi" + } + "-u" = { + value = "$phpfpm_status_url$" + description = "Specific URL (only the path part of it in fact) to use, instead of the default /fpm-status" + } + "-s" = { + value = "$phpfpm_status_servername$" + description = "ServerName, (host header of HTTP request) use it if you specified an IP in -H to match the good Virtualhost in your target" + } + "-f" = { + set_if = "$phpfpm_status_fastcgi$" + description = "Connect directly to php-fpm via network or local socket, using fastcgi protocol instead of HTTP." + } + "-U" = { + value = "$phpfpm_status_user$" + description = "Username for basic auth" + } + "-P" = { + value = "$phpfpm_status_pass$" + description = "Password for basic auth" + } + "-r" = { + value = "$phpfpm_status_realm$" + description = "Realm for basic auth" + } + "-d" = { + set_if = "$phpfpm_status_debug$" + description = "Debug mode (show http request response)" + } + "-t" = { + value = "$phpfpm_status_timeout$" + description = "timeout in seconds (Default: 15)" + } + "-S" = { + set_if = "$phpfpm_status_ssl$" + description = "Wether we should use HTTPS instead of HTTP. Note that you can give some extra parameters to this settings. Default value is 'TLSv1' but you could use things like 'TLSv1_1' or 'TLSV1_2' (or even 'SSLv23:!SSLv2:!SSLv3' for old stuff)." + } + "-x" = { + set_if = "$phpfpm_status_verifyssl$" + description = "verify certificate and hostname from ssl cert, default is 0 (no security), set it to 1 to really make SSL peer name and certificater checks." + } + "-X" = { + value = "$phpfpm_status_cacert$" + description = "Full path to the cacert.pem certificate authority used to verify ssl certificates (use with --verifyssl). if not given the cacert from Mozilla::CA cpan plugin will be used." + } + "-w" = { + value = "$phpfpm_status_warn$" + description = "MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED number of available workers, or max states reached that will cause a warning. -1 for no warning" + } + "-c" = { + value = "$phpfpm_status_critical$" + description = "MIN_AVAILABLE_PROCESSES,PROC_MAX_REACHED,QUEUE_MAX_REACHED number of available workers, or max states reached that will cause an error, -1 for no CRITICAL" + } + } + + vars.phpfpm_status_hostname = "$address$" +} From 1c3c01f17b17a06c55611f636caaae18075b25f6 Mon Sep 17 00:00:00 2001 From: BarbUk Date: Sun, 23 Dec 2018 18:26:24 +0400 Subject: [PATCH 0403/1162] Rename check_temp to check_lmsensors --- doc/10-icinga-template-library.md | 10 +++++----- itl/plugins-contrib.d/hardware.conf | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index f0b4da694..b7b2cee09 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2601,18 +2601,18 @@ openmanage_timeout | **Optional.** Plugin timeout in seconds [default=30] openmanage_vdisk_critical | **Optional.** Make any alerts on virtual disks critical openmanage_warning | **Optional.** Custom temperature warning limits -#### temp +#### lmsensors -The [check_temp](https://github.com/jackbenny/check_temp) plugin, +The [check_lmsensors](https://github.com/jackbenny/check_temp) plugin, uses the `lm-sensors` binary to monitor temperature sensors. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): Name | Description ------------------------|---------------------------------------------------------------------------------- -temp_warning | **Required.** Exit with WARNING status if above INTEGER degrees -temp_critical | **Required.** Exit with CRITICAL status if above INTEGER degrees -temp_sensor | **Optional.** Set what to monitor, for example CPU or MB (or M/B). Check sensors for the correct word. Default is CPU. +lmsensors_warning | **Required.** Exit with WARNING status if above INTEGER degrees +lmsensors_critical | **Required.** Exit with CRITICAL status if above INTEGER degrees +lmsensors_sensor | **Optional.** Set what to monitor, for example CPU or MB (or M/B). Check sensors for the correct word. Default is CPU. #### hddtemp diff --git a/itl/plugins-contrib.d/hardware.conf b/itl/plugins-contrib.d/hardware.conf index 46ce83604..29d7b91b5 100644 --- a/itl/plugins-contrib.d/hardware.conf +++ b/itl/plugins-contrib.d/hardware.conf @@ -205,29 +205,29 @@ object CheckCommand "openmanage" { } } -object CheckCommand "temp" { - command = [ PluginDir + "/check_temp" ] +object CheckCommand "lmsensors" { + command = [ PluginDir + "/check_lmsensors" ] arguments = { "-w" = { - value = "$temp_warning$" + value = "$lmsensors_warning$" description = "Exit with WARNING status if above INTEGER degrees" required = true } "-c" = { - value = "$temp_critical$" + value = "$lmsensors_critical$" description = "Exit with CRITICAL status if above INTEGER degrees" required = true } "--sensor" = { - value = "$temp_sensor$" + value = "$lmsensors_sensor$" description = "Set what to monitor, for example CPU or MB (or M/B). Check sensors for the correct word. Default is CPU." } } - vars.temp_warning = "75" - vars.temp_critical = "80" - vars.temp_sensor = "Core" + vars.lmsensors_warning = "75" + vars.lmsensors_critical = "80" + vars.lmsensors_sensor = "Core" } object CheckCommand "hddtemp" { From 63a7dc352c82462852952e85df574ed96bbcd8cd Mon Sep 17 00:00:00 2001 From: BarbUk Date: Mon, 24 Dec 2018 10:32:37 +0400 Subject: [PATCH 0404/1162] Add haproxy-status CheckCommand definition Another haproxy CheckCommand. This plugin uses haproxy stat socket to check for all or specific frontend/backend status. --- doc/10-icinga-template-library.md | 24 +++++++++++++++++ itl/plugins-contrib.d/web.conf | 45 +++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 4b7f13acc..8a2da4fb6 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5466,6 +5466,30 @@ haproxy_timeout | **Optional.** Seconds before plugin times out (default haproxy_warning | **Optional.** Warning request time threshold (in seconds) haproxy_critical | **Optional.** Critical request time threshold (in seconds) +#### haproxy-status + +The [check_haproxy_status](https://github.com/jonathanio/monitoring-nagios-haproxy) plugin, +uses the `haproxy` statistics socket to monitor [haproxy](http://www.haproxy.org/) frontends/backends. + +This plugin need read/write access to the statistics socket with an operator level. You can configure it in the global section of haproxy to allow icinga user to use it: +``` +stats socket /run/haproxy/admin.sock user haproxy group icinga mode 660 level operator +``` + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +----------------------------|---------------------------------------------------------------------------------- +haproxy\_status\_default | **Optional.** Set/Override the defaults which will be applied to all checks (unless specifically set by --overrides). +haproxy\_status\_frontends | **Optional.** Enable checks for the frontends in HAProxy (that they're marked as OPEN and the session limits haven't been reached). +haproxy\_status\_nofrontends| **Optional.** Disable checks for the frontends in HAProxy (that they're marked as OPEN and the session limits haven't been reached). +haproxy\_status\_backends | **Optional.** Enable checks for the backends in HAProxy (that they have the required quorum of servers, and that the session limits haven't been reached). +haproxy\_status\_nobackends | **Optional.** Disable checks for the backends in HAProxy (that they have the required quorum of servers, and that the session limits haven't been reached). +haproxy\_status\_servers | **Optional.** Enable checks for the servers in HAProxy (that they haven't reached the limits for the sessions or for queues). +haproxy\_status\_noservers | **Optional.** Disable checks for the servers in HAProxy (that they haven't reached the limits for the sessions or for queues). +haproxy\_status\_overrides | **Optional.** Override the defaults for a particular frontend or backend, in the form {name}:{override}, where {override} is the same format as --defaults above. +haproxy\_status\_socket | **Required.** Path to the socket check_haproxy should connect to + #### phpfpm_status The [check_phpfpm_status](http://github.com/regilero/check_phpfpm_status) plugin, diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index cccadefc1..0585248f1 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -619,6 +619,51 @@ object CheckCommand "haproxy" { } } +object CheckCommand "haproxy_status" { + import "plugin-check-command" + command = [ PluginDir + "/check_haproxy_status" ] + + arguments = { + "--defaults" = { + value = "$haproxy_status_default$" + description = "Set/Override the defaults which will be applied to all checks (unless specifically set by --overrides)." + } + "--frontends" = { + set_if = "$haproxy_status_frontends$" + description = "Enable checks for the frontends in HAProxy (that they're marked as OPEN and the session limits haven't been reached)." + } + "--nofrontends" = { + set_if = "$haproxy_status_nofrontends$" + description = "Disable checks for the frontends in HAProxy (that they're marked as OPEN and the session limits haven't been reached)." + } + "--backends" = { + set_if = "$haproxy_status_backends$" + description = "Enable checks for the backends in HAProxy (that they have the required quorum of servers, and that the session limits haven't been reached)." + } + "--nobackends" = { + set_if = "$haproxy_status_nobackends$" + description = "Disable checks for the backends in HAProxy (that they have the required quorum of servers, and that the session limits haven't been reached)." + } + "--servers" = { + set_if = "$haproxy_status_servers$" + description = "Enable checks for the servers in HAProxy (that they haven't reached the limits for the sessions or for queues)." + } + "--noservers" = { + set_if = "$haproxy_status_noservers$" + description = "Disable checks for the servers in HAProxy (that they haven't reached the limits for the sessions or for queues)." + } + "--overrides" = { + value = "$haproxy_status_overrides$" + description = "Override the defaults for a particular frontend or backend, in the form {name}:{override}, where {override} is the same format as --defaults above." + } + "--socket" = { + value = "$haproxy_status_socket$" + description = "Path to the socket check_haproxy should connect to" + required = true + } + } +} + object CheckCommand "phpfpm_status" { import "plugin-check-command" command = [ PluginDir + "/check_phpfpm_status" ] From df336740727b33e184a932141811ebdd0227a86c Mon Sep 17 00:00:00 2001 From: BarbUk Date: Mon, 24 Dec 2018 10:37:24 +0400 Subject: [PATCH 0405/1162] Fix plugin name in documentation --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 8a2da4fb6..1fd32d291 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5466,7 +5466,7 @@ haproxy_timeout | **Optional.** Seconds before plugin times out (default haproxy_warning | **Optional.** Warning request time threshold (in seconds) haproxy_critical | **Optional.** Critical request time threshold (in seconds) -#### haproxy-status +#### haproxy_status The [check_haproxy_status](https://github.com/jonathanio/monitoring-nagios-haproxy) plugin, uses the `haproxy` statistics socket to monitor [haproxy](http://www.haproxy.org/) frontends/backends. From f4ab0737d127284dae76483c7c4b0638e4a5f01d Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 7 Jan 2019 15:32:19 +0100 Subject: [PATCH 0406/1162] HttpServerConnection#DataAvailableHandler(): reduce log spam --- lib/remote/httpserverconnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 83548d359..4f1a50cae 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -353,7 +353,7 @@ void HttpServerConnection::DataAvailableHandler() if (!m_Stream->IsEof()) { boost::recursive_mutex::scoped_try_lock lock(m_DataHandlerMutex); if (!lock.owns_lock()) { - Log(LogInformation, "HttpServerConnection", "Unable to process available data, they're already being processed in another thread"); + Log(LogNotice, "HttpServerConnection", "Unable to process available data, they're already being processed in another thread"); return; } From 4a7960f21b250587eb9b069f52cc60b0c780d62c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 8 Jan 2019 11:49:44 +0100 Subject: [PATCH 0407/1162] pki::RequestCertificate: handle missing certificate/CSR --- lib/remote/jsonrpcconnection-pki.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/remote/jsonrpcconnection-pki.cpp b/lib/remote/jsonrpcconnection-pki.cpp index f0ec8fe1b..0c48b3d04 100644 --- a/lib/remote/jsonrpcconnection-pki.cpp +++ b/lib/remote/jsonrpcconnection-pki.cpp @@ -52,6 +52,15 @@ Value RequestCertificateHandler(const MessageOrigin::Ptr& origin, const Dictiona else cert = StringToCertificate(certText); + if (!cert) { + Log(LogWarning, "JsonRpcConnection") << "No certificate or CSR received"; + + result->Set("status_code", 1); + result->Set("error", "No certificate or CSR received."); + + return result; + } + ApiListener::Ptr listener = ApiListener::GetInstance(); std::shared_ptr cacert = GetX509Certificate(listener->GetDefaultCaPath()); From 8470facfe2d8437d5db75e4f84434991d30032c7 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 8 Jan 2019 18:15:32 +0100 Subject: [PATCH 0408/1162] InfluxdbWriter#Stop(): flush buffer refs #6841 --- lib/perfdata/influxdbwriter.cpp | 8 ++++++++ lib/perfdata/influxdbwriter.hpp | 1 + 2 files changed, 9 insertions(+) diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 91fb1be10..80d050233 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -140,6 +140,14 @@ void InfluxdbWriter::Pause() ObjectImpl::Pause(); } +void InfluxdbWriter::Stop(bool runtimeDeleted) +{ + FlushTimeout(); + m_WorkQueue.Join(); + + ObjectImpl::Stop(runtimeDeleted); +} + void InfluxdbWriter::AssertOnWorkQueue() { ASSERT(m_WorkQueue.IsWorkerThread()); diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp index face44f69..370ca25c5 100644 --- a/lib/perfdata/influxdbwriter.hpp +++ b/lib/perfdata/influxdbwriter.hpp @@ -51,6 +51,7 @@ protected: void OnConfigLoaded() override; void Resume() override; void Pause() override; + void Stop(bool runtimeDeleted) override; private: WorkQueue m_WorkQueue{10000000, 1}; From 9ae738d17fa6220d988001e4c56155aa6535992c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 9 Jan 2019 11:27:33 +0100 Subject: [PATCH 0409/1162] Allow Checkable#retry_interval to be 0 refs #6871 --- lib/icinga/checkable-check.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index e70648d89..b159247a9 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -79,7 +79,8 @@ void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) if (interval > 1) adj = fmod(now * 100 + GetSchedulingOffset(), interval * 100) / 100.0; - adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); + if (adj != 0.0) + adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); double nextCheck = now - adj + interval; From 2aff6a5887112259d795401e907a879ce424db51 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Thu, 10 Jan 2019 11:44:14 +0100 Subject: [PATCH 0410/1162] Don't run UpdateObjectAuthority for Comments and Downtimes --- lib/remote/configobjectutility.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index 708ec0303..5575cba00 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -159,7 +159,13 @@ bool ConfigObjectUtility::CreateObject(const Type::Ptr& type, const String& full return false; } - ApiListener::UpdateObjectAuthority(); + /* if (type != Comment::TypeInstance && type != Downtime::TypeInstance) + * Does not work since this would require libicinga, which has a dependency on libremote + * Would work if these libs were static. + */ + if (type->GetName() != "Comment" && type->GetName() != "Downtime") + ApiListener::UpdateObjectAuthority(); + Log(LogInformation, "ConfigObjectUtility") << "Created and activated object '" << fullName << "' of type '" << type->GetName() << "'."; From 77d1ea63c5d1e2e5bdd938908b35db1e14331dab Mon Sep 17 00:00:00 2001 From: Martin Neubert Date: Fri, 11 Jan 2019 09:54:24 +0100 Subject: [PATCH 0411/1162] Added snmp_exclude option to manubulon snmp-storage check --- doc/10-icinga-template-library.md | 1 + itl/command-plugins-manubulon.conf | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 4b7f13acc..36ced163e 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2071,6 +2071,7 @@ snmp_crit | **Optional.** The critical threshold. snmp_storage_name | **Optional.** Storage name. Default to regex "^/$$". More options available in the [snmp storage](http://nagios.manubulon.com/snmp_storage.html) documentation. snmp_storage_type | **Optional.** Filter by storage type. Valid options are Other, Ram, VirtualMemory, FixedDisk, RemovableDisk, FloppyDisk, CompactDisk, RamDisk, FlashMemory, or NetworkDisk. No value defined as default. snmp_perf | **Optional.** Enable perfdata values. Defaults to true. +snmp_exclude | **Optional.** Select all storages except the one(s) selected by -m. No action on storage type selection. snmp_timeout | **Optional.** The command timeout in seconds. Defaults to 5 seconds. snmp_storage_olength | **Optional.** Max-size of the SNMP message, usefull in case of Too Long responses. diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index 39e9cf153..18a2ddc24 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -211,6 +211,10 @@ object CheckCommand "snmp-storage" { set_if = "$snmp_perf$" description = "Perfparse compatible output" } + "-e" = { + set_if = "$snmp_exclude$" + description = "Select all storages except the one(s) selected by -m. No action on storage type selection." + } "-o" = { value = "$snmp_storage_olength$" description = "Max-size of the SNMP message, usefull in case of Too Long responses." @@ -225,6 +229,7 @@ object CheckCommand "snmp-storage" { vars.snmp_warn = 80 vars.snmp_crit = 90 vars.snmp_perf = true + vars.snmp_exclude = false } From 3633a7cd79a684f862e5b78307a48e7edf225b91 Mon Sep 17 00:00:00 2001 From: Thomas Widhalm Date: Fri, 11 Jan 2019 13:50:07 +0100 Subject: [PATCH 0412/1162] Add new "-us" option to `ipmi-sensor` CheckCommand due to change in monitoring plugin. Fixes #6892 --- doc/10-icinga-template-library.md | 1 + itl/plugins-contrib.d/ipmi.conf | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 4b7f13acc..b03de5e57 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2752,6 +2752,7 @@ ipmi_no_sel_checking | **Optional.** Turn off system event log check ipmi_no_thresholds | **Optional.** Turn off performance data thresholds from output-sensor-thresholds. ipmi_verbose | **Optional.** Be Verbose multi line output, also with additional details for warnings. ipmi_debug | **Optional.** Be Verbose debugging output, followed by normal multi line output. +ipmi_unify_file | **Optional.** Path to the unify file to unify sensor names. #### ipmi-alive diff --git a/itl/plugins-contrib.d/ipmi.conf b/itl/plugins-contrib.d/ipmi.conf index f5eb18ae0..b290fe50d 100644 --- a/itl/plugins-contrib.d/ipmi.conf +++ b/itl/plugins-contrib.d/ipmi.conf @@ -103,6 +103,10 @@ object CheckCommand "ipmi-sensor" { set_if = "$ipmi_debug$" description = "Be Verbose debugging output, followed by normal multi line output" } + "-us" = { + value = "$ipmi_unify_file$" + description = "Path to the unify file to unify sensor names." + } } vars.ipmi_address = "$check_address$" From 3b2054761ad90e71fba82d13cd57d7388f524993 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 11 Jan 2019 18:25:12 +0100 Subject: [PATCH 0413/1162] Notification#BeginExecuteNotification(): SetNextNotification() correctly refs #5561 --- lib/icinga/notification.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index ba6ca49b4..09b5c1106 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -288,11 +288,9 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe << "': before specified begin time (" << Utility::FormatDuration(timesBegin) << ")"; /* we need to adjust the next notification time - * to now + begin delaying the first notification + * delaying the first notification */ - double nextProposedNotification = now + timesBegin + 1.0; - if (GetNextNotification() > nextProposedNotification) - SetNextNotification(nextProposedNotification); + SetNextNotification(checkable->GetLastHardStateChange() + timesBegin + 1.0); return; } From b09e7b287e6b4bbc277c9ef7828e34f884927f82 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 15 Jan 2019 19:23:20 +0100 Subject: [PATCH 0414/1162] Validate Zone::GetLocalZone() before using --- lib/icinga/downtime.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index d9b24a3d3..9f0adf708 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -252,7 +252,11 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth attrs->Set("entry_time", Utility::GetTime()); if (!scheduledDowntime.IsEmpty()) { - attrs->Set("authoritative_zone", Zone::GetLocalZone()->GetName()); + auto localZone (Zone::GetLocalZone()); + + if (localZone) { + attrs->Set("authoritative_zone", localZone->GetName()); + } } Host::Ptr host; From 2fc33996b620d97e54d75b0d8c101fb3d9ba791c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 16 Jan 2019 17:27:38 +0100 Subject: [PATCH 0415/1162] Log: Ensure not to pass negative values to localtime() refs #6887 --- lib/icinga/checkable-check.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index e70648d89..f8b1d1ff7 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -82,10 +82,11 @@ void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); double nextCheck = now - adj + interval; + double lastCheck = GetLastCheck(); Log(LogDebug, "Checkable") << "Update checkable '" << GetName() << "' with check interval '" << GetCheckInterval() - << "' from last check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", GetLastCheck()) + << "' from last check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", (lastCheck < 0 ? 0 : lastCheck)) << " (" << GetLastCheck() << ") to next check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", nextCheck) << "(" << nextCheck << ")."; SetNextCheck(nextCheck, false, origin); From 984f7be03060f89235ccee1a1ef3e5fba652a9df Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 17 Jan 2019 12:13:44 +0100 Subject: [PATCH 0416/1162] TcpSocket#Bind(): also set SO_REUSEPORT refs #6898 --- lib/base/tcpsocket.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 7ac935bf8..2c3f6c7c3 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -91,6 +91,9 @@ void TcpSocket::Bind(const String& node, const String& service, int family) const int optTrue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&optTrue), sizeof(optTrue)); +#ifndef _WIN32 + setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&optTrue), sizeof(optTrue)); +#endif /* _WIN32 */ int rc = bind(fd, info->ai_addr, info->ai_addrlen); From f0e12ff63ce138b6df9e85bc690eda46ae794ccb Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 24 Jan 2019 13:49:27 +0100 Subject: [PATCH 0417/1162] Deactivate perfdata writers after checker --- lib/perfdata/elasticsearchwriter.ti | 2 +- lib/perfdata/gelfwriter.ti | 2 +- lib/perfdata/graphitewriter.ti | 2 +- lib/perfdata/influxdbwriter.ti | 2 +- lib/perfdata/opentsdbwriter.ti | 2 +- lib/perfdata/perfdatawriter.ti | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index 7cf604fb9..c3e7fc046 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -7,7 +7,7 @@ namespace icinga class ElasticsearchWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config, required] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/gelfwriter.ti b/lib/perfdata/gelfwriter.ti index d13ee55d2..92d4a2176 100644 --- a/lib/perfdata/gelfwriter.ti +++ b/lib/perfdata/gelfwriter.ti @@ -26,7 +26,7 @@ namespace icinga class GelfWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/graphitewriter.ti b/lib/perfdata/graphitewriter.ti index b28ba87a9..4475eb184 100644 --- a/lib/perfdata/graphitewriter.ti +++ b/lib/perfdata/graphitewriter.ti @@ -26,7 +26,7 @@ namespace icinga class GraphiteWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/influxdbwriter.ti b/lib/perfdata/influxdbwriter.ti index d2f1ba6d2..a26af6d55 100644 --- a/lib/perfdata/influxdbwriter.ti +++ b/lib/perfdata/influxdbwriter.ti @@ -26,7 +26,7 @@ namespace icinga class InfluxdbWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config, required] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/opentsdbwriter.ti b/lib/perfdata/opentsdbwriter.ti index 3418e1606..09d5f3ede 100644 --- a/lib/perfdata/opentsdbwriter.ti +++ b/lib/perfdata/opentsdbwriter.ti @@ -26,7 +26,7 @@ namespace icinga class OpenTsdbWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index d2ceb6899..dbd303c75 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -27,7 +27,7 @@ namespace icinga class PerfdataWriter : ConfigObject { - activation_priority 100; + activation_priority 80; [config] String host_perfdata_path { default {{{ return Configuration::SpoolDir + "/perfdata/host-perfdata"; }}} From b81aa6af3a23cba179b9da03fda6d2674ccc0956 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 24 Jan 2019 13:55:17 +0100 Subject: [PATCH 0418/1162] CheckerComponent#Stop(): log after actually being stopped --- lib/checker/checkercomponent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index cde975b72..c14259b88 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -84,9 +84,6 @@ void CheckerComponent::Start(bool runtimeCreated) void CheckerComponent::Stop(bool runtimeRemoved) { - Log(LogInformation, "CheckerComponent") - << "'" << GetName() << "' stopped."; - { boost::mutex::scoped_lock lock(m_Mutex); m_Stopped = true; @@ -96,6 +93,9 @@ void CheckerComponent::Stop(bool runtimeRemoved) m_ResultTimer->Stop(); m_Thread.join(); + Log(LogInformation, "CheckerComponent") + << "'" << GetName() << "' stopped."; + ObjectImpl::Stop(runtimeRemoved); } From 1eaad0637b75bd24875b1e62fd080fb155b08ed7 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 24 Jan 2019 15:09:39 +0100 Subject: [PATCH 0419/1162] CheckerComponent#Stop(): wait for all running checks --- lib/base/defer.hpp | 59 ++++++++++++++++++++++++++++++++ lib/checker/checkercomponent.cpp | 12 +++++++ lib/checker/checkercomponent.hpp | 3 ++ 3 files changed, 74 insertions(+) create mode 100644 lib/base/defer.hpp diff --git a/lib/base/defer.hpp b/lib/base/defer.hpp new file mode 100644 index 000000000..05ae0b819 --- /dev/null +++ b/lib/base/defer.hpp @@ -0,0 +1,59 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#ifndef DEFER +#define DEFER + +#include +#include + +namespace icinga +{ + +/** + * An action to be executed at end of scope. + * + * @ingroup base + */ +class Defer +{ +public: + inline + Defer(std::function func) : m_Func(std::move(func)) + { + } + + Defer(const Defer&) = delete; + Defer(Defer&&) = delete; + Defer& operator=(const Defer&) = delete; + Defer& operator=(Defer&&) = delete; + + inline + ~Defer() + { + m_Func(); + } + +private: + std::function m_Func; +}; + +} + +#endif /* DEFER */ diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index c14259b88..8878a9d29 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -23,6 +23,7 @@ #include "icinga/cib.hpp" #include "remote/apilistener.hpp" #include "base/configtype.hpp" +#include "base/defer.hpp" #include "base/objectlock.hpp" #include "base/utility.hpp" #include "base/perfdatavalue.hpp" @@ -73,6 +74,7 @@ void CheckerComponent::Start(bool runtimeCreated) Log(LogInformation, "CheckerComponent") << "'" << GetName() << "' started."; + m_RunningChecks.store(0); m_Thread = std::thread(std::bind(&CheckerComponent::CheckThreadProc, this)); @@ -93,6 +95,10 @@ void CheckerComponent::Stop(bool runtimeRemoved) m_ResultTimer->Stop(); m_Thread.join(); + while (m_RunningChecks.load()) { + Utility::Sleep(1.0 / 60.0); + } + Log(LogInformation, "CheckerComponent") << "'" << GetName() << "' stopped."; @@ -207,6 +213,8 @@ void CheckerComponent::CheckThreadProc() Checkable::IncreasePendingChecks(); + m_RunningChecks.fetch_add(1); + Utility::QueueAsyncCallback(std::bind(&CheckerComponent::ExecuteCheckHelper, CheckerComponent::Ptr(this), checkable)); lock.lock(); @@ -215,6 +223,10 @@ void CheckerComponent::CheckThreadProc() void CheckerComponent::ExecuteCheckHelper(const Checkable::Ptr& checkable) { + Defer decrementRunningChecks ([this]{ + m_RunningChecks.fetch_sub(1); + }); + try { checkable->ExecuteCheck(); } catch (const std::exception& ex) { diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp index f69f5092e..3c2753973 100644 --- a/lib/checker/checkercomponent.hpp +++ b/lib/checker/checkercomponent.hpp @@ -25,11 +25,13 @@ #include "base/configobject.hpp" #include "base/timer.hpp" #include "base/utility.hpp" +#include #include #include #include #include #include +#include #include namespace icinga @@ -90,6 +92,7 @@ private: boost::condition_variable m_CV; bool m_Stopped{false}; std::thread m_Thread; + std::atomic m_RunningChecks; CheckableSet m_IdleCheckables; CheckableSet m_PendingCheckables; From c3dc8382efde8953d5c4cfbac9da81b5560775e9 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Fri, 25 Jan 2019 16:38:11 +0100 Subject: [PATCH 0420/1162] Make the NSCP CheckDisk --exclude option available to Icinga 2 --- itl/command-nscp-local.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/itl/command-nscp-local.conf b/itl/command-nscp-local.conf index 3e134adc0..da4f0b549 100644 --- a/itl/command-nscp-local.conf +++ b/itl/command-nscp-local.conf @@ -222,6 +222,10 @@ object CheckCommand "nscp-local-disk" { value = "$nscp_disk_drive$" repeat_key = true } + "--exclude" = { + value = "$nscp_disk_exclude$" + repeat_key = true + } "--warning" = { value = "$nscp_disk_op$ $nscp_disk_warning$" } From 9f2ccfbaa0fd35e33a002dd48c7b429636dc806c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 28 Jan 2019 17:29:46 +0100 Subject: [PATCH 0421/1162] ClusterEvents::AcknowledgementSet event should forward 'persistent' attribute --- lib/icinga/clusterevents.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/icinga/clusterevents.cpp b/lib/icinga/clusterevents.cpp index db8102729..6c54be340 100644 --- a/lib/icinga/clusterevents.cpp +++ b/lib/icinga/clusterevents.cpp @@ -445,6 +445,7 @@ void ClusterEvents::AcknowledgementSetHandler(const Checkable::Ptr& checkable, params->Set("comment", comment); params->Set("acktype", type); params->Set("notify", notify); + params->Set("persistent", persistent); params->Set("expiry", expiry); Dictionary::Ptr message = new Dictionary(); From 8cbd4820725655e3c4ae06aef78308183be016da Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 28 Jan 2019 17:33:05 +0100 Subject: [PATCH 0422/1162] Don't allow retry_interval <= 0 --- lib/icinga/checkable.cpp | 8 ++++++++ lib/icinga/checkable.hpp | 1 + 2 files changed, 9 insertions(+) diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index fe2fed9e3..e745d76cb 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -198,6 +198,14 @@ void Checkable::ValidateCheckInterval(const Lazy& lvalue, const Validati BOOST_THROW_EXCEPTION(ValidationError(this, { "check_interval" }, "Interval must be greater than 0.")); } +void Checkable::ValidateRetryInterval(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateRetryInterval(lvalue, utils); + + if (lvalue() <= 0) + BOOST_THROW_EXCEPTION(ValidationError(this, { "retry_interval" }, "Interval must be greater than 0.")); +} + void Checkable::ValidateMaxCheckAttempts(const Lazy& lvalue, const ValidationUtils& utils) { ObjectImpl::ValidateMaxCheckAttempts(lvalue, utils); diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 141d0a43c..824f41b8d 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -192,6 +192,7 @@ public: std::vector > GetReverseDependencies() const; void ValidateCheckInterval(const Lazy& lvalue, const ValidationUtils& value) final; + void ValidateRetryInterval(const Lazy& lvalue, const ValidationUtils& value) final; void ValidateMaxCheckAttempts(const Lazy& lvalue, const ValidationUtils& value) final; static void IncreasePendingChecks(); From b16c22448e9d54ce2fd776c04562fad813ffea91 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 28 Jan 2019 17:39:22 +0100 Subject: [PATCH 0423/1162] Cluster: Delete object message should log that Atm it is a copy-paste error and irritates during debugging. Coming from my analysis of existing cluster messages. --- lib/remote/apilistener-configsync.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index 1cac5b39e..2612e67fc 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -199,7 +199,7 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin Value ApiListener::ConfigDeleteObjectAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params) { Log(LogNotice, "ApiListener") - << "Received update for object: " << JsonEncode(params); + << "Received delete for object: " << JsonEncode(params); /* check permissions */ ApiListener::Ptr listener = ApiListener::GetInstance(); @@ -209,7 +209,7 @@ Value ApiListener::ConfigDeleteObjectAPIHandler(const MessageOrigin::Ptr& origin if (!listener->GetAcceptConfig()) { Log(LogWarning, "ApiListener") - << "Ignoring config update. '" << listener->GetName() << "' does not accept config."; + << "Ignoring config delete. '" << listener->GetName() << "' does not accept config."; return Empty; } @@ -217,14 +217,14 @@ Value ApiListener::ConfigDeleteObjectAPIHandler(const MessageOrigin::Ptr& origin if (!endpoint) { Log(LogNotice, "ApiListener") - << "Discarding 'config update object' message from '" << origin->FromClient->GetIdentity() << "': Invalid endpoint origin (client not allowed)."; + << "Discarding 'config delete object' message from '" << origin->FromClient->GetIdentity() << "': Invalid endpoint origin (client not allowed)."; return Empty; } /* discard messages if the sender is in a child zone */ if (!Zone::GetLocalZone()->IsChildOf(endpoint->GetZone())) { Log(LogNotice, "ApiListener") - << "Discarding 'config update object' message from '" + << "Discarding 'config delete object' message from '" << origin->FromClient->GetIdentity() << "'."; return Empty; } From ce847324bc8abe4f36071633b999fa88ba2213f3 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 28 Jan 2019 18:29:57 +0100 Subject: [PATCH 0424/1162] Downtime::AddDowntime(): place Downtimes in the same zone as the origin ScheduledDowntimes --- lib/icinga/downtime.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 9f0adf708..0f0a74ceb 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -267,7 +267,23 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth if (service) attrs->Set("service_name", service->GetShortName()); - String zone = checkable->GetZoneName(); + String zone; + + if (!scheduledDowntime.IsEmpty()) { + auto sdt (ScheduledDowntime::GetByName(scheduledDowntime)); + + if (sdt) { + auto sdtZone (sdt->GetZone()); + + if (sdtZone) { + zone = sdtZone->GetName(); + } + } + } + + if (zone.IsEmpty()) { + zone = checkable->GetZoneName(); + } if (!zone.IsEmpty()) attrs->Set("zone", zone); From beb39a94e04eb00eadaa100957a18d4b8f4dd9a2 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Mon, 28 Jan 2019 18:30:31 +0100 Subject: [PATCH 0425/1162] Updated documentation for nscp-disk-local --- doc/10-icinga-template-library.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index a8ef71e73..4f906d07a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -1877,7 +1877,8 @@ Check command object for the `check_drivesize` NSClient++ plugin. Name | Description -----------------------|------------------ -nscp_disk_drive | **Optional.** Drive character, default to all drives. +nscp_disk_drive | **Optional.** Drive character, default to all drives. Can be an array if multiple drives should be monitored. +nscp_disk_exclude | **Optional.** Drive character, default to none. Can be an array of drive characters if multiple drives should be excluded. nscp_disk_free | **Optional.** Switch between checking free space (free=true) or used space (free=false), default to false. nscp_disk_warning | **Optional.** Threshold for WARNING in percent or absolute (use MB, GB, ...), default to 80 (used) or 20 percent (free). nscp_disk_critical | **Optional.** Threshold for CRITICAL in percent or absolute (use MB, GB, ...), default to 90 (used) or 10 percent (free). From b1362aeb9b6822a88ce4e3a187974f5ef20a4bad Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 30 Jan 2019 14:23:57 +0100 Subject: [PATCH 0426/1162] Add a unit test for Convert::ToLong(double) - fails --- test/base-convert.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/base-convert.cpp b/test/base-convert.cpp index 26919b61f..48499b1cb 100644 --- a/test/base-convert.cpp +++ b/test/base-convert.cpp @@ -33,6 +33,8 @@ BOOST_AUTO_TEST_CASE(tolong) BOOST_CHECK_THROW(Convert::ToLong("7a"), boost::exception); BOOST_CHECK(Convert::ToLong(Value(-7)) == -7); + + BOOST_CHECK(Convert::ToLong(3.141386593) == 3); } BOOST_AUTO_TEST_CASE(todouble) From b58cb17e4b389c6bd703e2334cb0bb2739213f62 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 30 Jan 2019 14:47:59 +0100 Subject: [PATCH 0427/1162] Fix Convert::ToLong(double val) --- lib/base/convert.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/base/convert.hpp b/lib/base/convert.hpp index 8b9000d05..bb7bd3e5c 100644 --- a/lib/base/convert.hpp +++ b/lib/base/convert.hpp @@ -64,6 +64,11 @@ public: return val; } + static long ToLong(double val) + { + return static_cast(val); + } + static double ToDouble(const Value& val) { return val; From 7ba4d495056c229bed6326364afd3a12ac7b49bf Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Wed, 30 Jan 2019 19:41:24 +0100 Subject: [PATCH 0428/1162] Fix check_swap formatting This fixes a small formatting mistake introduced by #6811. To keep the check_swap output in sync with all other plugins I fixed the formatting. --- plugins/check_swap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 906a1017d..302f20b46 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -200,7 +200,7 @@ static int printOutput(printInfoStruct& printInfo) if (printInfo.crit.rend(currentValue, printInfo.tSwap)) state = CRITICAL; - std::wcout << stateToString(state) << " "; + std::wcout << stateToString(state) << " - "; if (!printInfo.showUsed) std::wcout << printInfo.percentFree << L"% free "; From aad7107396e22fda44cf9118f24d77bf5ec60e9c Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Thu, 31 Jan 2019 07:59:44 +0100 Subject: [PATCH 0429/1162] Add check commands for HDFS file count and used space --- itl/plugins-contrib.d/big-data.conf | 64 +++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/itl/plugins-contrib.d/big-data.conf b/itl/plugins-contrib.d/big-data.conf index 5d757e282..24da0b183 100644 --- a/itl/plugins-contrib.d/big-data.conf +++ b/itl/plugins-contrib.d/big-data.conf @@ -63,3 +63,67 @@ object CheckCommand "cloudera_service_status" { } } } + +object CheckCommand "cloudera_hdfs_space" { + command = [ PluginDir + "/check_cloudera_hdfs_space.py" ] + + arguments = { + "-H" = { + description = "Namenode host" + value = "$hdfs_space_host$" + required = true + } + "-P" = { + description = "Namenode port (default 50070)" + value = "$hdfs_space_port$" + required = false + } + "-d" = { + description = "HDFS disk to check" + value = "$hdfs_space_disk$" + required = true + } + "-w" = { + description = "Warning threshold in percent" + value = "$hdfs_space_warn$" + required = true + } + "-c" = { + description = "Critical threshold in percent" + value = "$hdfs_space_crit$" + required = true + } + } +} + +object CheckCommand "cloudera_hdfs_files" { + command = [ PluginDir + "/check_cloudera_hdfs_files.py" ] + + arguments = { + "-H" = { + description = "Namenode host" + value = "$hdfs_files_host$" + required = true + } + "-P" = { + description = "Namenode port (default 50070)" + value = "$hdfs_files_port$" + required = false + } + "-w" = { + description = "Warning threshold" + value = "$hdfs_files_warn$" + required = true + } + "-c" = { + description = "Critical threshold" + value = "$hdfs_files_crit$" + required = true + } + "-m" = { + description = "Max files count that causes problems (default 140000000)" + value = "$hdfs_files_max$" + required = false + } + } +} From ab7e3a8514d9024cb9a58dfe89828a62a227cc23 Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Thu, 31 Jan 2019 08:11:31 +0100 Subject: [PATCH 0430/1162] Add documentation to cloudera checks --- doc/10-icinga-template-library.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 4f906d07a..d5eaa254a 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2214,6 +2214,36 @@ cloudera_cluster | **Required.** The cluster name in cloudera manager. cloudera_service | **Required.** Name of cluster service to be checked. cloudera_verify_ssl | **Optional.** Verify SSL. Defaults to true. +#### cloudera_hdfs_space + +The [cloudera_hdfs_space](https://github.com/miso231/icinga2-cloudera-plugin) plugin +connects to Hadoop Namenode and gets used capacity of selected disk + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +----------------------|----------------------------------------------------------------- +hdfs_space_host | **Required.** Namenode host to connect to. +hdfs_space_port | **Optional.** Namenode port (default 50070). +hdfs_space_disk | **Required.** HDFS disk to check. +hdfs_space_warn | **Required.** Warning threshold in percent. +hdfs_space_crit | **Required.** Critical threshold in percent. + +#### cloudera_hdfs_files + +The [cloudera_hdfs_files](https://github.com/miso231/icinga2-cloudera-plugin) plugin +connects to Hadoop Namenode and gets total number of files on HDFS + +Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): + +Name | Description +----------------------|----------------------------------------------------------------- +hdfs_files_host | **Required.** Namenode host to connect to. +hdfs_files_port | **Optional.** Namenode port (default 50070). +hdfs_files_warn | **Required.** Warning threshold. +hdfs_files_crit | **Required.** Critical threshold. +hdfs_files_max | **Required.** Max files count that causes problems (default 140,000,000). + ### Databases This category contains plugins for various database servers. From 6ed5d4807f01e97a6dac8bb409530295007f71b4 Mon Sep 17 00:00:00 2001 From: Michal Petko Date: Thu, 31 Jan 2019 15:58:46 +0100 Subject: [PATCH 0431/1162] Use full command name as prefix for check arguments --- doc/10-icinga-template-library.md | 28 ++++++++++++++-------------- itl/plugins-contrib.d/big-data.conf | 20 ++++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index d5eaa254a..3627d26ca 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -2221,13 +2221,13 @@ connects to Hadoop Namenode and gets used capacity of selected disk Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): -Name | Description -----------------------|----------------------------------------------------------------- -hdfs_space_host | **Required.** Namenode host to connect to. -hdfs_space_port | **Optional.** Namenode port (default 50070). -hdfs_space_disk | **Required.** HDFS disk to check. -hdfs_space_warn | **Required.** Warning threshold in percent. -hdfs_space_crit | **Required.** Critical threshold in percent. +Name | Description +--------------------------|----------------------------------------------------------------- +cloudera_hdfs_space_host | **Required.** Namenode host to connect to. +cloudera_hdfs_space_port | **Optional.** Namenode port (default 50070). +cloudera_hdfs_space_disk | **Required.** HDFS disk to check. +cloudera_hdfs_space_warn | **Required.** Warning threshold in percent. +cloudera_hdfs_space_crit | **Required.** Critical threshold in percent. #### cloudera_hdfs_files @@ -2236,13 +2236,13 @@ connects to Hadoop Namenode and gets total number of files on HDFS Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): -Name | Description -----------------------|----------------------------------------------------------------- -hdfs_files_host | **Required.** Namenode host to connect to. -hdfs_files_port | **Optional.** Namenode port (default 50070). -hdfs_files_warn | **Required.** Warning threshold. -hdfs_files_crit | **Required.** Critical threshold. -hdfs_files_max | **Required.** Max files count that causes problems (default 140,000,000). +Name | Description +--------------------------|----------------------------------------------------------------- +cloudera_hdfs_files_host | **Required.** Namenode host to connect to. +cloudera_hdfs_files_port | **Optional.** Namenode port (default 50070). +cloudera_hdfs_files_warn | **Required.** Warning threshold. +cloudera_hdfs_files_crit | **Required.** Critical threshold. +cloudera_hdfs_files_max | **Required.** Max files count that causes problems (default 140,000,000). ### Databases diff --git a/itl/plugins-contrib.d/big-data.conf b/itl/plugins-contrib.d/big-data.conf index 24da0b183..d765a4b7c 100644 --- a/itl/plugins-contrib.d/big-data.conf +++ b/itl/plugins-contrib.d/big-data.conf @@ -70,27 +70,27 @@ object CheckCommand "cloudera_hdfs_space" { arguments = { "-H" = { description = "Namenode host" - value = "$hdfs_space_host$" + value = "$cloudera_hdfs_space_host$" required = true } "-P" = { description = "Namenode port (default 50070)" - value = "$hdfs_space_port$" + value = "$cloudera_hdfs_space_port$" required = false } "-d" = { description = "HDFS disk to check" - value = "$hdfs_space_disk$" + value = "$cloudera_hdfs_space_disk$" required = true } "-w" = { description = "Warning threshold in percent" - value = "$hdfs_space_warn$" + value = "$cloudera_hdfs_space_warn$" required = true } "-c" = { description = "Critical threshold in percent" - value = "$hdfs_space_crit$" + value = "$cloudera_hdfs_space_crit$" required = true } } @@ -102,27 +102,27 @@ object CheckCommand "cloudera_hdfs_files" { arguments = { "-H" = { description = "Namenode host" - value = "$hdfs_files_host$" + value = "$cloudera_hdfs_files_host$" required = true } "-P" = { description = "Namenode port (default 50070)" - value = "$hdfs_files_port$" + value = "$cloudera_hdfs_files_port$" required = false } "-w" = { description = "Warning threshold" - value = "$hdfs_files_warn$" + value = "$cloudera_hdfs_files_warn$" required = true } "-c" = { description = "Critical threshold" - value = "$hdfs_files_crit$" + value = "$cloudera_hdfs_files_crit$" required = true } "-m" = { description = "Max files count that causes problems (default 140000000)" - value = "$hdfs_files_max$" + value = "$cloudera_hdfs_files_max$" required = false } } From 52d81d0af522956fec4ef63c0e3c06158cbefbf9 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 1 Feb 2019 16:46:28 +0100 Subject: [PATCH 0432/1162] Doc: Add .NET 3.5 to the windows build stack The Windows Agent Wizard is currently build on .NET Framework 2.0, which is not installed by default on Windows 10. This adds a note to the development documentation to install the .NET Framework 3.5 (which includes .NET Framework 2.0) component on Windows 10. --- doc/21-development.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/21-development.md b/doc/21-development.md index 9abf3df4c..d26c8dbae 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -845,6 +845,12 @@ Choose the following minimal set: After a while, Visual Studio will be ready. +#### .NET Framework 3.5 + +Windows 10 only have .NET Framework >= 4.6 installed by default, the Icinga Agent Wizard is built on .NET Framework 2.0 which is not included in .NET Framework 4.6. Thankfully Windows 10 have .NET Framework 3.5 (which includes .NET Framework 2.0) as a component on board, you just need to activate it. + +Go to `Control Panel` -> `Programs` -> `Turn Windows features on or off`. Tick `.NET Framework 3.5 (includes .NET 2.0 and 3.0)` and wait until the installation process succseded. + #### Flex and Bison Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html): From 8ad1717055683c573f81181c7749ba422fa96d13 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 6 Feb 2019 11:17:45 +0100 Subject: [PATCH 0433/1162] Respect activation priority also on deactivation --- lib/base/configobject.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index 9d44db60a..bf43dd2ba 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -33,6 +33,7 @@ #include "base/workqueue.hpp" #include "base/context.hpp" #include "base/application.hpp" +#include #include #include #include @@ -617,7 +618,13 @@ void ConfigObject::RestoreObjects(const String& filename, int attributeTypes) void ConfigObject::StopObjects() { - for (const Type::Ptr& type : Type::GetAllTypes()) { + auto types = Type::GetAllTypes(); + + std::sort(types.begin(), types.end(), [](const Type::Ptr& a, const Type::Ptr& b) { + return a->GetActivationPriority() > b->GetActivationPriority(); + }); + + for (const Type::Ptr& type : types) { auto *dtype = dynamic_cast(type.get()); if (!dtype) From 7ce30a86b8c8d78c23c32e0068f1376994242ea1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 7 Feb 2019 15:42:09 +0100 Subject: [PATCH 0434/1162] Enhance notification logging - More details from the local context (notification, user, checkable, command names) - Notice logs for when this notification object is paused in HA enabled zones - Notice logs for interval=0 reminder notifications - Object name for skipping recovery notifications when problem hasn't been notified before --- lib/icinga/checkable-notification.cpp | 28 +++---- lib/icinga/notification.cpp | 89 +++++++++++++--------- lib/notification/notificationcomponent.cpp | 18 ++++- 3 files changed, 83 insertions(+), 52 deletions(-) diff --git a/lib/icinga/checkable-notification.cpp b/lib/icinga/checkable-notification.cpp index 1a2c18363..2a909769c 100644 --- a/lib/icinga/checkable-notification.cpp +++ b/lib/icinga/checkable-notification.cpp @@ -44,7 +44,9 @@ void Checkable::ResetNotificationNumbers() void Checkable::SendNotifications(NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text) { - CONTEXT("Sending notifications for object '" + GetName() + "'"); + String checkableName = GetName(); + + CONTEXT("Sending notifications for object '" + checkableName + "'"); bool force = GetForceNextNotification(); @@ -53,31 +55,31 @@ void Checkable::SendNotifications(NotificationType type, const CheckResult::Ptr& if (!IcingaApplication::GetInstance()->GetEnableNotifications() || !GetEnableNotifications()) { if (!force) { Log(LogInformation, "Checkable") - << "Notifications are disabled for service '" << GetName() << "'."; + << "Notifications are disabled for checkable '" << checkableName << "'."; return; } } - Log(LogInformation, "Checkable") - << "Checking for configured notifications for object '" << GetName() << "'"; - std::set notifications = GetNotifications(); - if (notifications.empty()) - Log(LogInformation, "Checkable") - << "Checkable '" << GetName() << "' does not have any notifications."; + Log(LogInformation, "Checkable") + << "Checkable '" << checkableName << "' has " << notifications.size() << " notification(s). Proceeding with filters, successful sends will be logged."; - Log(LogDebug, "Checkable") - << "Checkable '" << GetName() << "' has " << notifications.size() << " notification(s)."; + if (notifications.empty()) + return; for (const Notification::Ptr& notification : notifications) { try { - if (!notification->IsPaused()) + if (!notification->IsPaused()) { notification->BeginExecuteNotification(type, cr, force, false, author, text); + } else { + Log(LogNotice, "Notification") + << "Notification '" << notification->GetName() << "': HA cluster active, this endpoint does not have the authority (paused=true). Skipping."; + } } catch (const std::exception& ex) { Log(LogWarning, "Checkable") - << "Exception occurred during notification for service '" - << GetName() << "': " << DiagnosticInformation(ex); + << "Exception occurred during notification '" << notification->GetName() << "' for checkable '" + << GetName() << "': " << DiagnosticInformation(ex, false); } } } diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index ba6ca49b4..41982cd30 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -260,8 +260,10 @@ String Notification::NotificationTypeToString(NotificationType type) void Notification::BeginExecuteNotification(NotificationType type, const CheckResult::Ptr& cr, bool force, bool reminder, const String& author, const String& text) { + String notificationName = GetName(); + Log(LogNotice, "Notification") - << "Attempting to send " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() << "'."; + << "Attempting to send " << (reminder ? "reminder " : " ") << "notifications for notification object '" << notificationName << "'."; Checkable::Ptr checkable = GetCheckable(); @@ -270,7 +272,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (tp && !tp->IsInside(Utility::GetTime())) { Log(LogNotice, "Notification") - << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() + << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << notificationName << "': not in timeperiod '" << tp->GetName() << "'"; return; } @@ -284,8 +286,8 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (timesBegin != Empty && timesBegin >= 0 && now < checkable->GetLastHardStateChange() + timesBegin) { Log(LogNotice, "Notification") - << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() - << "': before specified begin time (" << Utility::FormatDuration(timesBegin) << ")"; + << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" + << notificationName << "': before specified begin time (" << Utility::FormatDuration(timesBegin) << ")"; /* we need to adjust the next notification time * to now + begin delaying the first notification @@ -299,8 +301,8 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (timesEnd != Empty && timesEnd >= 0 && now > checkable->GetLastHardStateChange() + timesEnd) { Log(LogNotice, "Notification") - << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() - << "': after specified end time (" << Utility::FormatDuration(timesEnd) << ")"; + << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" + << notificationName << "': after specified end time (" << Utility::FormatDuration(timesEnd) << ")"; return; } } @@ -314,7 +316,8 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (!(ftype & GetTypeFilter())) { Log(LogNotice, "Notification") - << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() << "': type '" + << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" + << notificationName << "': type '" << NotificationTypeToStringInternal(type) << "' does not match type filter: " << NotificationFilterToString(GetTypeFilter(), GetTypeFilterMap()) << "."; @@ -353,14 +356,16 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (!(fstate & GetStateFilter())) { Log(LogNotice, "Notification") - << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" << GetName() << "': state '" << stateStr + << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" + << notificationName << "': state '" << stateStr << "' does not match state filter: " << NotificationFilterToString(GetStateFilter(), GetStateFilterMap()) << "."; return; } } } else { Log(LogNotice, "Notification") - << "Not checking " << (reminder ? "reminder " : " ") << "notification filters for notification object '" << GetName() << "': Notification was forced."; + << "Not checking " << (reminder ? "reminder " : " ") << "notification filters for notification object '" + << notificationName << "': Notification was forced."; } { @@ -400,13 +405,14 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (!user->GetEnableNotifications()) { Log(LogNotice, "Notification") - << "Disabled notifications for user '" << userName << "'. Not sending notification."; + << "Notification object '" << notificationName << "': Disabled notifications for user '" + << userName << "'. Not sending notification."; continue; } if (!CheckNotificationUserFilters(type, user, force, reminder)) { Log(LogNotice, "Notification") - << "Notification filters for user '" << userName << "' not matched. Not sending notification."; + << "Notification object '" << notificationName << "': Filters for user '" << userName << "' not matched. Not sending notification."; continue; } @@ -414,8 +420,8 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (type == NotificationRecovery) { if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { Log(LogNotice, "Notification") - << "We did not notify user '" << userName - << "' (Problem types enabled) for a problem before. Not sending recovery notification."; + << "Notification object '" << notificationName << "': We did not notify user '" << userName + << "' (Problem types enabled) for a problem before. Not sending Recovery notification."; continue; } } @@ -424,7 +430,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe if (type == NotificationAcknowledgement) { if (!notifiedProblemUsers->Contains(userName) && (NotificationProblem & user->GetTypeFilter())) { Log(LogNotice, "Notification") - << "We did not notify user '" << userName + << "Notification object '" << notificationName << "': We did not notify user '" << userName << "' (Problem types enabled) for a problem before. Not sending acknowledgement notification."; continue; } @@ -432,7 +438,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe Log(LogInformation, "Notification") << "Sending " << (reminder ? "reminder " : "") << "'" << NotificationTypeToStringInternal(type) << "' notification '" - << GetName() << "' for user '" << userName << "'"; + << notificationName << "' for user '" << userName << "'"; Utility::QueueAsyncCallback(std::bind(&Notification::ExecuteNotificationHelper, this, type, user, cr, force, author, text)); @@ -454,13 +460,16 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe bool Notification::CheckNotificationUserFilters(NotificationType type, const User::Ptr& user, bool force, bool reminder) { + String notificationName = GetName(); + String userName = user->GetName(); + if (!force) { TimePeriod::Ptr tp = user->GetPeriod(); if (tp && !tp->IsInside(Utility::GetTime())) { Log(LogNotice, "Notification") << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" - << GetName() << " and user '" << user->GetName() + << notificationName << " and user '" << userName << "': user period not in timeperiod '" << tp->GetName() << "'"; return false; } @@ -468,7 +477,8 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use unsigned long ftype = type; Log(LogDebug, "Notification") - << "User notification, Type '" << NotificationTypeToStringInternal(type) + << "User '" << userName << "' notification '" << notificationName + << "', Type '" << NotificationTypeToStringInternal(type) << "', TypeFilter: " << NotificationFilterToString(user->GetTypeFilter(), GetTypeFilterMap()) << " (FType=" << ftype << ", TypeFilter=" << GetTypeFilter() << ")"; @@ -476,7 +486,7 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use if (!(ftype & user->GetTypeFilter())) { Log(LogNotice, "Notification") << "Not sending " << (reminder ? "reminder " : " ") << "notifications for notification object '" - << GetName() << " and user '" << user->GetName() << "': type '" + << notificationName << " and user '" << userName << "': type '" << NotificationTypeToStringInternal(type) << "' does not match type filter: " << NotificationFilterToString(user->GetTypeFilter(), GetTypeFilterMap()) << "."; return false; @@ -501,14 +511,15 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use } Log(LogDebug, "Notification") - << "User notification, State '" << stateStr << "', StateFilter: " + << "User '" << userName << "' notification '" << notificationName + << "', State '" << stateStr << "', StateFilter: " << NotificationFilterToString(user->GetStateFilter(), GetStateFilterMap()) << " (FState=" << fstate << ", StateFilter=" << user->GetStateFilter() << ")"; if (!(fstate & user->GetStateFilter())) { Log(LogNotice, "Notification") << "Not " << (reminder ? "reminder " : " ") << "sending notifications for notification object '" - << GetName() << " and user '" << user->GetName() << "': state '" << stateStr + << notificationName << " and user '" << userName << "': state '" << stateStr << "' does not match state filter: " << NotificationFilterToString(user->GetStateFilter(), GetStateFilterMap()) << "."; return false; } @@ -516,7 +527,7 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use } else { Log(LogNotice, "Notification") << "Not checking " << (reminder ? "reminder " : " ") << "notification filters for notification object '" - << GetName() << "' and user '" << user->GetName() << "': Notification was forced."; + << notificationName << "' and user '" << userName << "': Notification was forced."; } return true; @@ -524,29 +535,37 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use void Notification::ExecuteNotificationHelper(NotificationType type, const User::Ptr& user, const CheckResult::Ptr& cr, bool force, const String& author, const String& text) { + String notificationName = GetName(); + String userName = user->GetName(); + String checkableName = GetCheckable()->GetName(); + + NotificationCommand::Ptr command = GetCommand(); + + if (!command) { + Log(LogDebug, "Notification") + << "No command found for notification '" << notificationName << "'. Skipping execution."; + return; + } + + String commandName = command->GetName(); + try { - NotificationCommand::Ptr command = GetCommand(); - - if (!command) { - Log(LogDebug, "Notification") - << "No command found for notification '" << GetName() << "'. Skipping execution."; - return; - } - command->Execute(this, user, cr, type, author, text); /* required by compatlogger */ - Service::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, author, text, command->GetName(), nullptr); + Service::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, author, text, commandName, nullptr); Log(LogInformation, "Notification") << "Completed sending '" << NotificationTypeToStringInternal(type) - << "' notification '" << GetName() - << "' for checkable '" << GetCheckable()->GetName() - << "' and user '" << user->GetName() << "'."; + << "' notification '" << notificationName + << "' for checkable '" << checkableName + << "' and user '" << userName << "' using command '" << commandName << "'."; } catch (const std::exception& ex) { Log(LogWarning, "Notification") - << "Exception occurred during notification for checkable '" - << GetCheckable()->GetName() << "': " << DiagnosticInformation(ex); + << "Exception occurred during notification '" << notificationName + << "' for checkable '" << checkableName + << "' and user '" << userName << "' using command '" << commandName << "': " + << DiagnosticInformation(ex, false); } } diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index 4b638c62d..04b40274c 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -85,16 +85,24 @@ void NotificationComponent::NotificationTimerHandler() if (!notification->IsActive()) continue; - if (notification->IsPaused() && GetEnableHA()) + String notificationName = notification->GetName(); + + if (notification->IsPaused() && GetEnableHA()) { + Log(LogNotice, "NotificationComponent") + << "Reminder notification '" << notificationName << "': HA cluster active, this endpoint does not have the authority (paused=true). Skipping."; continue; + } Checkable::Ptr checkable = notification->GetCheckable(); if (!IcingaApplication::GetInstance()->GetEnableNotifications() || !checkable->GetEnableNotifications()) continue; - if (notification->GetInterval() <= 0 && notification->GetNoMoreNotifications()) + if (notification->GetInterval() <= 0 && notification->GetNoMoreNotifications()) { + Log(LogNotice, "NotificationComponent") + << "Reminder notification '" << notificationName << "': Notification was sent out once and interval=0 disables reminder notifications."; continue; + } if (notification->GetNextNotification() > now) continue; @@ -116,22 +124,24 @@ void NotificationComponent::NotificationTimerHandler() if (checkable->GetStateType() == StateTypeSoft) continue; + /* Don't send reminder notifications for OK/Up states. */ if ((service && service->GetState() == ServiceOK) || (!service && host->GetState() == HostUp)) continue; + /* Skip in runtime filters. */ if (!reachable || checkable->IsInDowntime() || checkable->IsAcknowledged() || checkable->IsFlapping()) continue; } try { Log(LogNotice, "NotificationComponent") - << "Attempting to send reminder notification '" << notification->GetName() << "'"; + << "Attempting to send reminder notification '" << notificationName << "'."; notification->BeginExecuteNotification(NotificationProblem, checkable->GetLastCheckResult(), false, true); } catch (const std::exception& ex) { Log(LogWarning, "NotificationComponent") << "Exception occurred during notification for object '" - << GetName() << "': " << DiagnosticInformation(ex); + << notificationName << "': " << DiagnosticInformation(ex, false); } } } From c97f3c80f550320abcbc3bcbaa0a3673c2091c34 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 11 Jan 2019 16:16:45 +0100 Subject: [PATCH 0435/1162] Fix checkresults from the future breaking checks --- lib/icinga/checkable-check.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 0b8917b77..09fa901e1 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -170,8 +170,8 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig long old_attempt = GetCheckAttempt(); bool recovery = false; - /* Ignore check results older than the current one. */ - if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart()) + /* Ignore check results older than the current one, except if the previous check result is from the future. */ + if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart() && old_cr->GetExecutionStart() < now) return; /* The ExecuteCheck function already sets the old state, but we need to do it again From d1fb1a8eda05018c5f665fceeb52569e243a7b65 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 8 Feb 2019 13:32:13 +0100 Subject: [PATCH 0436/1162] Refactor conditions and add debug log messages for future crs and skipped crs --- lib/icinga/checkable-check.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 09fa901e1..2437aa787 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -170,9 +170,34 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig long old_attempt = GetCheckAttempt(); bool recovery = false; - /* Ignore check results older than the current one, except if the previous check result is from the future. */ - if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart() && old_cr->GetExecutionStart() < now) - return; + /* When we have an check result already (not after fresh start), + * prevent to accept old check results and allow overrides for + * CRs happened in the future. + */ + if (old_cr) { + double currentCRTimestamp = old_cr->GetExecutionStart(); + double newCRTimestamp = cr->GetExecutionStart(); + + /* Our current timestamp may be from the future (wrong server time adjusted again). Allow overrides here. */ + if (currentCRTimestamp > now) { + /* our current CR is from the future, let the new CR override it. */ + Log(LogDebug, "Checkable") + << std::fixed << std::setprecision(6) << "Processing check result for checkable '" << GetName() << "' from " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newCRTimestamp) << " (" << newCRTimestamp + << "). Overriding since ours is from the future at " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", currentCRTimestamp) << " (" << currentCRTimestamp << ")."; + } else { + /* Current timestamp is from the past, but the new timestamp is even more in the past. Skip it. */ + if (newCRTimestamp < currentCRTimestamp) { + Log(LogDebug, "Checkable") + << std::fixed << std::setprecision(6) << "Skipping check result for checkable '" << GetName() << "' from " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newCRTimestamp) << " (" << newCRTimestamp + << "). It is in the past compared to ours at " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", currentCRTimestamp) << " (" << currentCRTimestamp << ")."; + return; + } + } + } /* The ExecuteCheck function already sets the old state, but we need to do it again * in case this was a passive check result. */ From 4961e9ba62eebcfc1cf22e1840b289e4eab067d2 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 8 Feb 2019 16:57:19 +0100 Subject: [PATCH 0437/1162] Fix check_swap percentage calculation This fixes the check_swap percentage calculation. When the pagefile is turned off the available swap and total swap are 0 which leads to a wrong calculation and misformated output. refs #6913 --- plugins/check_swap.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 302f20b46..7579073b7 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -229,7 +229,10 @@ static int check_swap(printInfoStruct& printInfo) printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit)); } - printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; + if (printInfo.aSwap > 0 && printInfo.tSwap > 0) + printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; + else + printInfo.percentFree = 0; return -1; } From c693a07399890c0af15b72a68383b4ff2a914576 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Feb 2019 17:33:46 +0100 Subject: [PATCH 0438/1162] Raise required Boost version to 1.53 refs #6933 --- CMakeLists.txt | 2 +- doc/21-development.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c3664291..672dee337 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. cmake_minimum_required(VERSION 2.8.8) -set(BOOST_MIN_VERSION "1.48.0") +set(BOOST_MIN_VERSION "1.53.0") project(icinga2) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") diff --git a/doc/21-development.md b/doc/21-development.md index d26c8dbae..01d82653b 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1093,8 +1093,8 @@ Icinga application using a dist tarball (including notes for distributions): - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel) - Debian/Ubuntu: libssl-dev - Alpine: libressl-dev -* Boost library and header files >= 1.48.0 - - RHEL/Fedora: boost148-devel +* Boost library and header files >= 1.53.0 + - RHEL/Fedora: boost153-devel - Debian/Ubuntu: libboost-all-dev - Alpine: boost-dev * GNU bison (bison) From 3b14c733ed97a7fb0b44721a1fb83dbf82937480 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 18 Dec 2018 11:52:06 +0100 Subject: [PATCH 0439/1162] tools/win32: Invalidate CMake cache on build (cherry picked from commit fcfde9ac22ff6bfde73ecfe1672bb686e1559e28) --- tools/win32/configure.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1 index 1f40875ce..57fc03188 100644 --- a/tools/win32/configure.ps1 +++ b/tools/win32/configure.ps1 @@ -53,6 +53,11 @@ cd "$env:ICINGA2_BUILDPATH" #-DCMAKE_INSTALL_PREFIX="C:\Program Files\Icinga2" ` +# Invalidate cache in case something in the build environment changed +if (Test-Path CMakeCache.txt) { + Remove-Item -Force CMakeCache.txt | Out-Null +} + & cmake.exe "$sourcePath" ` -DCMAKE_BUILD_TYPE=RelWithDebInfo ` -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX ` From 9f22300cf74fef1ab8d0f84406fce2a862e2aeb3 Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Tue, 18 Dec 2018 12:08:41 +0100 Subject: [PATCH 0440/1162] appveyor: Run Debug builds [skip travis] (cherry picked from commit ace12db110e565b20f8b1141e62e488b9c4abc8f) --- appveyor.yml | 1 + tools/win32/configure.ps1 | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 6e7f09b73..9d1150f72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,6 +11,7 @@ environment: BOOST_LIBRARYDIR: 'C:\Libraries\boost_1_65_1\lib64-msvc-14.1' BISON_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_bison.exe' FLEX_BINARY: 'C:\ProgramData\chocolatey\lib\winflexbison3\tools\win_flex.exe' + CMAKE_BUILD_TYPE: Debug branches: only: diff --git a/tools/win32/configure.ps1 b/tools/win32/configure.ps1 index 57fc03188..0ea0a50cb 100644 --- a/tools/win32/configure.ps1 +++ b/tools/win32/configure.ps1 @@ -2,6 +2,9 @@ if (-not (Test-Path env:ICINGA2_BUILDPATH)) { $env:ICINGA2_BUILDPATH = '.\build' } +if (-not (Test-Path env:CMAKE_BUILD_TYPE)) { + $env:CMAKE_BUILD_TYPE = 'RelWithDebInfo' +} if (-not (Test-Path "$env:ICINGA2_BUILDPATH")) { mkdir "$env:ICINGA2_BUILDPATH" | out-null } @@ -59,7 +62,7 @@ if (Test-Path CMakeCache.txt) { } & cmake.exe "$sourcePath" ` - -DCMAKE_BUILD_TYPE=RelWithDebInfo ` + -DCMAKE_BUILD_TYPE="$env:CMAKE_BUILD_TYPE" ` -G $env:CMAKE_GENERATOR -DCPACK_GENERATOR=WIX ` -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF ` -DOPENSSL_ROOT_DIR="$env:OPENSSL_ROOT_DIR" ` From 7c71218d88edf1bc663443a5d7b35e4feb5e5bae Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 6 Dec 2018 12:41:49 +0100 Subject: [PATCH 0441/1162] Implement ScheduledDowntime::AllConfigIsLoaded() refs #6542 (cherry picked from commit bbcf469af1c584a92d028446c6ff1f558950cd97) --- lib/icinga/scheduleddowntime.cpp | 9 +++++++++ lib/icinga/scheduleddowntime.hpp | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 449507e0c..37c3693bd 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -80,6 +80,8 @@ void ScheduledDowntime::OnAllConfigLoaded() if (!GetCheckable()) BOOST_THROW_EXCEPTION(ScriptError("ScheduledDowntime '" + GetName() + "' references a host/service which doesn't exist.", GetDebugInfo())); + + m_AllConfigLoaded.store(true); } void ScheduledDowntime::Start(bool runtimeCreated) @@ -339,3 +341,10 @@ void ScheduledDowntime::ValidateChildOptions(const Lazy& lvalue, const Va BOOST_THROW_EXCEPTION(ValidationError(this, { "child_options" }, "Invalid child_options specified")); } } + +bool ScheduledDowntime::AllConfigIsLoaded() +{ + return m_AllConfigLoaded.load(); +} + +std::atomic ScheduledDowntime::m_AllConfigLoaded (false); diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 158349291..4322999b7 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -23,6 +23,7 @@ #include "icinga/i2-icinga.hpp" #include "icinga/scheduleddowntime-ti.hpp" #include "icinga/checkable.hpp" +#include namespace icinga { @@ -47,6 +48,7 @@ public: static void EvaluateApplyRules(const intrusive_ptr& host); static void EvaluateApplyRules(const intrusive_ptr& service); + static bool AllConfigIsLoaded(); void ValidateRanges(const Lazy& lvalue, const ValidationUtils& utils) override; void ValidateChildOptions(const Lazy& lvalue, const ValidationUtils& utils) override; @@ -62,6 +64,8 @@ private: std::pair FindNextSegment(); void CreateNextDowntime(); + static std::atomic m_AllConfigLoaded; + static bool EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, const String& name, ScriptFrame& frame, const ApplyRule& rule); static bool EvaluateApplyRule(const Checkable::Ptr& checkable, const ApplyRule& rule); }; From a24256993c2dab8d85a4171896dc4805e6da00e7 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 6 Dec 2018 12:50:48 +0100 Subject: [PATCH 0442/1162] Downtime#HasValidConfigOwner(): wait for ScheduledDowntimes refs #6542 (cherry picked from commit 39e0d787e82c187de64b29e4979f4caac0907441) --- lib/icinga/downtime.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 336329bc2..4180747ac 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -210,6 +210,10 @@ bool Downtime::IsExpired() const bool Downtime::HasValidConfigOwner() const { + if (!ScheduledDowntime::AllConfigIsLoaded()) { + return true; + } + String configOwner = GetConfigOwner(); return configOwner.IsEmpty() || GetObject(configOwner); } From 53248a70c2c6b016e7dd1824fd3cc653f5c34231 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 4 Dec 2018 17:44:42 +0100 Subject: [PATCH 0443/1162] Add and populate Downtime#authoritative_zone refs #6542 (cherry picked from commit 5431eae116df92d0b856e7f856da24df5a948144) --- lib/icinga/downtime.cpp | 4 ++++ lib/icinga/downtime.ti | 1 + 2 files changed, 5 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 4180747ac..11b38d416 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -251,6 +251,10 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth attrs->Set("config_owner", scheduledDowntime); attrs->Set("entry_time", Utility::GetTime()); + if (!scheduledDowntime.IsEmpty()) { + attrs->Set("authoritative_zone", Zone::GetLocalZone()->GetName()); + } + Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(checkable); diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index 17c8cfe91..fe80e0e77 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -84,6 +84,7 @@ class Downtime : ConfigObject < DowntimeNameComposer [state] int legacy_id; [state] bool was_cancelled; [config] String config_owner; + [config] String authoritative_zone; }; } From b888e06682d909a224674cde655d2ba3ac033009 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 4 Dec 2018 17:45:54 +0100 Subject: [PATCH 0444/1162] Downtime#HasValidConfigOwner(): respect Downtime#authoritative_zone refs #6542 (cherry picked from commit c98d6a52545bf0e10b9b0d644b0d15813ab7de48) --- lib/icinga/downtime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 11b38d416..d9b24a3d3 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -215,7 +215,7 @@ bool Downtime::HasValidConfigOwner() const } String configOwner = GetConfigOwner(); - return configOwner.IsEmpty() || GetObject(configOwner); + return configOwner.IsEmpty() || Zone::GetByName(GetAuthoritativeZone()) != Zone::GetLocalZone() || GetObject(configOwner); } int Downtime::GetNextDowntimeID() From b93ad277a179b870ed32a46716443fd8ff02fd80 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 30 Jan 2019 14:23:57 +0100 Subject: [PATCH 0445/1162] Add a unit test for Convert::ToLong(double) - fails (cherry picked from commit b1362aeb9b6822a88ce4e3a187974f5ef20a4bad) --- test/base-convert.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/base-convert.cpp b/test/base-convert.cpp index 26919b61f..48499b1cb 100644 --- a/test/base-convert.cpp +++ b/test/base-convert.cpp @@ -33,6 +33,8 @@ BOOST_AUTO_TEST_CASE(tolong) BOOST_CHECK_THROW(Convert::ToLong("7a"), boost::exception); BOOST_CHECK(Convert::ToLong(Value(-7)) == -7); + + BOOST_CHECK(Convert::ToLong(3.141386593) == 3); } BOOST_AUTO_TEST_CASE(todouble) From 4fb444d3b7e95780c80fe0953e3b313a2fd67054 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 30 Jan 2019 14:47:59 +0100 Subject: [PATCH 0446/1162] Fix Convert::ToLong(double val) (cherry picked from commit b58cb17e4b389c6bd703e2334cb0bb2739213f62) --- lib/base/convert.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/base/convert.hpp b/lib/base/convert.hpp index 8b9000d05..bb7bd3e5c 100644 --- a/lib/base/convert.hpp +++ b/lib/base/convert.hpp @@ -64,6 +64,11 @@ public: return val; } + static long ToLong(double val) + { + return static_cast(val); + } + static double ToDouble(const Value& val) { return val; From ab947d7c3bb2da59d88896695497851c17535e8d Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Wed, 30 Jan 2019 19:41:24 +0100 Subject: [PATCH 0447/1162] Fix check_swap formatting This fixes a small formatting mistake introduced by #6811. To keep the check_swap output in sync with all other plugins I fixed the formatting. --- plugins/check_swap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 906a1017d..302f20b46 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -200,7 +200,7 @@ static int printOutput(printInfoStruct& printInfo) if (printInfo.crit.rend(currentValue, printInfo.tSwap)) state = CRITICAL; - std::wcout << stateToString(state) << " "; + std::wcout << stateToString(state) << " - "; if (!printInfo.showUsed) std::wcout << printInfo.percentFree << L"% free "; From f6a62e71d83393bce148d17fd15b4338627a4063 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 28 Jan 2019 17:29:46 +0100 Subject: [PATCH 0448/1162] ClusterEvents::AcknowledgementSet event should forward 'persistent' attribute (cherry picked from commit 9f2ccfbaa0fd35e33a002dd48c7b429636dc806c) --- lib/icinga/clusterevents.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/icinga/clusterevents.cpp b/lib/icinga/clusterevents.cpp index db8102729..6c54be340 100644 --- a/lib/icinga/clusterevents.cpp +++ b/lib/icinga/clusterevents.cpp @@ -445,6 +445,7 @@ void ClusterEvents::AcknowledgementSetHandler(const Checkable::Ptr& checkable, params->Set("comment", comment); params->Set("acktype", type); params->Set("notify", notify); + params->Set("persistent", persistent); params->Set("expiry", expiry); Dictionary::Ptr message = new Dictionary(); From 362c7eb28a99b5a482fa3df393bc82970e795d4e Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 17 Jan 2019 12:13:44 +0100 Subject: [PATCH 0449/1162] TcpSocket#Bind(): also set SO_REUSEPORT refs #6898 (cherry picked from commit 984f7be03060f89235ccee1a1ef3e5fba652a9df) --- lib/base/tcpsocket.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 7ac935bf8..2c3f6c7c3 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -91,6 +91,9 @@ void TcpSocket::Bind(const String& node, const String& service, int family) const int optTrue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&optTrue), sizeof(optTrue)); +#ifndef _WIN32 + setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&optTrue), sizeof(optTrue)); +#endif /* _WIN32 */ int rc = bind(fd, info->ai_addr, info->ai_addrlen); From df68e65f0553f9ad314249930a08fb35cb065774 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 8 Feb 2019 16:57:19 +0100 Subject: [PATCH 0450/1162] Fix check_swap percentage calculation This fixes the check_swap percentage calculation. When the pagefile is turned off the available swap and total swap are 0 which leads to a wrong calculation and misformated output. refs #6913 (cherry picked from commit 4961e9ba62eebcfc1cf22e1840b289e4eab067d2) --- plugins/check_swap.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 302f20b46..7579073b7 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -229,7 +229,10 @@ static int check_swap(printInfoStruct& printInfo) printInfo.aSwap += round(pageFiles.at(i).availableSpwap / pow(1024.0, printInfo.unit)); } - printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; + if (printInfo.aSwap > 0 && printInfo.tSwap > 0) + printInfo.percentFree = 100.0 * printInfo.aSwap / printInfo.tSwap; + else + printInfo.percentFree = 0; return -1; } From 29ff90a791d7ededd85bfa2153402a28e6d20e58 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 11 Feb 2019 13:17:52 +0100 Subject: [PATCH 0451/1162] Update AUTHORS --- AUTHORS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AUTHORS b/AUTHORS index f5c909682..a26d0fcce 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,7 @@ Adam Bolte Adam James Alan Jenkins +Alex Alexander A. Klimov Alexander Fuhr Alexander Schomburg @@ -40,6 +41,7 @@ Daniel Helgenberger Daniel Kesselberg Daniil Yaroslavtsev David Beck +David Lublink Denis Dinesh Majrekar Dirk Goetz @@ -99,6 +101,7 @@ Lars Krüger Leah Oswald Lee Clemens Lennart Betz +Leon Stringer Louis Sautier Luca Lesinigo Lucas Fairchild-Madar @@ -173,6 +176,7 @@ Steve McMaster Strajan Sebastian Ioan Strix <660956+MrStrix@users.noreply.github.com> Sven Nierlein +Sven Wegener T. Mulyana Thomas Forrer Thomas Gelf @@ -202,6 +206,7 @@ ctrlaltca dh.harald dominik-r-s <43005480+dominik-r-s@users.noreply.github.com> fbachmann +fluxX04 gitmopp jre3brg krishna From 146d055f4b9b4b7f266db3f78e64481e69c5c3e5 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 14 Nov 2018 14:25:37 +0100 Subject: [PATCH 0452/1162] Add technical docs for the check scheduler (general, initial check, offsets) David asked me about initial check offsets, so I wrote something :) (cherry picked from commit 9409e93bc798ffbe497c97cd110b492d533ce9dc) --- doc/19-technical-concepts.md | 190 +++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/doc/19-technical-concepts.md b/doc/19-technical-concepts.md index 278b2231f..b9021a28d 100644 --- a/doc/19-technical-concepts.md +++ b/doc/19-technical-concepts.md @@ -6,6 +6,7 @@ into specific Icinga 2 components such as: * [Application](19-technical-concepts.md#technical-concepts-application) * [Configuration](19-technical-concepts.md#technical-concepts-configuration) * [Features](19-technical-concepts.md#technical-concepts-features) +* [Check Scheduler](19-technical-concepts.md#technical-concepts-check-scheduler) * [Cluster](19-technical-concepts.md#technical-concepts-cluster) * [TLS Network IO](19-technical-concepts.md#technical-concepts-tls-network-io) @@ -196,6 +197,195 @@ to InfluxDB's HTTP API. +## Check Scheduler + +The check scheduler starts a thread which loops forever. It waits for +check events being inserted into `m_IdleCheckables`. + +If the current pending check event number is larger than the configured +max concurrent checks, the thread waits up until it there's slots again. + +In addition, further checks on enabled checks, check periods, etc. are +performed. Once all conditions have passed, the next check timestamp is +calculated and updated. This also is the timestamp where Icinga expects +a new check result ("freshness check"). + +The object is removed from idle checkables, and inserted into the +pending checkables list. This can be seen via REST API metrics for the +checker component feature as well. + +The actual check execution happens asynchronously using the application's +thread pool. + +Once the check returns, it is removed from pending checkables and again +inserted into idle checkables. This ensures that the scheduler takes this +checkable event into account in the next iteration. + +### Start + +When checkable objects get activated during the startup phase, +the checker feature registers a handler for this event. This is due +to the fact that the `checker` feature is fully optional, and e.g. not +used on command endpoint clients. + +Whenever such an object activation signal is triggered, Icinga 2 checks +whether it is [authoritative for this object](19-technical-concepts.md#technical-concepts-cluster-ha-object-authority). +This means that inside an HA enabled zone with two endpoints, only non-paused checkable objects are +actively inserted into the idle checkable list for the check scheduler. + +### Initial Check + +When a new checkable object (host or service) is initially added to the +configuration, Icinga 2 performs the following during startup: + +* `Checkable::Start()` is called and calculates the first check time +* With a spread delta, the next check time is actually set. + +If the next check should happen within a time frame of 60 seconds, +Icinga 2 calculates a delta from a random value. The minimum of `check_interval` +and 60 seconds is used as basis, multiplied with a random value between 0 and 1. + +In the best case, this check gets immediately executed after application start. +The worst case scenario is that the check is scheduled 60 seconds after start +the latest. + +The reasons for delaying and spreading checks during startup is that +the application typically needs more resources at this time (cluster connections, +feature warmup, initial syncs, etc.). Immediate check execution with +thousands of checks could lead into performance problems, and additional +events for each received check results. + +Therefore the initial check window is 60 seconds on application startup, +random seed for all checkables. This is not predictable over multiple restarts +for specific checkable objects, the delta changes every time. + +### Scheduling Offset + +There's a high chance that many checkable objects get executed at the same time +and interval after startup. The initial scheduling spreads that a little, but +Icinga 2 also attempts to ensure to keep fixed intervals, even with high check latency. + +During startup, Icinga 2 calculates the scheduling offset from a random number: + +* `Checkable::Checkable()` calls `SetSchedulingOffset()` with `Utility::Random()` +* The offset is a pseudo-random integral value between `0` and `RAND_MAX`. + +Whenever the next check time is updated with `Checkable::UpdateNextCheck()`, +the scheduling offset is taken into account. + +Depending on the state type (SOFT or HARD), either the `retry_interval` or `check_interval` +is used. If the interval is greater than 1 second, the time adjustment is calculated in the +following way: + +`now * 100 + offset` divided by `interval * 100`, using the remainder (that's what `fmod()` is for) +and dividing this again onto base 100. + +Example: offset is 6500, interval 300, now is 1542190472. + +``` +1542190472 * 100 + 6500 = 154219053714 +300 * 100 = 30000 +154219053714 / 30000 = 5140635.1238 + +(5140635.1238 - 5140635.0) * 30000 = 3714 +3714 / 100 = 37.14 +``` + +37.15 seconds as an offset would be far too much, so this is again used as a calculation divider for the +real offset with the base of 5 times the actual interval. + +Again, the remainder is calculated from the offset and `interval * 5`. This is divided onto base 100 again, +with an additional 0.5 seconds delay. + +Example: offset is 6500, interval 300. + +``` +6500 / 300 = 21.666666666666667 +(21.666666666666667 - 21.0) * 300 = 200 +200 / 100 = 2 +2 + 0.5 = 2.5 +``` + +The minimum value between the first adjustment and the second offset calculation based on the interval is +taken, in the above example `2.5` wins. + +The actual next check time substracts the adjusted time from the future interval addition to provide +a more widespread scheduling time among all checkable objects. + +`nextCheck = now - adj + interval` + +You may ask, what other values can happen with this offset calculation. Consider calculating more examples +with different interval settings. + +Example: offset is 34567, interval 60, now is 1542190472. + +``` +1542190472 * 100 + 34567 = 154219081767 +60 * 100 = 6000 +154219081767 / 6000 = 25703180.2945 +(25703180.2945 - 25703180.0) * 6000 / 100 = 17.67 + +34567 / 60 = 576.116666666666667 +(576.116666666666667 - 576.0) * 60 / 100 + 0.5 = 1.2 +``` + +`1m` interval starts at `now + 1.2s`. + +Example: offset is 12345, interval 86400, now is 1542190472. + +``` +1542190472 * 100 + 12345 = 154219059545 +86400 * 100 = 8640000 +154219059545 / 8640000 = 17849.428188078703704 +(17849.428188078703704 - 17849) * 8640000 = 3699545 +3699545 / 100 = 36995.45 + +12345 / 86400 = 0.142881944444444 +0.142881944444444 * 86400 / 100 + 0.5 = 123.95 +``` + +`1d` interval starts at `now + 2m4s`. + +> **Note** +> +> In case you have a better algorithm at hand, feel free to discuss this in a PR on GitHub. +> It needs to fulfill two things: 1) spread and shuffle execution times on each `next_check` update +> 2) not too narrowed window for both long and short intervals +> Application startup and initial checks need to be handled with care in a slightly different +> fashion. + +When `SetNextCheck()` is called, there are signals registered. One of them sits +inside the `CheckerComponent` class whose handler `CheckerComponent::NextCheckChangedHandler()` +deletes/inserts the next check event from the scheduling queue. This basically +is a list with multiple indexes with the keys for scheduling info and the object. + + +### Check Latency and Execution Time + +Each check command execution logs the start and end time where +Icinga 2 (and the end user) is able to calculate the plugin execution time from it. + +``` +GetExecutionEnd() - GetExecutionStart() +``` + +The higher the execution time, the higher the command timeout must be set. Furthermore +users and developers are encouraged to look into plugin optimizations to minimize the +execution time. Sometimes it is better to let an external daemon/script do the checks +and feed them back via REST API. + +Icinga 2 stores the scheduled start and end time for a check. If the actual +check execution time differs from the scheduled time, e.g. due to performance +problems or limited execution slots (concurrent checks), this value is stored +and computed from inside the check result. + +The difference between the two deltas is called `check latency`. + +``` +(GetScheduleEnd() - GetScheduleStart()) - CalculateExecutionTime() +``` + + ## Cluster ### Communication From ac80444129c5940c9e817f3ba48e1780be630213 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:49:27 +0100 Subject: [PATCH 0453/1162] Docs: First draft for development docs (cherry picked from commit 4382b87baa0f4fa433772b2b38814fce0d443200) --- doc/21-development.md | 1571 +++++++++++++++++++++++++++++++++++------ 1 file changed, 1350 insertions(+), 221 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index d90d50def..1ff183434 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1,14 +1,19 @@ -# Develop Icinga 2 +# Development This chapter provides hints on Icinga 2 development -especially for debugging purposes. +and debugging. -> **Note** -> -> If you are planning to build your own development environment, -> please consult the `INSTALL.md` file from the source tree. +## Debug Icinga 2 -## Debug Requirements +This chapter targets all users who have been asked by developers to provide +a stack trace or coredump if the application crashed. It is also useful +for developers working with different debuggers. + +> **Note:** +> This is intentionally mentioned before any development insights +> as debugging is a more frequent and commonly asked question. + +### Debug Requirements Make sure that the debug symbols are available for Icinga 2. The Icinga 2 packages provide a debug package which must be @@ -17,43 +22,1364 @@ or `icinga2-ido-mysql`. Debian/Ubuntu: - # apt-get install icinga2-dbg +``` +apt-get install icinga2-dbg +``` RHEL/CentOS: - # yum install icinga2-debuginfo +``` +yum install icinga2-debuginfo +``` Fedora: - # dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` +dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` SLES/openSUSE: - # zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` +zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo +``` - -Furthermore, you may also have to install debug symbols for Boost and your C library. +Furthermore, you may also have to install debug symbols for Boost and your C++ library. If you're building your own binaries, you should use the `-DCMAKE_BUILD_TYPE=Debug` cmake build flag for debug builds. -## GDB +### GDB as Debugger -Install gdb: +Install GDB in your development environment. Debian/Ubuntu: - # apt-get install gdb +``` +apt-get install gdb +``` RHEL/CentOS/Fedora: - # yum install gdb +``` +yum install gdb +``` SLES/openSUSE: - # zypper install gdb +``` +zypper install gdb +``` +#### GDB Run + +Call GDB with the binary (`/usr/sbin/icinga2` is a wrapper script calling +`/usr/lib64/icinga2/sbin/icinga2` since 2.4) and all arguments and run it in foreground. + +``` +gdb --args /usr/lib64/icinga2/sbin/icinga2 daemon -x debug +``` + +The exact path to the Icinga 2 binary differs on each distribution. On Ubuntu +it is installed into `/usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2` on 64-bit systems +for example. + +> **Note** +> +> If gdb tells you it's missing debug symbols, quit gdb and install +> them: `Missing separate debuginfos, use: debuginfo-install ...` + +Run/restart the application. + +``` +(gdb) r +``` + +Kill the running application. + +``` +(gdb) k +``` + +Continue after breakpoint. + +``` +(gdb) c +``` + +#### GDB Core Dump + +Either attach to the running process using `gdb -p PID` or start +a new gdb run. + +``` +(gdb) r +(gdb) generate-core-file +``` + +#### GDB Backtrace + +If Icinga 2 aborted its operation abnormally, generate a backtrace. +`thread apply all` is important here since this includes all running threads. +We need this information when e.g. debugging dead locks and hanging features. + +``` +(gdb) bt +(gdb) thread apply all bt full +``` + +If gdb stops at a SIGPIPE signal please disable the signal before +running Icinga 2. This isn't an error, but we need to workaround it. + +``` +(gdb) handle SIGPIPE nostop noprint pass +(gdb) r +``` + +If you create a [new issue](https://github.com/Icinga/icinga2/issues), +make sure to attach as much detail as possible. + +#### GDB Backtrace from Running Process + +If Icinga 2 is still running, generate a full backtrace from the running +process and store it into a new file (e.g. for debugging dead locks). + +Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs +and add them to the GitHub issue. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done +``` + +#### GDB Thread List from Running Process + +Instead of a full backtrace, you sometimes just need a list of running threads. + +``` +for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done +``` + +#### GDB Backtrace Stepping + +Identifying the problem may require stepping into the backtrace, analysing +the current scope, attributes, and possible unmet requirements. `p` prints +the value of the selected variable or function call result. + +``` +(gdb) up +(gdb) down +(gdb) p checkable +(gdb) p checkable.px->m_Name +``` + +#### GDB Breakpoints + +To set a breakpoint to a specific function call, or file specific line. + +``` +(gdb) b checkable.cpp:125 +(gdb) b icinga::Checkable::SetEnablePerfdata +``` + +GDB will ask about loading the required symbols later, select `yes` instead +of `no`. + +Then run Icinga 2 until it reaches the first breakpoint. Continue with `c` +afterwards. + +``` +(gdb) run +(gdb) c +``` + +In case you want to step into the next line of code, use `n`. If there is a +function call where you want to step into, use `s`. + +``` +(gdb) n + +(gdb) s +``` + +If you want to delete all breakpoints, use `d` and select `yes`. + +``` +(gdb) d +``` + +> **Tip** +> +> When debugging exceptions, set your breakpoint like this: `b __cxa_throw`. + +Breakpoint Example: + + (gdb) b __cxa_throw + (gdb) r + (gdb) up + .... + (gdb) up + #11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function const&, int) (path=..., pattern=..., callback=..., type=1) + at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609 + 609 callback(cpath); + (gdb) l + 604 + 605 #endif /* _WIN32 */ + 606 + 607 std::sort(files.begin(), files.end()); + 608 BOOST_FOREACH(const String& cpath, files) { + 609 callback(cpath); + 610 } + 611 + 612 std::sort(dirs.begin(), dirs.end()); + 613 BOOST_FOREACH(const String& cpath, dirs) { + (gdb) p files + $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615, + m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}} + + +### Core Dump + +When the Icinga 2 daemon crashes with a `SIGSEGV` signal +a core dump file should be written. This will help +developers to analyze and fix the problem. + +#### Core Dump File Size Limit + +This requires setting the core dump file size to `unlimited`. + +Example for Systemd: + +``` +vim /usr/lib/systemd/system/icinga2.service + +[Service] +... +LimitCORE=infinity + +systemctl daemon-reload + +systemctl restart icinga2 +``` + +Example for init script: + +``` +vim /etc/init.d/icinga2 +... +ulimit -c unlimited + +service icinga2 restart +``` + +Verify that the Icinga 2 process core file size limit is set to `unlimited`. + +``` +cat /proc/`pidof icinga2`/limits +... +Max core file size unlimited unlimited bytes +``` + + +#### Core Dump Kernel Format + +The Icinga 2 daemon runs with the SUID bit set. Therefore you need +to explicitly enable core dumps for SUID on Linux. + +``` +sysctl -w fs.suid_dumpable=1 +``` + +Adjust the coredump kernel format and file location on Linux: + +``` +sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p + +install -m 1777 -d /var/lib/cores +``` + +MacOS: + +``` +sysctl -w kern.corefile=/cores/core.%P + +chmod 777 /cores +``` + +#### Core Dump Analysis + +Once Icinga 2 crashes again a new coredump file will be written. Please +attach this file to your bug report in addition to the general details. + +Simple test case for a `SIGSEGV` simulation with `sleep`: + +``` +ulimit -c unlimited +sleep 1800& +[1] +kill -SEGV +gdb `which sleep` /var/lib/cores/core.sleep. +(gdb) bt +rm /var/lib/cores/core.sleep.* +``` + +Analyzing Icinga 2: + +``` +gdb /usr/lib64/icinga2/sbin/icinga2 core.icinga2. +(gdb) bt +``` + +### LLDB as Debugger + +LLDB is available on macOS with the Xcode command line tools. + +``` +$ xcode-select --install +``` + +In order to run Icinga 2 with LLDB you need to pass the binary as argument. + +``` +lldb -- /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon +``` + +Full backtrace: + +``` +> bt all +``` + +Select thread: + +``` +> thr sel 5 +``` + +Step into: + +``` +> s +``` + +Next step: + +``` +> n +``` + +Continue: + +``` +> c +``` + +Up/down in stacktrace: + +``` +> up +> down +``` + + + +## Develop Icinga 2 + +Icinga 2 can be built on many platforms such as Linux, Unix and Windows. +There are limitations in terms of support, e.g. Windows is only supported for clients, +not a full-featured master or satellite. + +Before you start with actual development, there is a couple of pre-requisites. + +### Choose your Editor + +Icinga 2 can be developed with your favorite editor. Icinga developers prefer to use +the tools below: + +- vim +- CLion (macOS, Linux) +- MS Visual Studio (Windows) +- Atom + +Editors differ on the functionality. The more helpers you get for C++ development, +the faster your development workflow will be. + + +#### Whitespace Cleanup + +Patches must be cleaned up and follow the indent style (tabs instead of spaces). +You should also remove any training whitespaces. + +`git diff` allows to highlight such. + +``` +vim $HOME/.gitconfig + +[color "diff"] + whitespace = red reverse +[core] + whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol +``` + +`vim` also can match these and visually alert you to remove them. + +``` +vim $HOME/.vimrc + +highlight ExtraWhitespace ctermbg=red guibg=red +match ExtraWhitespace /\s\+$/ +autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ +autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@ + +Icinga 2 can run standalone or in distributed environments. It contains a whole lot +more than a simple check execution engine. + +Read more about it in the [Technical Concepts](#technical-concepts) chapter. + +### Get to know the code + +First off, you really need to know C++ and portions of C++11 and the boost libraries. +Best is to start with a book or online tutorial to get into the basics. +Icinga developers gained their knowledge through studies, training and self-teaching +code by trying it out and asking senior developers for guidance. + +Here's a few books we can recommend: + +* [Accelerated C++: Practical Programming by Example](https://www.amazon.com/Accelerated-C-Practical-Programming-Example/dp/020170353X) (Andrew Koenig, Barbara E. Moo) +* [Effective C++](https://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876) (Scott Meyers) +* [Der C++ Programmierer](https://www.amazon.de/Programmierer-lernen-Professionell-anwenden-L%C3%B6sungen/dp/3446416447), German (Ulrich Breymann) +* [C++11 programmieren](https://www.amazon.de/gp/product/3836217325/), German (Torsten T. Will) + +In addition, it is a good bet to also know SQL when diving into backend development. + +* [SQL Performance Explained](https://www.amazon.de/gp/product/3950307826/) (Markus Winand) + +Last but not least, if you are developing on Windows, get to know the internals about services and the Win32 API. + + +### Design Patterns + +Icinga 2 heavily relies on object-oriented programming and encapsulates common +functionality into classes and objects. It also uses modern programming techniques +to e.g. work with shared pointer memory management. + +Icinga 2 consists of libraries bundled into the main binary. Therefore you'll +find many code parts in the `lib/` directory wheras the actual application is +built from `icinga-app/`. Accompanied with Icinga 2, there's the Windows plugins +which are standalone and compiled from `plugins/`. + +Library | Description +---------------|------------------------------------ +base | Objects, values, types, streams, tockets, TLS, utilities, etc. +config | Configuration compiler, expressions, etc. +cli | CLI (sub) commands and helpers. +icinga | Icinga specific objects and event handling. +remote | Cluster and HTTP client/server and REST API related code. +checker | Checker feature, check scheduler. +notification | Notification feature, notification scheduler. +methods | Command execution methods, plugins and built-in checks. +perfdata | Performance data related, including Graphite, Elastic, etc. +db\_ido | IDO database abstraction layer. +db\_ido\_mysql | IDO database driver for MySQL. +db\_ido\_pgsql | IDO database driver for PgSQL. +mysql\_shin | Library stub for linking against the MySQL client libraries. +pgsql\_shim | Library stub for linking against the PgSQL client libraries. + +Another thing you will recognize are the `.ti` files which are compiled +by our own class compiler into actual source code. The meta language allows +developers to easily add object attributes and specify their behaviour. + +Some object attributes need to be stored over restarts in the state file +and therefore have the `state` attribute set. Others are treated as `config` +attribute and automatically get configuration validation functions created. +Hidden or read-only REST API attributes are marked with `no_user_view` and +`no_user_modify`. + +The most beneficial thing are getters and setters being generated. The actual object +inherits from `ObjectImpl` and therefore gets them "for free". + +Example: + +``` +vim lib/perfdata/gelfwriter.ti + + [config] enable_tls; + +vim lib/perfdata/gelfwriter.cpp + + if (GetEnableTls()) { +``` + +The logic is hidden in `tools/mkclass/` in case you want to learn more about it. +The first steps during CMake & make also tell you about code generation. + + +### Build Tool: CMake + +In its early development stages in 2012, Icinga 2 was built with autoconf/automake +and separate Windows project files. We've found this very fragile, and have changed +this into CMake as our build tool. + +The most common benefits: + +* Everything is described in CMakeLists.txt in each directory +* CMake only needs to know that a sub directory needs to be included. +* The global CMakeLists.txt acts as main entry point for requirement checks and library/header includes. +* Separate binary build directories, the actual source tree stays clean. +* CMake automatically generates a Visual Studio project file `icinga2.sln` on Windows. + +### Builds: Unity Builds + +Another thing you should be aware of: Unity builds on and off. + +Typically, we already use caching mechanisms to reduce recompile time with ccache. +For release builds, there's always a new build needed as the difference is huge compared +to a previous (major) release. + +Therefore we've invented the Unity builds, which basically concatenates all source files +into one big library source code file. The compiler then doesn't need to load the many small +files but compiles and links this huge one. + +Unity builds require more memory which is why you should disable them for development +builds in small sized VMs (Linux, Windows) and also Docker containers. + +There's a couple of header files which are included everywhere. If you touch/edit them, +the cache is invalidated and you need to recompile a lot more files then. `base/utility.hpp` +and `remote/zone.hpp` are good candidates for this. + + +### Linux Dev Environment + +Based on CentOS 7, we have an early draft available inside the Icinga Vagrant boxes: +[centos7-dev](https://github.com/Icinga/icinga-vagrant/tree/master/centos7-dev). + +If you're compiling Icinga 2 natively without any virtualization layer in between, +this usually is faster. This is also the reason why developers on macOS prefer native builds +over Linux or Windows VMs. Don't forget to test the actual code on Linux later! Socket specific +stuff like `epoll` is not available on Unix kernels. + +Depending on your workstation and environment, you may either develop and run locally, +use a container deployment pipeline or put everything in a high end resource remote VM. + +#### Prepare Linux Dev Environment + +Create two build directories for different binary builds. + +* `debug` contains the debug build binaries. They contain more debug information and run tremendously slower than release builds from packages. Don't use them for benchmarks. +* `release` contains the release build binaries, as you would install them on a live system. This helps comparing specific scenarios for race conditions and more. + +``` +mkdir -p release debug +``` + +Next, check the required packages to build Icinga 2, and install them. + +CentOS: + +``` + +``` + +Debian/Ubuntu: + +``` + +``` + +##### Debian Stretch + +``` +apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libyajl-dev libedit-dev monitoring-plugins + +ln -s /usr/bin/ccache /usr/local/bin/g++ + +groupadd icinga +groupadd icingacmd +useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga + +git clone https://github.com/icinga/icinga2.git && cd icinga2 + +mkdir debug release +cd debug +cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin +cd .. +make -j2 install -C debug +``` + + +``` +chown -R icinga:icinga /usr/local/icinga2/var/ + +cd /usr/local/icinga2 +./lib/icinga2/prepare-dirs etc/sysconfig/icinga2 +icinga2 api setup +vim etc/icinga2/conf.d/api-users.conf + +gdb --args ./lib/icinga2/sbin/icinga2 daemon +``` + + + +### macOS Dev Environment + +It is advised to use Homebrew to install all required build dependencies. +Macports have been reported to work as well, typically you'll get more help +with Homebrew. + +We will also build two different flavors. + +``` +mkdir -p release debug +``` + + + +### Windows Dev Environment + +The following sections explain how to setup the required build tools +and how to run and debug the code. + +#### Chocolatey + +Open an administrative command prompt (Win key, type “cmd”, right-click and “run as administrator”) and paste the following instructions: + +``` +@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin +``` + +#### Visual Studio + +Thanks to Microsoft they’ll now provide their Professional Edition of Visual Studio 2017 +as community version, free for use for open source projects such as Icinga. +The installation requires ~9GB disk space. [Download](https://www.visualstudio.com/downloads/) +the web installer and start the installation. + +You need a free Microsoft account to download and also store your preferences. + +Choose the following minimal set: + +* .NET Framework 4.x SDK +* C# Compiler +* Visual Studio C++ core features +* VC++ toolset +* Windows 10 SDK (10.0.10240.0 - required) +* Just-in-time debugger +* Windows 8 SDK (includes mscoree.lib required by clrchecktask) +* C++/CLI support +* Windows Universal C Runtime +* Git for Windows +* .NET Framework 3.5 development tools +* Github extension for Visual Studio + +After a while, Visual Studio will be ready. + +#### Flex and Bison + +Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html): + +``` +choco install -y winflexbison +``` + +Chocolatey installs these tools into the hidden directory `C:\ProgramData\chocolatey\lib\winflexbison\tools`. + +#### OpenSSL + +Icinga 2 requires the OpenSSL library. [Download](http://slproweb.com/products/Win32OpenSSL.html) +and install it into the default path. + +Once asked for `Copy OpenSSLs DLLs to` select `The Windows system directory`. That way CMake/Visual Studio +will automatically detect them for builds and packaging. + +> **Note** +> +> We cannot use the chocolatey package as this one does not provide any development headers. +> +> Choose 1.0.2 LTS from manual downloads for best compatibility if unsure. + +#### Boost + +In order to use the boost development header and library files you need to [download](http://www.boost.org/users/download/) +Boost and then extract it to e.g. `C:\boost_1_65_1`. + +> **Note** +> +> Just use `C:`, the zip file already contains the sub folder. Extraction takes a while, +> the archive contains more than 10k files. + +For integrating Boost into Visual Studio 2017, open the `Developer Command Prompt` from the start menu, +and navigate to `C:\boost_1_65_1`. + +Execute `bootstrap.bat` first. + +``` +cd C:\boost_1_65_1 +bootstrap.bat +``` + +Once finished, specify the required `toolset` to compile boost against Visual Studio. +This takes quite some time in a Windows VM. + +Visual Studio 2015: + +``` +b2 --toolset=msvc-14.0 +``` + +Visual Studio 2017: + +``` +b2 --toolset=msvc-14.1 +``` + +#### TortoiseGit + +TortoiseGit provides a graphical integration into the Windows explorer. This makes it easier to checkout, commit +and whatnot. + +[Download](https://tortoisegit.org/download/) TortoiseGit on your system. + +In order to clone via Git SSH you also need to create a new directory called `.ssh` +inside your user's home directory. +Therefore open a command prompt (win key, type `cmd`, enter) and run `mkdir .ssh`. +Add your `id_rsa` private key and `id_rsa.pub` public key files into that directory. + +Start the setup routine and choose `OpenSSH` as default secure transport when asked. + +Open a Windows Explorer window and navigate into + +Version | Project Location +--------------------|------------------------------ +Visual Studio 2015 | `C:\Users\michi\Documents\Visual Studio 2015\Projects` +Visual Studio 2017+ | `C:\Users\michi\source\repos` + +Right click and select `Git Clone` from the context menu. + +Use `ssh://git@github.com/icinga/icinga2.git` for SSH clones, `https://github.com/icinga/icinga2.git` otherwise. + +#### CMake + +Icinga 2 uses CMake to manage the build environment. You can generate the Visual Studio project files +using CMake. [Download](https://cmake.org/download/) and install CMake. Select to add it to PATH for all users +when asked. + +Once setup is completed, open a command prompt and navigate to + +Visual Studio 2015 + +``` +cd C:\Users\\Documents\Visual Studio 2015\Projects\icinga2 +``` + +Visual Studio 2017 + +``` +cd C:\Users\michi\source\repos +``` + +Run CMake with the following command. This generates a new Visual Studio project file called `icinga2.sln`. + +You need to specify the previously installed component paths: + +Variable | Value | Description +----------------------|----------------------------------------------------------------------| +BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. +BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. +FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. +ICINGA2_WITH_MYSQL | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. +ICINGA2_WITH_PGSQL | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. +ICINGA2_UNITY_BUILD | OFF | Disable unity builds for development environments. + +Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables. + +``` +cmake . -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF +``` + +Best is write a small batch/Powershell script which just executes these lines. + + +#### Icinga 2 in Visual Studio + +Navigate to + +Version | Project location +--------------------|------------------------- +Visual Studio 2015 | `C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2` +Visual Studio 2017+ | `C:\Users\michi\source\repos\icinga2` + +Open `icinga2.sln`. Log into Visual Studio when asked. + +On the right panel, select to build the `Bin/icinga-app` solution. + +The executable binaries are located in `Bin\Release\Debug` in your `icinga2` +project directory. + +Navigate there and run `icinga2.exe --version`. + +Example for Visual Studio 2017: + +``` +cd C:\Users\michi\source\repos\icinga2\Bin\Release\Debug +icinga2.exe --version +``` + + +#### Release Package + +CMake uses CPack and NSIS to create the setup executable including all binaries and libraries +in addition to setup dialogues and configuration. Therefore we’ll need to install [NSIS](http://nsis.sourceforge.net/Download) +first. + +We also need to install the Windows Installer XML (WIX) toolset. + +``` +choco install -y wixtoolset +``` + +Once completed open an administrative shell and navigate to your Visual Studio project. +Let CMake to build a release package. + +``` +cd "c:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2" +cmake --build . --target PACKAGE --config Release +``` + +Note: This will still use the debug builds. A yet more clean approach +is to run CMake with changed release parameters beforehand and then +re-run the release package builder. + +``` +C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2> +cmake . -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Release -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF + +cmake --build . --target PACKAGE --config Release +``` + +Again, put these lines into a batch/Powershell script and execute that. + + + +### Embedded Dev Env: Pi + +> **Note** +> +> This isn't officially supported yet, just a few hints how you can do it yourself. + +armhf on Raspberry Pi, ccache: + +``` +apt install -y ccache + +/usr/sbin/update-ccache-symlinks + +echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc + +source ~/.bashrc && echo $PATH +``` + +## Package Builds + +This documentation is explicitly meant for packagers and the Icinga +build infrastructure. + +The following requirements need to be fulfilled in order to build the +Icinga application using a dist tarball (including notes for distributions): + +* cmake >= 2.6 +* GNU make (make) or ninja-build +* C++ compiler which supports C++11 + - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below) + - Debian/Ubuntu: build-essential + - Alpine: build-base + - you can also use clang++ +* pkg-config +* OpenSSL library and header files >= 1.0.1 + - RHEL/Fedora: openssl-devel + - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel) + - Debian/Ubuntu: libssl-dev + - Alpine: libressl-dev +* Boost library and header files >= 1.48.0 + - RHEL/Fedora: boost148-devel + - Debian/Ubuntu: libboost-all-dev + - Alpine: boost-dev +* GNU bison (bison) +* GNU flex (flex) >= 2.5.35 +* Systemd headers + - Only required when using Systemd + - Debian/Ubuntu: libsystemd-dev + - RHEL/Fedora: systemd-devel + +### Optional features + +* MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) + - RHEL/Fedora: mysql-devel + - SUSE: libmysqlclient-devel + - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev + - Alpine: mariadb-dev +* PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`) + - RHEL/Fedora: postgresql-devel + - Debian/Ubuntu: libpq-dev + - postgresql-dev on Alpine +* YAJL (Faster JSON library) + - RHEL/Fedora: yajl-devel + - Debian: libyajl-dev + - Alpine: yajl-dev +* libedit (CLI console) + - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms) + - Debian/Ubuntu/Alpine: libedit-dev +* Termcap (only required if libedit doesn't already link against termcap/ncurses) + - RHEL/Fedora: libtermcap-devel + - Debian/Ubuntu: (not necessary) + +### Special requirements + +**FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) + +**RHEL6**: Requires a newer boost version which is available on packages.icinga.com +with a version suffixed name. + +### Runtime user environment + +By default Icinga will run as user `icinga` and group `icinga`. Additionally the +external command pipe and livestatus features require a dedicated command group +`icingacmd`. You can choose your own user/group names and pass them to CMake +using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. + +``` +# groupadd icinga +# groupadd icingacmd +# useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga +``` + +On Alpine (which uses ash busybox) you can run: + +``` +# addgroup -S icinga +# addgroup -S icingacmd +# adduser -S -D -H -h /var/spool/icinga2 -s /sbin/nologin -G icinga -g icinga icinga +# adduser icinga icingacmd +``` + +Add the web server user to the icingacmd group in order to grant it write +permissions to the external command pipe and livestatus socket: +``` +# usermod -a -G icingacmd www-data +``` + +Make sure to replace "www-data" with the name of the user your web server +is running as. + +### Building Icinga 2: Example + +Once you have installed all the necessary build requirements you can build +Icinga 2 using the following commands: + +``` +$ mkdir release && cd release +$ cmake .. +$ cd .. +$ make -C release +$ make install -C release +``` + +You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`: + +``` +$ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 +``` + +### CMake Variables + +In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. + +For all variables regarding defaults paths on in CMake, see +[GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html). + +Also see `CMakeLists.txt` for details. + +**System Environment** +- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` +- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` +- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2` +- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2` +- `ICINGA2_DATADIR`: Data directory for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2` +- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2` +- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2` +- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2` +- `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON` +- `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga` +- `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga` +- `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd` +- `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from; + defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2` +- `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` + +**Build Optimization** +- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware. +- `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF` + +**Init System** +- `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF` +- `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file + and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set. + Only use this for special packaging purposes and if you know what you are doing. + Defaults to `OFF`. + +**Features:** +- `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON` +- `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON` +- `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF` +- `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF` +- `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON` +- `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON` +- `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON` +- `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON` + +**MySQL or MariaDB:** + +The following settings can be tuned for the MySQL / MariaDB IDO feature. + +- `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON` +- `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient` +- `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty - + checking multiple paths like `/usr/include/mysql` + +See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation. + +**PostgreSQL:** + +The following settings can be tuned for the PostgreSQL IDO feature. + +- `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON` +- `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories +- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file) + +See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation. + +**Version detection:** + +CMake determines the Icinga 2 version number using `git describe` if the +source directory is contained in a Git repository. Otherwise the version number +is extracted from the [VERSION](VERSION) file. This behavior can be +overridden by creating a file called `icinga-version.h.force` in the source +directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake +can be used to disable the usage of `git describe`. + + +### Building RPMs + +#### Build Environment on RHEL, CentOS, Fedora, Amazon Linux + +Setup your build environment: +``` +yum -y install rpmdevtools +``` + +#### Build Environment on SuSE/SLES + +SLES: +``` +zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP3/devel:tools.repo +zypper refresh +zypper install rpmdevtools spectool +``` + +OpenSuSE: +``` +zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_15.0/devel:tools.repo +zypper refresh +zypper install rpmdevtools spectool +``` + +#### Package Builds + +Prepare the rpmbuild directory tree: +``` +cd $HOME +rpmdev-setuptree +``` + +Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: +``` +curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec +``` + +> **Note** +> +> The above command builds snapshot packages. Change to the `release` branch +> for release package builds. + +Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary +provided with `rpmdevtools`: +``` +cd $HOME/rpmbuild/SOURCES +spectool -g ../SPECS/icinga2.spec + +cd $HOME/rpmbuild +``` + +Install the build dependencies. Example for CentOS 7: +``` +yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ +cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ +selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc +``` + +Note: If you are using Amazon Linux, systemd is not required. + +A shorter way is available using the `yum-builddep` command on RHEL based systems: +``` +yum-builddep SPECS/icinga2.spec +``` + +Build the RPM: +``` +rpmbuild -ba SPECS/icinga2.spec +``` + +#### Additional Hints + +##### SELinux policy module + +The following packages are required to build the SELinux policy module: + +* checkpolicy +* selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7) +* selinux-policy-doc + +##### RHEL/CentOS 6 + +The RedHat Developer Toolset is required for building Icinga 2 beforehand. +This contains a modern version of flex and a C++ compiler which supports +C++11 features. +``` +cat >/etc/yum.repos.d/devtools-2.repo <$HOME/.rpmmacros < **WARNING:** This information is outdated! + +Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from +the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) +into your source tree and run the following command: +``` +$ dpkg-buildpackage -uc -us +``` + +## Build Alpine Linux packages + +A simple way to setup a build environment is installing Alpine in a chroot. +In this way, you can set up an Alpine build environment in a chroot under a +different Linux distro. +There is a script that simplifies these steps with just two commands, and +can be found [here](https://github.com/alpinelinux/alpine-chroot-install). + +Once the build environment is installed, you can setup the system to build +the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). + +# Build Post Install Tasks + +After building Icinga 2 yourself, your package build system should at least run the following post +install requirements: + +* enable the `checker`, `notification` and `mainlog` feature by default +* run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node + +## Run Icinga 2 + +Icinga 2 comes with a binary that takes care of loading all the relevant +components (e.g. for check execution, notifications, etc.): +``` +# icinga2 daemon +[2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) +[2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). +[2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). +... +``` + +### Init Script + +Icinga 2 can be started as a daemon using the provided init script: +``` +# /etc/init.d/icinga2 +Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} +``` + +### Systemd + +If your distribution uses Systemd: +``` +# systemctl {start|stop|reload|status|enable|disable} icinga2 +``` + +In case the distribution is running Systemd >227, you'll also +need to package and install the `etc/initsystem/icinga2.service.limits.conf` +file into `/etc/systemd/system/icinga2.service.d`. + +### openrc + +Or if your distribution uses openrc (like Alpine): +``` +# rc-service icinga2 +Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} + ``` + +Note: the openrc's init.d is not shipped by default. +A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. +Those few steps can be followed: +``` +# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd +# mv icinga2.initd /etc/init.d/icinga2 +# chmod +x /etc/init.d/icinga2 +``` + +Icinga 2 reads a single configuration file which is used to specify all +configuration settings (global settings, hosts, services, etc.). The +configuration format is explained in detail in the [doc/](doc/) directory. + +By default `make install` installs example configuration files in +`/usr/local/etc/icinga2` unless you have specified a different prefix or +sysconfdir. + + +### Windows + +The Windows MSI packages are located at https://packages.icinga.com/windows/ + +#### Requirements + +* 32 or 64-bit system +* Visual Studio >= 14 2015 +* CMake >= 2.6 +* OpenSSL >= 1.0.1 +* Flex and Bison + +##### Visual Studio + +Download the community edition from [visualstudio.com](https://www.visualstudio.com/en/downloads/) + +Workloads to install: +* C++ Desktop +* .NET Desktop + +##### OpenSSL for Icinga + +Download custom OpenSSL builds from [openssl-windows GitHub project](https://github.com/Icinga/openssl-windows/releases). + +You need to install a binary dist version to 'C:\\Program Files\\OpenSSL'. + +The Powershell script `.\tools\win32\download-openssl.ps1` can be used for automated downloads. + +##### Chocolatey + +A simple package manager for Windows, please see [install instructions](https://chocolatey.org/install). + +##### Git + +Use Chocolatey, see [package details](https://chocolatey.org/packages/git). + +``` +choco install git +``` + +##### Flex / Bison + +Use Chocolatey, see [package details](https://chocolatey.org/packages/winflexbison3). + +``` +choco install winflexbison3 +``` + +##### CMake + +Use Chocolatey, see [package details](https://chocolatey.org/packages/cmake) +or download from: [cmake.org](https://cmake.org/download/) + +``` +choco install cmake +``` + +##### WIX + +Use Chocolatey, see [package details](https://chocolatey.org/packages/wixtoolset). + +``` +choco install wixtoolset +``` + +##### Boost + +Download third party Windows binaries from: [boost.org](http://www.boost.org/users/download/) + +For example: `https://dl.bintray.com/boostorg/release/1.65.1/binaries/boost_1_65_1-msvc-14.1-64.exe` + +*Warning:* +* Must match your Visual Studio version! +* CMake might not support the latest Boost version (we used CMake 3.10 and Boost 1_65_1) + +Run the installer exe. + + +#### Build Icinga 2 + +Run with VC Native x64 Command Prompt: + +``` +powershell .\tools\win32\configure.ps1 +powershell .\tools\win32\build.ps1 +powershell .\tools\win32\test.ps1 +``` + +See these scripts for details. + +#### CI: AppVeyor + +We are building [Icinga 2 with AppVeyor](https://ci.appveyor.com/project/icinga/icinga2) for testing and CI integration. + +Please check `appveyor.yml` for instructions. + + + +## Advanced Development Tips + +### GDB Pretty Printers Install the `boost`, `python` and `icinga2` pretty printers. Absolute paths are required, so please make sure to update the installation paths accordingly (`pwd`). @@ -118,217 +1444,20 @@ the duplicate import in your `~/.gdbinit` file. RuntimeError: pretty-printer already registered: libstdc++-v6 -### GDB Run -Call GDB with the binary (`/usr/sbin/icinga2` is a wrapper script calling -`/usr/lib64/icinga2/sbin/icinga2` since 2.4) and all arguments and run it in foreground. +## Development Tests - # gdb --args /usr/lib64/icinga2/sbin/icinga2 daemon -x debug --no-stack-rlimit +Build the binaries and run the tests. -The exact path to the Icinga 2 binary differs on each distribution. On Ubuntu -it is installed into `/usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2` on 64-bit systems -for example. - -> **Note** -> -> If gdb tells you it's missing debug symbols, quit gdb and install -> them: `Missing separate debuginfos, use: debuginfo-install ...` - -Run the application. - - (gdb) r - -Kill the running application. - - (gdb) k - -Continue after breakpoint. - - (gdb) c - -### GDB Core Dump - -Either attach to the running process using `gdb -p PID` or start -a new gdb run. - - (gdb) r - (gdb) generate-core-file - -### GDB Backtrace - -If Icinga 2 aborted its operation abnormally, generate a backtrace. - - (gdb) bt - (gdb) thread apply all bt full - -If gdb stops at a SIGPIPE signal please disable the signal before -running Icinga 2. - - (gdb) handle SIGPIPE nostop noprint pass - (gdb) r - -If you create a [new issue](https://github.com/Icinga/icinga2/issues), -make sure to attach as much detail as possible. - -### GDB Backtrace from Running Process - -If Icinga 2 is still running, generate a full backtrace from the running -process and store it into a new file (e.g. for debugging dead locks): - -Icinga 2 runs with 2 processes, therefore generate two backtrace logs -and add them to the GitHub issue. ``` -for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done +make -j4 -C debug +make test -C debug ``` -### GDB Thread List from Running Process - -Instead of a full backtrace, you sometimes just need a list of running threads. +Run a specific boost test: ``` -for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done +debug/Bin/Debug/boosttest-test-base --run_test=remote_url ``` -### GDB Backtrace Stepping - -Identifying the problem may require stepping into the backtrace, analysing -the current scope, attributes, and possible unmet requirements. `p` prints -the value of the selected variable or function call result. - - (gdb) up - (gdb) down - (gdb) p checkable - (gdb) p checkable.px->m_Name - - -### GDB Breakpoints - -To set a breakpoint to a specific function call, or file specific line. - - (gdb) b checkable.cpp:125 - (gdb) b icinga::Checkable::SetEnablePerfdata - -GDB will ask about loading the required symbols later, select `yes` instead -of `no`. - -Then run Icinga 2 until it reaches the first breakpoint. Continue with `c` -afterwards. - - (gdb) run - (gdb) c - -If you want to delete all breakpoints, use `d` and select `yes`. - - (gdb) d - -> **Tip** -> -> When debugging exceptions, set your breakpoint like this: `b __cxa_throw`. - -Breakpoint Example: - - (gdb) b __cxa_throw - (gdb) r - (gdb) up - .... - (gdb) up - #11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function const&, int) (path=..., pattern=..., callback=..., type=1) - at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609 - 609 callback(cpath); - (gdb) l - 604 - 605 #endif /* _WIN32 */ - 606 - 607 std::sort(files.begin(), files.end()); - 608 BOOST_FOREACH(const String& cpath, files) { - 609 callback(cpath); - 610 } - 611 - 612 std::sort(dirs.begin(), dirs.end()); - 613 BOOST_FOREACH(const String& cpath, dirs) { - (gdb) p files - $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615, - m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}} - - -## Core Dump - -When the Icinga 2 daemon crashes with a `SIGSEGV` signal -a core dump file should be written. This will help -developers to analyze and fix the problem. - -### Core Dump File Size Limit - -This requires setting the core dump file size to `unlimited`. - -Example for Systemd: - - vim /usr/lib/systemd/system/icinga2.service - - [Service] - ... - LimitCORE=infinity - - systemctl daemon-reload - - systemctl restart icinga2 - -Example for init script: - - vim /etc/init.d/icinga2 - ... - ulimit -c unlimited - - service icinga2 restart - -Verify that the Icinga 2 process core file size limit is set to `unlimited`. - - cat /proc/`pidof icinga2`/limits - ... - Max core file size unlimited unlimited bytes - - -### Core Dump Kernel Format - -The Icinga 2 daemon runs with the SUID bit set. Therefore you need -to explicitly enable core dumps for SUID on Linux. - - sysctl -w fs.suid_dumpable=1 - -Adjust the coredump kernel format and file location on Linux: - - sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p - - install -m 1777 -d /var/lib/cores - -MacOS: - - sysctl -w kern.corefile=/cores/core.%P - - chmod 777 /cores - -### Core Dump Analysis - -Once Icinga 2 crashes again a new coredump file will be written. Please -attach this file to your bug report in addition to the general details. - -Simple test case for a `SIGSEGV` simulation with `sleep`: - - ulimit -c unlimited - sleep 1800& - [1] - kill -SEGV - gdb `which sleep` /var/lib/cores/core.sleep. - (gdb) bt - rm /var/lib/cores/core.sleep.* - -Analyzing Icinga 2: - - gdb /usr/lib64/icinga2/sbin/icinga2 core.icinga2. - (gdb) bt - From 0fa9947561a759cef8a4dfeb2f0a6f41225e6347 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:49:42 +0100 Subject: [PATCH 0454/1162] Docs: Delete extra docs for windows builds This should be visible in icinga.com/docs, no extra docs needed. (cherry picked from commit c6fc144102eada72ff8146f4be00fd48ceb0d423) --- BUILD_WINDOWS.md | 103 ----------------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 BUILD_WINDOWS.md diff --git a/BUILD_WINDOWS.md b/BUILD_WINDOWS.md deleted file mode 100644 index 28e75259e..000000000 --- a/BUILD_WINDOWS.md +++ /dev/null @@ -1,103 +0,0 @@ -# Build Icinga 2 on Windows - -The Icinga Project is providing Windows MSI packages under https://packages.icinga.com/windows/ - -> **Note:** -> This is a developer documentation on how to build Icinga 2 on Windows! - -Also see [INSTALL.md](INSTALL.md) for Linux build instructions. - -## Requirements - -* 32 or 64-bit system -* Visual Studio >= 14 2015 -* CMake >= 2.6 -* OpenSSL >= 1.0.1 -* Flex and Bison - -## Install Requirements - -**Visual Studio** - -Download from [visualstudio.com](https://www.visualstudio.com/en/downloads/) - -The Community Edition is available for free, and is what we use to build. - -Workloads to install: -* C++ Desktop -* .NET Desktop - -**OpenSSL for Icinga** - -See our [openssl-windows GitHub project](https://github.com/Icinga/openssl-windows). - -You will need to install a binary dist version to 'C:\\Program Files\\OpenSSL'. - -There is a Powershell script to help you downloading: `.\tools\win32\download-openssl.ps1` - -**Chocolatey** - -A simple package manager for Windows, please see [install instructions](https://chocolatey.org/install). - -**Git** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/git). - -``` -choco install git -``` - -**Flex / Bison** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/winflexbison3). - -``` -choco install winflexbison3 -``` - -**CMake** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/cmake) -or download from: [cmake.org](https://cmake.org/download/) - -``` -choco install cmake -``` - -**WIX** - -Best to use Chocolatey, see [package details](https://chocolatey.org/packages/wixtoolset). - -``` -choco install wixtoolset -``` - -**Boost** - -Download third party Windows binaries from: [boost.org](http://www.boost.org/users/download/) - -For example: `https://dl.bintray.com/boostorg/release/1.65.1/binaries/boost_1_65_1-msvc-14.1-64.exe` - -*Warnings:* -* Must match your Visual Studio version! -* CMake might not support the latest Boost version (we used CMake 3.10 and Boost 1_65_1) - -Run the installer exe. - -## Build Icinga 2 - -Run with VC Native x64 Command Prompt: - -``` -powershell .\tools\win32\configure.ps1 -powershell .\tools\win32\build.ps1 -powershell .\tools\win32\test.ps1 -``` - -See these scripts for details. - -## AppVeyor - -We are building [Icinga 2 with AppVeyor](https://ci.appveyor.com/project/icinga/icinga2) for testing and CI integration. - -Please check `appveyor.yml` for our instructions. From 8f3c97dfef2b4ddd9e69a022dc685017474d3a6c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 09:50:39 +0100 Subject: [PATCH 0455/1162] Docs: Simplify INSTALL.md and point to icinga.com/docs (cherry picked from commit 3827e15c4abf49b4ecdbd23d36e76cb4fdab67a0) --- INSTALL.md | 396 +---------------------------------------------------- 1 file changed, 2 insertions(+), 394 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index e0573e0ec..d6121e999 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,398 +16,6 @@ not use the official packages it is advisable to build your own Debian or RPM packages. You can use the source packages from [packages.icinga.com](https://packages.icinga.com) for this purpose. -> **Disclaimer** -> -> This information is intended for developers and packagers. It might be incomplete or unclear -> in some cases. Ensure to check our [packaging scripts on GitHub](https://github.com/Icinga/icinga-packaging) too! +For a more detailed introduction into developing Icinga and building +packages, please visit the [online documentation](https://icinga.com/docs/icinga2/latest/doc/21-development/). -# Build Requirements - -The following requirements need to be fulfilled in order to build the -application using a dist tarball (including notes for distributions): - -* cmake >= 2.6 -* GNU make (make) or ninja-build -* C++ compiler which supports C++11 - - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below) - - Debian/Ubuntu: build-essential - - Alpine: build-base - - you can also use clang++ -* pkg-config -* OpenSSL library and header files >= 1.0.1 - - RHEL/Fedora: openssl-devel - - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel) - - Debian/Ubuntu: libssl-dev - - Alpine: libressl-dev -* Boost library and header files >= 1.48.0 - - RHEL/Fedora: boost148-devel - - Debian/Ubuntu: libboost-all-dev - - Alpine: boost-dev -* GNU bison (bison) -* GNU flex (flex) >= 2.5.35 -* Systemd headers - - Only required when using Systemd - - Debian/Ubuntu: libsystemd-dev - - RHEL/Fedora: systemd-devel - -## Optional features - -* MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) - - RHEL/Fedora: mysql-devel - - SUSE: libmysqlclient-devel - - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev - - Alpine: mariadb-dev -* PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`) - - RHEL/Fedora: postgresql-devel - - Debian/Ubuntu: libpq-dev - - postgresql-dev on Alpine -* YAJL (Faster JSON library) - - RHEL/Fedora: yajl-devel - - Debian: libyajl-dev - - Alpine: yajl-dev -* libedit (CLI console) - - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms) - - Debian/Ubuntu/Alpine: libedit-dev -* Termcap (only required if libedit doesn't already link against termcap/ncurses) - - RHEL/Fedora: libtermcap-devel - - Debian/Ubuntu: (not necessary) - -## Special requirements - -**FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) - -**RHEL6**: Requires a newer boost version which is available on packages.icinga.com -with a version suffixed name. - -## Runtime user environment - -By default Icinga will run as user `icinga` and group `icinga`. Additionally the -external command pipe and livestatus features require a dedicated command group -`icingacmd`. You can choose your own user/group names and pass them to CMake -using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables. - -``` -# groupadd icinga -# groupadd icingacmd -# useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga -``` - -On Alpine (which uses ash busybox) you can run: - -``` -# addgroup -S icinga -# addgroup -S icingacmd -# adduser -S -D -H -h /var/spool/icinga2 -s /sbin/nologin -G icinga -g icinga icinga -# adduser icinga icingacmd -``` - -Add the web server user to the icingacmd group in order to grant it write -permissions to the external command pipe and livestatus socket: -``` -# usermod -a -G icingacmd www-data -``` - -Make sure to replace "www-data" with the name of the user your web server -is running as. - -# Building Icinga 2 - -Once you have installed all the necessary build requirements you can build -Icinga 2 using the following commands: - -``` -$ mkdir release && cd release -$ cmake .. -$ cd .. -$ make -C release -$ make install -C release -``` - -You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`: - -``` -$ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 -``` - -## CMake Variables - -In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. - -For all variables regarding defaults paths on in CMake, see -[GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html). - -Also see `CMakeLists.txt` for details. - -**System Environment** -- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc` -- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var` -- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2` -- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2` -- `ICINGA2_DATADIR`: Data directory for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2` -- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2` -- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2` -- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2` -- `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON` -- `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga` -- `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga` -- `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd` -- `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from; - defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2` -- `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins` - -**Build Optimization** -- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware. -- `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF` - -**Init System** -- `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF` -- `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file - and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set. - Only use this for special packaging purposes and if you know what you are doing. - Defaults to `OFF`. - -**Features:** -- `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON` -- `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON` -- `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF` -- `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF` -- `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON` -- `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON` -- `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON` -- `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON` - -**MySQL or MariaDB:** - -The following settings can be tuned for the MySQL / MariaDB IDO feature. - -- `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON` -- `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient` -- `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty - - checking multiple paths like `/usr/include/mysql` - -See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation. - -**PostgreSQL:** - -The following settings can be tuned for the PostgreSQL IDO feature. - -- `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON` -- `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories -- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file) - -See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation. - -**Version detection:** - -CMake determines the Icinga 2 version number using `git describe` if the -source directory is contained in a Git repository. Otherwise the version number -is extracted from the [VERSION](VERSION) file. This behavior can be -overridden by creating a file called `icinga-version.h.force` in the source -directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake -can be used to disable the usage of `git describe`. - -# Building packages - -> **WARNING:** Some of this information is outdated! - -## Building RPMs - -### Build Environment on RHEL, CentOS, Fedora, Amazon Linux - -Setup your build environment: -``` -yum -y install rpmdevtools -``` - -### Build Environment on SuSE/SLES - -SLES: -``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP2/devel:tools.repo -zypper refresh -zypper install rpmdevtools spectool -``` - -OpenSuSE: -``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_42.3/devel:tools.repo -zypper refresh -zypper install rpmdevtools spectool -``` - -### Package Builds - -Prepare the rpmbuild directory tree: -``` -cd $HOME -rpmdev-setuptree -``` - -Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: -``` -curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec -``` - -> **Note** -> -> The above command builds snapshot packages. Change to the `release` branch -> for release package builds. - -Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary -provided with `rpmdevtools`: -``` -cd $HOME/rpmbuild/SOURCES -spectool -g ../SPECS/icinga2.spec - -cd $HOME/rpmbuild -``` - -Install the build dependencies. Example for CentOS 7: -``` -yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ -cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ -selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc -``` - -Note: If you are using Amazon Linux, systemd is not required. - -A shorter way is available using the `yum-builddep` command on RHEL based systems: -``` -yum-builddep SPECS/icinga2.spec -``` - -Build the RPM: -``` -rpmbuild -ba SPECS/icinga2.spec -``` - -### Additional Hints - -#### SELinux policy module - -The following packages are required to build the SELinux policy module: - -* checkpolicy -* selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7) -* selinux-policy-doc - -#### RHEL/CentOS 6 - -The RedHat Developer Toolset is required for building Icinga 2 beforehand. -This contains a modern version of flex and a C++ compiler which supports -C++11 features. -``` -cat >/etc/yum.repos.d/devtools-2.repo <$HOME/.rpmmacros < **WARNING:** This information is outdated! - -Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from -the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) -into your source tree and run the following command: -``` -$ dpkg-buildpackage -uc -us -``` - -## Build Alpine Linux packages - -A simple way to setup a build environment is installing Alpine in a chroot. -In this way, you can set up an Alpine build environment in a chroot under a -different Linux distro. -There is a script that simplifies these steps with just two commands, and -can be found [here](https://github.com/alpinelinux/alpine-chroot-install). - -Once the build environment is installed, you can setup the system to build -the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). - -# Build Post Install Tasks - -After building Icinga 2 yourself, your package build system should at least run the following post -install requirements: - -* enable the `checker`, `notification` and `mainlog` feature by default -* run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node - -## Run Icinga 2 - -Icinga 2 comes with a binary that takes care of loading all the relevant -components (e.g. for check execution, notifications, etc.): -``` -# icinga2 daemon -[2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) -[2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). -[2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). -... -``` - -### Init Script - -Icinga 2 can be started as a daemon using the provided init script: -``` -# /etc/init.d/icinga2 -Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} -``` - -### Systemd - -If your distribution uses Systemd: -``` -# systemctl {start|stop|reload|status|enable|disable} icinga2 -``` - -In case the distribution is running Systemd >227, you'll also -need to package and install the `etc/initsystem/icinga2.service.limits.conf` -file into `/etc/systemd/system/icinga2.service.d`. - -### openrc - -Or if your distribution uses openrc (like Alpine): -``` -# rc-service icinga2 -Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} - ``` - -Note: the openrc's init.d is not shipped by default. -A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. -Those few steps can be followed: -``` -# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd -# mv icinga2.initd /etc/init.d/icinga2 -# chmod +x /etc/init.d/icinga2 -``` - -Icinga 2 reads a single configuration file which is used to specify all -configuration settings (global settings, hosts, services, etc.). The -configuration format is explained in detail in the [doc/](doc/) directory. - -By default `make install` installs example configuration files in -`/usr/local/etc/icinga2` unless you have specified a different prefix or -sysconfdir. From 5dbc9dc0e83ae693dd9d45019fba2a02efc380d2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:11:16 +0100 Subject: [PATCH 0456/1162] Docs: More updates on dev environments, add mini TOC (cherry picked from commit ec39a74453f673032cd52edb29eb747d80cb5fe9) --- doc/21-development.md | 297 +++++++++++++++++++++++++++++++++++------- 1 file changed, 250 insertions(+), 47 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1ff183434..ff672fe1e 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1,7 +1,17 @@ # Development -This chapter provides hints on Icinga 2 development -and debugging. +This chapter provides hints on Icinga 2 debugging, +development, package builds and tests. + +* [Debug Icinga 2](#development-debug) +* [Develop Icinga 2](#development-develop) + * [Linux Dev Environment](#development-linux-dev-env) + * [macOS Dev Environment](#development-macos-dev-env) + * [Windows Dev Environment](#development-windows-dev-env) +* [Package Builds](#development-package-builds) +* [Advanced Tips](#development-advanced) +* [Tests](#development-tests) + ## Debug Icinga 2 @@ -348,6 +358,13 @@ In order to run Icinga 2 with LLDB you need to pass the binary as argument. lldb -- /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` +Breakpoint: + +``` +> b checkable.cpp:57 +> b icinga::Checkable::ProcessCheckResult +``` + Full backtrace: ``` @@ -494,6 +511,8 @@ db\_ido\_pgsql | IDO database driver for PgSQL. mysql\_shin | Library stub for linking against the MySQL client libraries. pgsql\_shim | Library stub for linking against the PgSQL client libraries. +#### Class Compiler + Another thing you will recognize are the `.ti` files which are compiled by our own class compiler into actual source code. The meta language allows developers to easily add object attributes and specify their behaviour. @@ -570,7 +589,7 @@ stuff like `epoll` is not available on Unix kernels. Depending on your workstation and environment, you may either develop and run locally, use a container deployment pipeline or put everything in a high end resource remote VM. -#### Prepare Linux Dev Environment +Fork https://github.com/Icinga/icinga2 into your own repository, e.g. `https://github.com/dnsmichi/icinga2`. Create two build directories for different binary builds. @@ -581,25 +600,55 @@ Create two build directories for different binary builds. mkdir -p release debug ``` -Next, check the required packages to build Icinga 2, and install them. +Proceed with the specific distribution examples below. -CentOS: +* [CentOS 7](#development-linux-dev-env-centos) +* [Debian 9](#development-linux-dev-env-debian) + +#### CentOS 7 + +``` +yum -y install gdb git bash-completion htop rpmdevtools \ + ccache cmake make gcc-c++ flex bison \ + openssl-devel boost-devel systemd-devel mysql-devel \ + postgresql-devel libedit-devel libstdc++-devel + +groupadd icinga +groupadd icingacmd +useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga + +ln -s /bin/ccache /usr/local/bin/gcc +ln -s /bin/ccache /usr/local/bin/g++ + +git clone https://github.com/icinga/icinga2.git && cd icinga2 + +mkdir debug release +cd debug +cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin +cd .. +make -j2 install -C debug +``` + + +``` +chown -R icinga:icinga /usr/local/icinga2/var/ + +/usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2 +/usr/local/icinga2/sbin/icinga2 api setup +vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf + +gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` ``` -Debian/Ubuntu: - -``` - -``` - -##### Debian Stretch +##### Debian 9 ``` apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libyajl-dev libedit-dev monitoring-plugins +ln -s /usr/bin/ccache /usr/local/bin/gcc ln -s /usr/bin/ccache /usr/local/bin/g++ groupadd icinga @@ -619,31 +668,154 @@ make -j2 install -C debug ``` chown -R icinga:icinga /usr/local/icinga2/var/ -cd /usr/local/icinga2 -./lib/icinga2/prepare-dirs etc/sysconfig/icinga2 -icinga2 api setup -vim etc/icinga2/conf.d/api-users.conf +/usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2 +/usr/local/icinga2/sbin/icinga2 api setup +vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf -gdb --args ./lib/icinga2/sbin/icinga2 daemon +gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` ### macOS Dev Environment -It is advised to use Homebrew to install all required build dependencies. +It is advised to use Homebrew to install required build dependencies. Macports have been reported to work as well, typically you'll get more help -with Homebrew. +with Homebrew from Icinga developers. -We will also build two different flavors. +#### Users and Groups + +First off, create the following from `Settings - Users & Groups`: + +* Users: `icinga` +* Groups: `icinga` with `icinga` as member +* Groups: `icingaweb2` + +Then disallow login for these users. + +``` +dscl +list Local/Default/Users +read Local/Default/Users/icinga +change Local/Default/Users/icinga UserShell /bin/bash /usr/bin/false +sudo dscl . create /Users/icinga IsHidden 1 +sudo dseditgroup -o edit -a _www -t user icingaweb2 +``` + +#### Requirements + +OpenSSL 1.0.x doesn't build anymore, so we're explicitly using 1.1.x here. + +``` +brew install ccache boost cmake bison flex yajl openssl@1.1 mysql-connector-c++ postgresql libpq +``` + +##### ccache + +``` +sudo mkdir /opt/ccache + +sudo ln -s `which ccache` /opt/ccache/clang +sudo ln -s `which ccache` /opt/ccache/clang++ + +vim $HOME/.bashrc + +# ccache is managed with symlinks to avoid collision with cgo +export PATH="/opt/ccache:$PATH" + +source $HOME/.bashrc +``` + +#### Builds + +We will build two different flavors on macOS. ``` mkdir -p release debug + +cd debug +cmake -DICINGA2_UNITY_BUILD=OFF -DICINGA2_WITH_STUDIO=ON -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib .. +cd .. + +make -j4 -C debug +sudo make -j4 install -C debug +``` + +##### Build Aliases + +This is derived from dnsmichi's flavour and not generally best practice. + +``` +vim $HOME/.bashrc + +export PATH=/usr/local/icinga2/sbin/:$PATH +source /usr/local/icinga2/etc/bash_completion.d/icinga2 + +export I2_GENERIC="-DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib -DICINGA2_PLUGINDIR=/usr/local/sbin" + +export I2_DEBUG="-DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF $I2_GENERIC" +export I2_RELEASE="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DICINGA2_WITH_TESTS=ON -DICINGA2_UNITY_BUILD=ON $I2_GENERIC" + +alias i2_debug="mkdir -p debug; cd debug; cmake $I2_DEBUG ..; make -j4; sudo make -j4 install; cd .." +alias i2_release="mkdir -p release; cd release; cmake $I2_RELEASE ..; make -j4; sudo make -j4 install; cd .." + +source $HOME/.bashrc +``` + +#### Run + +``` +chown -R icinga:icinga /usr/local/icinga2 +chown -R icinga:_www /usr/local/icinga2/var/run/icinga2/cmd + +icinga2 daemon +``` + +#### Plugins + +``` +brew install nagios-plugins + +sudo vim /usr/local/icinga2/etc/icinga2/constants.conf +const PluginDir = "/usr/local/sbin" +``` + +#### Databases: MariaDB + +``` +brew install mariadb +ln -sfv /usr/local/opt/mariadb/*.plist ~/Library/LaunchAgents +launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist +mysql_secure_installation +``` + +``` +vim $HOME/.my.cnf + +[client] +user = root +password = supersecurerootpassword + +sudo -i +ln -s /Users/michi/.my.cnf $HOME/.my.cnf +exit +``` + +``` +cd $HOME/coding/icinga/icinga2 + +sudo mysql + +CREATE DATABASE icinga; +GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga'; +quit +sudo mysql icinga < lib/db_ido_mysql/schema/mysql.sql ``` -### Windows Dev Environment + +### Windows Dev Environment The following sections explain how to setup the required build tools and how to run and debug the code. @@ -791,7 +963,7 @@ Run CMake with the following command. This generates a new Visual Studio project You need to specify the previously installed component paths: Variable | Value | Description -----------------------|----------------------------------------------------------------------| +----------------------|----------------------------------------------------------------------|------------------------------------------------------- BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. @@ -875,7 +1047,9 @@ Again, put these lines into a batch/Powershell script and execute that. > > This isn't officially supported yet, just a few hints how you can do it yourself. -armhf on Raspberry Pi, ccache: +The following examples source from armhf on Raspberry Pi. + +#### ccache ``` apt install -y ccache @@ -887,6 +1061,20 @@ echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc source ~/.bashrc && echo $PATH ``` +#### Build + +Copy the icinga2 source code into `$HOME/icinga2`. Clone the `deb-icinga2` repository into `debian/`. + +``` +git clone https://github.com/Icinga/icinga2 $HOME/icinga2 +git clone https://github.com/Icinga/deb-icinga2 $HOME/icinga2/debian +``` + +Then build a Debian package and install it like normal. +``` +dpkg-buildpackage -uc -us +``` + ## Package Builds This documentation is explicitly meant for packagers and the Icinga @@ -919,7 +1107,7 @@ Icinga application using a dist tarball (including notes for distributions): - Debian/Ubuntu: libsystemd-dev - RHEL/Fedora: systemd-devel -### Optional features +### Optional features * MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`) - RHEL/Fedora: mysql-devel @@ -941,14 +1129,14 @@ Icinga application using a dist tarball (including notes for distributions): - RHEL/Fedora: libtermcap-devel - Debian/Ubuntu: (not necessary) -### Special requirements +### Special requirements **FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) **RHEL6**: Requires a newer boost version which is available on packages.icinga.com with a version suffixed name. -### Runtime user environment +### Runtime user environment By default Icinga will run as user `icinga` and group `icinga`. Additionally the external command pipe and livestatus features require a dedicated command group @@ -972,6 +1160,7 @@ On Alpine (which uses ash busybox) you can run: Add the web server user to the icingacmd group in order to grant it write permissions to the external command pipe and livestatus socket: + ``` # usermod -a -G icingacmd www-data ``` @@ -979,7 +1168,7 @@ permissions to the external command pipe and livestatus socket: Make sure to replace "www-data" with the name of the user your web server is running as. -### Building Icinga 2: Example +### Building Icinga 2: Example Once you have installed all the necessary build requirements you can build Icinga 2 using the following commands: @@ -998,7 +1187,7 @@ You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX $ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2 ``` -### CMake Variables +### CMake Variables In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables. @@ -1076,11 +1265,12 @@ directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake can be used to disable the usage of `git describe`. -### Building RPMs +### Building RPMs #### Build Environment on RHEL, CentOS, Fedora, Amazon Linux Setup your build environment: + ``` yum -y install rpmdevtools ``` @@ -1088,28 +1278,32 @@ yum -y install rpmdevtools #### Build Environment on SuSE/SLES SLES: + ``` -zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP3/devel:tools.repo +zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP4/devel:tools.repo zypper refresh zypper install rpmdevtools spectool ``` OpenSuSE: + ``` zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_15.0/devel:tools.repo zypper refresh zypper install rpmdevtools spectool ``` -#### Package Builds +#### Package Builds Prepare the rpmbuild directory tree: + ``` cd $HOME rpmdev-setuptree ``` -Copy the icinga2.spec file to `rpmbuild/SPEC` or fetch the latest version: +Snapshot builds: + ``` curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec ``` @@ -1121,6 +1315,7 @@ curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary provided with `rpmdevtools`: + ``` cd $HOME/rpmbuild/SOURCES spectool -g ../SPECS/icinga2.spec @@ -1129,6 +1324,7 @@ cd $HOME/rpmbuild ``` Install the build dependencies. Example for CentOS 7: + ``` yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \ cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \ @@ -1138,16 +1334,18 @@ selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc Note: If you are using Amazon Linux, systemd is not required. A shorter way is available using the `yum-builddep` command on RHEL based systems: + ``` yum-builddep SPECS/icinga2.spec ``` Build the RPM: + ``` rpmbuild -ba SPECS/icinga2.spec ``` -#### Additional Hints +#### Additional Hints ##### SELinux policy module @@ -1182,28 +1380,27 @@ cat >$HOME/.rpmmacros < **WARNING:** This information is outdated! +### Build Debian/Ubuntu packages Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) into your source tree and run the following command: + ``` $ dpkg-buildpackage -uc -us ``` -## Build Alpine Linux packages +### Build Alpine Linux packages A simple way to setup a build environment is installing Alpine in a chroot. In this way, you can set up an Alpine build environment in a chroot under a @@ -1214,7 +1411,7 @@ can be found [here](https://github.com/alpinelinux/alpine-chroot-install). Once the build environment is installed, you can setup the system to build the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package). -# Build Post Install Tasks +### Build Post Install Tasks After building Icinga 2 yourself, your package build system should at least run the following post install requirements: @@ -1222,29 +1419,33 @@ install requirements: * enable the `checker`, `notification` and `mainlog` feature by default * run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node -## Run Icinga 2 +### Run Icinga 2 Icinga 2 comes with a binary that takes care of loading all the relevant components (e.g. for check execution, notifications, etc.): + ``` -# icinga2 daemon +icinga2 daemon + [2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug) [2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s). [2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s). ... ``` -### Init Script +#### Init Script Icinga 2 can be started as a daemon using the provided init script: + ``` # /etc/init.d/icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} ``` -### Systemd +### Systemd If your distribution uses Systemd: + ``` # systemctl {start|stop|reload|status|enable|disable} icinga2 ``` @@ -1253,9 +1454,10 @@ In case the distribution is running Systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. -### openrc +### openrc Or if your distribution uses openrc (like Alpine): + ``` # rc-service icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} @@ -1264,6 +1466,7 @@ Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} Note: the openrc's init.d is not shipped by default. A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. Those few steps can be followed: + ``` # wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd # mv icinga2.initd /etc/init.d/icinga2 @@ -1279,11 +1482,11 @@ By default `make install` installs example configuration files in sysconfdir. -### Windows +### Windows Builds The Windows MSI packages are located at https://packages.icinga.com/windows/ -#### Requirements +#### Requirements * 32 or 64-bit system * Visual Studio >= 14 2015 From 7abed414eab607fc16a77bbe0585e7a14643bbd1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:15:04 +0100 Subject: [PATCH 0457/1162] Docs: Update anchors (cherry picked from commit ac9ed41537b36d7a41e26e8535e208579cccbfc2) --- doc/21-development.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index ff672fe1e..6bd13e939 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -3,14 +3,14 @@ This chapter provides hints on Icinga 2 debugging, development, package builds and tests. -* [Debug Icinga 2](#development-debug) -* [Develop Icinga 2](#development-develop) - * [Linux Dev Environment](#development-linux-dev-env) - * [macOS Dev Environment](#development-macos-dev-env) - * [Windows Dev Environment](#development-windows-dev-env) -* [Package Builds](#development-package-builds) -* [Advanced Tips](#development-advanced) -* [Tests](#development-tests) +* [Debug Icinga 2](21-development.md#development-debug) +* [Develop Icinga 2](21-development.md#development-develop) + * [Linux Dev Environment](21-development.md#development-linux-dev-env) + * [macOS Dev Environment](21-development.md#development-macos-dev-env) + * [Windows Dev Environment](21-development.md#development-windows-dev-env) +* [Package Builds](21-development.md#development-package-builds) +* [Advanced Tips](21-development.md#development-advanced) +* [Tests](21-development.md#development-tests) ## Debug Icinga 2 @@ -460,7 +460,7 @@ autocmd BufWinLeave * call clearmatches() Icinga 2 can run standalone or in distributed environments. It contains a whole lot more than a simple check execution engine. -Read more about it in the [Technical Concepts](#technical-concepts) chapter. +Read more about it in the [Technical Concepts](19-technical-concepts.md#technical-concepts) chapter. ### Get to know the code @@ -511,7 +511,7 @@ db\_ido\_pgsql | IDO database driver for PgSQL. mysql\_shin | Library stub for linking against the MySQL client libraries. pgsql\_shim | Library stub for linking against the PgSQL client libraries. -#### Class Compiler +#### Class Compiler Another thing you will recognize are the `.ti` files which are compiled by our own class compiler into actual source code. The meta language allows @@ -542,7 +542,7 @@ The logic is hidden in `tools/mkclass/` in case you want to learn more about it. The first steps during CMake & make also tell you about code generation. -### Build Tool: CMake +### Builds: CMake In its early development stages in 2012, Icinga 2 was built with autoconf/automake and separate Windows project files. We've found this very fragile, and have changed @@ -556,7 +556,7 @@ The most common benefits: * Separate binary build directories, the actual source tree stays clean. * CMake automatically generates a Visual Studio project file `icinga2.sln` on Windows. -### Builds: Unity Builds +### Builds: Unity Builds Another thing you should be aware of: Unity builds on and off. @@ -602,8 +602,8 @@ mkdir -p release debug Proceed with the specific distribution examples below. -* [CentOS 7](#development-linux-dev-env-centos) -* [Debian 9](#development-linux-dev-env-debian) +* [CentOS 7](21-development.md#development-linux-dev-env-centos) +* [Debian 9](21-development.md#development-linux-dev-env-debian) #### CentOS 7 From 8313a1b2a95c8eaa1996c4edc363b44e2fc31d28 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 3 Dec 2018 11:28:39 +0100 Subject: [PATCH 0458/1162] Docs: Update README.md with a better description and direct URLs to icinga.com/docs (cherry picked from commit e0b3e05c636db082da264c92fc02593f7ff44ded) --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 1935d12d4..b0bcd681e 100644 --- a/README.md +++ b/README.md @@ -8,27 +8,42 @@ #### Table of Contents 1. [About][About] -2. [License][License] -3. [Installation][Installation] -4. [Documentation][Documentation] -5. [Support][Support] +2. [Installation][Installation] +3. [Documentation][Documentation] +4. [Support][Support] +5. [License][License] 6. [Contributing][Contributing] ## About -Icinga 2 is an open source monitoring system which checks the availability of your -network resources, notifies users of outages, and generates performance data for reporting. +[Icinga 2](https://icinga.com/products/icinga-2/) is a monitoring system which checks +the availability of your network resources, notifies users of outages, and generates +performance data for reporting. Scalable and extensible, Icinga 2 can monitor large, complex environments across multiple locations. -Icinga 2 as monitoring core works best with [Icinga Web 2](https://icinga.com/products/icinga-web-2/) -as web interface. +Icinga 2 as core requires [Icinga Web 2](https://icinga.com/products/icinga-web-2/) +on top in your Icinga Stack. -More information can be found at [icinga.com](https://icinga.com/products/icinga-2/) -and inside the [documentation](https://icinga.com/docs/icinga2/latest/). +![Icinga Dashboard](https://icinga.com/wp-content/uploads/2017/12/icingaweb2-2.5.0-dashboard.png) -## Licensing +## Installation + +For installing Icinga please check the [installation chapter](https://icinga.com/docs/icinga2/latest/doc/02-getting-started/) +in the documentation. + +## Documentation + +The documentation is available on [icinga.com/docs](https://icinga.com/docs/icinga2/latest/). + +## Support + +Check the [project website](https://icinga.com) for status updates. Join the +[community channels](https://icinga.com/community/) for questions +or ask an Icinga partner for [professional support](https://icinga.com/support/). + +## License Icinga 2 and the Icinga 2 documentation are licensed under the terms of the GNU General Public License Version 2, you will find a copy of this license in the @@ -48,21 +63,6 @@ so, delete this exception statement from your version. If you delete this exception statement from all source files in the program, then also delete it here. -## Installation - -Read the [INSTALL.md](INSTALL.md) file for more information about how to install it. - -## Documentation - -The documentation is located in the [doc/](doc/) directory. The latest documentation -is also available on https://docs.icinga.com - -## Support - -Check the project website at https://icinga.com for status updates. Join the -[community channels](https://icinga.com/community) for questions -or ask an Icinga partner for [professional support](https://icinga.com/services/support/). - ## Contributing There are many ways to contribute to Icinga -- whether it be sending patches, From 47c44fe641ff761284242e42ae77e0790823e646 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:51:04 +0100 Subject: [PATCH 0459/1162] Fix formatting in dev docs (cherry picked from commit 8cbe286e676a56c536cee517b898cbe2f25b2547) --- doc/21-development.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 6bd13e939..b6ae7eca4 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -407,15 +407,15 @@ Up/down in stacktrace: ## Develop Icinga 2 Icinga 2 can be built on many platforms such as Linux, Unix and Windows. -There are limitations in terms of support, e.g. Windows is only supported for clients, +There are limitations in terms of support, e.g. Windows is only supported for agents, not a full-featured master or satellite. Before you start with actual development, there is a couple of pre-requisites. ### Choose your Editor -Icinga 2 can be developed with your favorite editor. Icinga developers prefer to use -the tools below: +Icinga 2 can be developed with your favorite editor. Icinga developers prefer +these tools: - vim - CLion (macOS, Linux) @@ -641,8 +641,6 @@ vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon ``` -``` - ##### Debian 9 ``` From d9b5fe0ace0b0458b52245a9610d8103f6992b46 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:54:39 +0100 Subject: [PATCH 0460/1162] Purge INSTALL.md and add packager info to README.md Everything is located in the online documentation, where the README.md points to. (cherry picked from commit 9801b8b7a040fd4c91aa05d596ec644ddd294bdc) --- INSTALL.md | 21 --------------------- README.md | 3 +++ 2 files changed, 3 insertions(+), 21 deletions(-) delete mode 100644 INSTALL.md diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index d6121e999..000000000 --- a/INSTALL.md +++ /dev/null @@ -1,21 +0,0 @@ -# Installing Icinga 2 - -The recommended way of installing Icinga 2 is to use [packages](https://packages.icinga.com). -The Icinga project provides both release and development packages for a number -of operating systems. - -Please check the documentation in the [doc/](doc/) directory for a current list -of available packages and detailed installation instructions. - -The online documentation is available on [icinga.com/docs](https://icinga.com/docs/) -and will guide you step by step. - -There are a number of known caveats when installing from source such as -incorrect directory and file permissions. So even if you're planning to -not use the official packages it is advisable to build your own Debian -or RPM packages. You can use the source packages from [packages.icinga.com](https://packages.icinga.com) -for this purpose. - -For a more detailed introduction into developing Icinga and building -packages, please visit the [online documentation](https://icinga.com/docs/icinga2/latest/doc/21-development/). - diff --git a/README.md b/README.md index b0bcd681e..f81f6c940 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ on top in your Icinga Stack. For installing Icinga please check the [installation chapter](https://icinga.com/docs/icinga2/latest/doc/02-getting-started/) in the documentation. +If you are a packager, please read the [development chapter](https://icinga.com/docs/icinga2/latest/doc/21-development/) +for more details. + ## Documentation The documentation is available on [icinga.com/docs](https://icinga.com/docs/icinga2/latest/). From 242a7f5705a2c721cf6b4045ef25d30ac0e79048 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 10:58:44 +0100 Subject: [PATCH 0461/1162] Update TOC (cherry picked from commit 01d2a17683659e17b0cc311135937e0d5748a05d) --- doc/21-development.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index b6ae7eca4..1b43724fe 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -4,11 +4,16 @@ This chapter provides hints on Icinga 2 debugging, development, package builds and tests. * [Debug Icinga 2](21-development.md#development-debug) + * [GDB Backtrace](21-development.md#development-debug-gdb-backtrace) + * [Core Dump](21-development.md#development-debug-core-dump) * [Develop Icinga 2](21-development.md#development-develop) - * [Linux Dev Environment](21-development.md#development-linux-dev-env) - * [macOS Dev Environment](21-development.md#development-macos-dev-env) - * [Windows Dev Environment](21-development.md#development-windows-dev-env) + * [Linux Dev Environment](21-development.md#development-linux-dev-env) + * [macOS Dev Environment](21-development.md#development-macos-dev-env) + * [Windows Dev Environment](21-development.md#development-windows-dev-env) * [Package Builds](21-development.md#development-package-builds) + * [RPM](21-development.md#development-package-builds-rpms) + * [DEB](21-development.md#development-package-builds-deb) + * [Windows](21-development.md#development-package-builds-windows) * [Advanced Tips](21-development.md#development-advanced) * [Tests](21-development.md#development-tests) @@ -20,6 +25,7 @@ a stack trace or coredump if the application crashed. It is also useful for developers working with different debuggers. > **Note:** +> > This is intentionally mentioned before any development insights > as debugging is a more frequent and commonly asked question. @@ -131,6 +137,12 @@ a new gdb run. #### GDB Backtrace If Icinga 2 aborted its operation abnormally, generate a backtrace. + +> **Note** +> +> Please install the [required debug symbols](21-development.md#debug-requirements) +> prior to generating a backtrace. + `thread apply all` is important here since this includes all running threads. We need this information when e.g. debugging dead locks and hanging features. @@ -155,6 +167,11 @@ make sure to attach as much detail as possible. If Icinga 2 is still running, generate a full backtrace from the running process and store it into a new file (e.g. for debugging dead locks). +> **Note** +> +> Please install the [required debug symbols](21-development.md#debug-requirements) +> prior to generating a backtrace. + Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs and add them to the GitHub issue. @@ -1395,7 +1412,7 @@ the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2) into your source tree and run the following command: ``` -$ dpkg-buildpackage -uc -us +dpkg-buildpackage -uc -us ``` ### Build Alpine Linux packages From 07d949a6a0552a7446bebd1d4deb2d50bf5bc2af Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 12:14:01 +0100 Subject: [PATCH 0462/1162] Minor updates for core dumps The main parts are discussed in #6723 (cherry picked from commit 43c171056f826cf08b4155472ad9a6a4d14ba8a9) --- doc/21-development.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1b43724fe..1d08add4e 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -279,10 +279,11 @@ developers to analyze and fix the problem. This requires setting the core dump file size to `unlimited`. -Example for Systemd: + +##### Systemd ``` -vim /usr/lib/systemd/system/icinga2.service +systemctl edit icinga2.service [Service] ... @@ -293,7 +294,7 @@ systemctl daemon-reload systemctl restart icinga2 ``` -Example for init script: +##### Init Script ``` vim /etc/init.d/icinga2 @@ -303,10 +304,13 @@ ulimit -c unlimited service icinga2 restart ``` +##### Verify + Verify that the Icinga 2 process core file size limit is set to `unlimited`. ``` -cat /proc/`pidof icinga2`/limits +for pid in $(pidof icinga2); do cat /proc/$pid/limits; done + ... Max core file size unlimited unlimited bytes ``` @@ -318,7 +322,7 @@ The Icinga 2 daemon runs with the SUID bit set. Therefore you need to explicitly enable core dumps for SUID on Linux. ``` -sysctl -w fs.suid_dumpable=1 +sysctl -w fs.suid_dumpable=2 ``` Adjust the coredump kernel format and file location on Linux: From d68a565c1926bac4c2ac429d15483806fde2e78d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 4 Dec 2018 12:21:54 +0100 Subject: [PATCH 0463/1162] Docs: Formatting for dev requirements (cherry picked from commit 00673cd75911e56cf977fdb5c14c809a97c01e6d) --- doc/21-development.md | 64 ++++++++++++------------------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 1d08add4e..9abf3df4c 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -36,29 +36,12 @@ The Icinga 2 packages provide a debug package which must be installed separately for all involved binaries, like `icinga2-bin` or `icinga2-ido-mysql`. -Debian/Ubuntu: - -``` -apt-get install icinga2-dbg -``` - -RHEL/CentOS: - -``` -yum install icinga2-debuginfo -``` - -Fedora: - -``` -dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo -``` - -SLES/openSUSE: - -``` -zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo -``` +Distribution | Command +-------------------|------------------------------------------ +Debian/Ubuntu | `apt-get install icinga2-dbg` +RHEL/CentOS | `yum install icinga2-debuginfo` +Fedora | `dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo` +SLES/openSUSE | `zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo` Furthermore, you may also have to install debug symbols for Boost and your C++ library. @@ -70,23 +53,12 @@ build flag for debug builds. Install GDB in your development environment. -Debian/Ubuntu: - -``` -apt-get install gdb -``` - -RHEL/CentOS/Fedora: - -``` -yum install gdb -``` - -SLES/openSUSE: - -``` -zypper install gdb -``` +Distribution | Command +-------------------|------------------------------------------ +Debian/Ubuntu | `apt-get install gdb` +RHEL/CentOS | `yum install gdb` +Fedora | `dnf install gdb` +SLES/openSUSE | `zypper install gdb` #### GDB Run @@ -983,12 +955,12 @@ You need to specify the previously installed component paths: Variable | Value | Description ----------------------|----------------------------------------------------------------------|------------------------------------------------------- -BOOST_ROOT | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. -BISON_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. -FLEX_EXECUTABLE | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. -ICINGA2_WITH_MYSQL | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. -ICINGA2_WITH_PGSQL | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. -ICINGA2_UNITY_BUILD | OFF | Disable unity builds for development environments. +`BOOST_ROOT` | `C:\boost_1_65_1` | Root path where you've extracted and compiled Boost. +`BISON_EXECUTABLE` | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe` | Path to the Bison executable. +`FLEX_EXECUTABLE` | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe` | Path to the Flex executable. +`ICINGA2_WITH_MYSQL` | OFF | Requires extra setup for MySQL if set to `ON`. Not supported for client setups. +`ICINGA2_WITH_PGSQL` | OFF | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups. +`ICINGA2_UNITY_BUILD` | OFF | Disable unity builds for development environments. Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables. From 26db9728590b89b7227772a95c2eb5ced5c75072 Mon Sep 17 00:00:00 2001 From: Max Rosin Date: Wed, 5 Dec 2018 16:28:03 +0100 Subject: [PATCH 0464/1162] Document that retry_interval is only used after an active check result fixes #6795 (cherry picked from commit 00757919b322bc930360694c30485977cfb5506a) --- doc/09-object-types.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/09-object-types.md b/doc/09-object-types.md index bd6572c15..b785d1f60 100644 --- a/doc/09-object-types.md +++ b/doc/09-object-types.md @@ -719,7 +719,7 @@ Configuration Attributes: check\_period | Object name | **Optional.** The name of a time period which determines when this host should be checked. Not set by default. check\_timeout | Duration | **Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval | Duration | **Optional.** The check interval (in seconds). This interval is used for checks when the host is in a `HARD` state. Defaults to `5m`. - retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the host is in a `SOFT` state. Defaults to `1m`. + retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the host is in a `SOFT` state. Defaults to `1m`. Note: This does not affect the scheduling [after a passive check result](08-advanced-topics.md#check-result-freshness). enable\_notifications | Boolean | **Optional.** Whether notifications are enabled. Defaults to true. enable\_active\_checks | Boolean | **Optional.** Whether active checks are enabled. Defaults to true. enable\_passive\_checks | Boolean | **Optional.** Whether passive checks are enabled. Defaults to true. @@ -1447,7 +1447,7 @@ Configuration Attributes: check\_period | Object name | **Optional.** The name of a time period which determines when this service should be checked. Not set by default. check\_timeout | Duration | **Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval | Duration | **Optional.** The check interval (in seconds). This interval is used for checks when the service is in a `HARD` state. Defaults to `5m`. - retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the service is in a `SOFT` state. Defaults to `1m`. + retry\_interval | Duration | **Optional.** The retry interval (in seconds). This interval is used for checks when the service is in a `SOFT` state. Defaults to `1m`. Note: This does not affect the scheduling [after a passive check result](08-advanced-topics.md#check-result-freshness). enable\_notifications | Boolean | **Optional.** Whether notifications are enabled. Defaults to `true`. enable\_active\_checks | Boolean | **Optional.** Whether active checks are enabled. Defaults to `true`. enable\_passive\_checks | Boolean | **Optional.** Whether passive checks are enabled. Defaults to `true`. From 9040c9b5127dea2a435fd22b78a1653754d862d5 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 9 Jan 2019 11:27:33 +0100 Subject: [PATCH 0465/1162] Allow Checkable#retry_interval to be 0 refs #6871 (cherry picked from commit 9ae738d17fa6220d988001e4c56155aa6535992c) --- lib/icinga/checkable-check.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index e70648d89..b159247a9 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -79,7 +79,8 @@ void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) if (interval > 1) adj = fmod(now * 100 + GetSchedulingOffset(), interval * 100) / 100.0; - adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); + if (adj != 0.0) + adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); double nextCheck = now - adj + interval; From a557f47e2a98c769b309ba1dae3b71c799952026 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 16 Jan 2019 17:27:38 +0100 Subject: [PATCH 0466/1162] Log: Ensure not to pass negative values to localtime() refs #6887 (cherry picked from commit 2fc33996b620d97e54d75b0d8c101fb3d9ba791c) --- lib/icinga/checkable-check.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index b159247a9..0b8917b77 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -83,10 +83,11 @@ void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) adj = std::min(0.5 + fmod(GetSchedulingOffset(), interval * 5) / 100.0, adj); double nextCheck = now - adj + interval; + double lastCheck = GetLastCheck(); Log(LogDebug, "Checkable") << "Update checkable '" << GetName() << "' with check interval '" << GetCheckInterval() - << "' from last check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", GetLastCheck()) + << "' from last check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", (lastCheck < 0 ? 0 : lastCheck)) << " (" << GetLastCheck() << ") to next check time at " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", nextCheck) << "(" << nextCheck << ")."; SetNextCheck(nextCheck, false, origin); From ee915ed5d2ad0ff99775615c497e0c835273c198 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 15 Jan 2019 19:23:20 +0100 Subject: [PATCH 0467/1162] Validate Zone::GetLocalZone() before using (cherry picked from commit b09e7b287e6b4bbc277c9ef7828e34f884927f82) --- lib/icinga/downtime.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index d9b24a3d3..9f0adf708 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -252,7 +252,11 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth attrs->Set("entry_time", Utility::GetTime()); if (!scheduledDowntime.IsEmpty()) { - attrs->Set("authoritative_zone", Zone::GetLocalZone()->GetName()); + auto localZone (Zone::GetLocalZone()); + + if (localZone) { + attrs->Set("authoritative_zone", localZone->GetName()); + } } Host::Ptr host; From fb72633c5eb081e3356046b922ce4f35246614dd Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 28 Jan 2019 18:29:57 +0100 Subject: [PATCH 0468/1162] Downtime::AddDowntime(): place Downtimes in the same zone as the origin ScheduledDowntimes (cherry picked from commit ce847324bc8abe4f36071633b999fa88ba2213f3) --- lib/icinga/downtime.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 9f0adf708..0f0a74ceb 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -267,7 +267,23 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth if (service) attrs->Set("service_name", service->GetShortName()); - String zone = checkable->GetZoneName(); + String zone; + + if (!scheduledDowntime.IsEmpty()) { + auto sdt (ScheduledDowntime::GetByName(scheduledDowntime)); + + if (sdt) { + auto sdtZone (sdt->GetZone()); + + if (sdtZone) { + zone = sdtZone->GetName(); + } + } + } + + if (zone.IsEmpty()) { + zone = checkable->GetZoneName(); + } if (!zone.IsEmpty()) attrs->Set("zone", zone); From 92fba8c64f6ed525ace1cc95533ae5664b00a45b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 28 Jan 2019 17:33:05 +0100 Subject: [PATCH 0469/1162] Don't allow retry_interval <= 0 (cherry picked from commit 8cbd4820725655e3c4ae06aef78308183be016da) --- lib/icinga/checkable.cpp | 8 ++++++++ lib/icinga/checkable.hpp | 1 + 2 files changed, 9 insertions(+) diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index fe2fed9e3..e745d76cb 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -198,6 +198,14 @@ void Checkable::ValidateCheckInterval(const Lazy& lvalue, const Validati BOOST_THROW_EXCEPTION(ValidationError(this, { "check_interval" }, "Interval must be greater than 0.")); } +void Checkable::ValidateRetryInterval(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateRetryInterval(lvalue, utils); + + if (lvalue() <= 0) + BOOST_THROW_EXCEPTION(ValidationError(this, { "retry_interval" }, "Interval must be greater than 0.")); +} + void Checkable::ValidateMaxCheckAttempts(const Lazy& lvalue, const ValidationUtils& utils) { ObjectImpl::ValidateMaxCheckAttempts(lvalue, utils); diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 141d0a43c..824f41b8d 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -192,6 +192,7 @@ public: std::vector > GetReverseDependencies() const; void ValidateCheckInterval(const Lazy& lvalue, const ValidationUtils& value) final; + void ValidateRetryInterval(const Lazy& lvalue, const ValidationUtils& value) final; void ValidateMaxCheckAttempts(const Lazy& lvalue, const ValidationUtils& value) final; static void IncreasePendingChecks(); From 9259e7adfdb4b90cbe79fbc3e0d7ce2b1bf389e4 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Fri, 1 Feb 2019 16:46:28 +0100 Subject: [PATCH 0470/1162] Doc: Add .NET 3.5 to the windows build stack The Windows Agent Wizard is currently build on .NET Framework 2.0, which is not installed by default on Windows 10. This adds a note to the development documentation to install the .NET Framework 3.5 (which includes .NET Framework 2.0) component on Windows 10. (cherry picked from commit 52d81d0af522956fec4ef63c0e3c06158cbefbf9) --- doc/21-development.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/21-development.md b/doc/21-development.md index 9abf3df4c..d26c8dbae 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -845,6 +845,12 @@ Choose the following minimal set: After a while, Visual Studio will be ready. +#### .NET Framework 3.5 + +Windows 10 only have .NET Framework >= 4.6 installed by default, the Icinga Agent Wizard is built on .NET Framework 2.0 which is not included in .NET Framework 4.6. Thankfully Windows 10 have .NET Framework 3.5 (which includes .NET Framework 2.0) as a component on board, you just need to activate it. + +Go to `Control Panel` -> `Programs` -> `Turn Windows features on or off`. Tick `.NET Framework 3.5 (includes .NET 2.0 and 3.0)` and wait until the installation process succseded. + #### Flex and Bison Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html): From dc27bcc8a3ad7f6ce2183c00e8b1af9a1892dafb Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Fri, 11 Jan 2019 16:16:45 +0100 Subject: [PATCH 0471/1162] Fix checkresults from the future breaking checks (cherry picked from commit c97f3c80f550320abcbc3bcbaa0a3673c2091c34) --- lib/icinga/checkable-check.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 0b8917b77..09fa901e1 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -170,8 +170,8 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig long old_attempt = GetCheckAttempt(); bool recovery = false; - /* Ignore check results older than the current one. */ - if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart()) + /* Ignore check results older than the current one, except if the previous check result is from the future. */ + if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart() && old_cr->GetExecutionStart() < now) return; /* The ExecuteCheck function already sets the old state, but we need to do it again From c77092081800adb7868c9ca760def6f4cfee10ab Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 8 Feb 2019 13:32:13 +0100 Subject: [PATCH 0472/1162] Refactor conditions and add debug log messages for future crs and skipped crs (cherry picked from commit d1fb1a8eda05018c5f665fceeb52569e243a7b65) --- lib/icinga/checkable-check.cpp | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 09fa901e1..2437aa787 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -170,9 +170,34 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig long old_attempt = GetCheckAttempt(); bool recovery = false; - /* Ignore check results older than the current one, except if the previous check result is from the future. */ - if (old_cr && cr->GetExecutionStart() < old_cr->GetExecutionStart() && old_cr->GetExecutionStart() < now) - return; + /* When we have an check result already (not after fresh start), + * prevent to accept old check results and allow overrides for + * CRs happened in the future. + */ + if (old_cr) { + double currentCRTimestamp = old_cr->GetExecutionStart(); + double newCRTimestamp = cr->GetExecutionStart(); + + /* Our current timestamp may be from the future (wrong server time adjusted again). Allow overrides here. */ + if (currentCRTimestamp > now) { + /* our current CR is from the future, let the new CR override it. */ + Log(LogDebug, "Checkable") + << std::fixed << std::setprecision(6) << "Processing check result for checkable '" << GetName() << "' from " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newCRTimestamp) << " (" << newCRTimestamp + << "). Overriding since ours is from the future at " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", currentCRTimestamp) << " (" << currentCRTimestamp << ")."; + } else { + /* Current timestamp is from the past, but the new timestamp is even more in the past. Skip it. */ + if (newCRTimestamp < currentCRTimestamp) { + Log(LogDebug, "Checkable") + << std::fixed << std::setprecision(6) << "Skipping check result for checkable '" << GetName() << "' from " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", newCRTimestamp) << " (" << newCRTimestamp + << "). It is in the past compared to ours at " + << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", currentCRTimestamp) << " (" << currentCRTimestamp << ")."; + return; + } + } + } /* The ExecuteCheck function already sets the old state, but we need to do it again * in case this was a passive check result. */ From 5d59863725ea843312fd89a9fc9e434187a56650 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Mon, 11 Feb 2019 13:54:17 +0100 Subject: [PATCH 0473/1162] Avoid duplicating non-zero count message replay messages in the debug log --- lib/remote/apilistener.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 9596b76ac..118882e35 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1249,9 +1249,10 @@ void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) Log(LogInformation, "ApiListener") << "Replayed " << count << " messages."; } - - Log(LogNotice, "ApiListener") - << "Replayed " << count << " messages."; + else { + Log(LogNotice, "ApiListener") + << "Replayed " << count << " messages."; + } if (last_sync) { { From 6558287da03bb526ba2728201ff7d558a09faf46 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 11 Feb 2019 14:32:02 +0100 Subject: [PATCH 0474/1162] Troubleshooting: Add notes on ephemeral port range blocking on Windows agents --- doc/15-troubleshooting.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index 8ccfda895..eb44ac995 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -1058,3 +1058,33 @@ Check the following: * Check your [connection](15-troubleshooting.md#troubleshooting-cluster-connection-errors) in general. * Does the log replay work, e.g. are all events processed and the directory gets cleared up over time? * Decrease the `log_duration` attribute value for that specific [endpoint](09-object-types.md#objecttype-endpoint). + + + +### Cluster Troubleshooting: Windows Agents + +#### Windows blocking Icinga 2 with ephemeral port range + +When you see a message like this in your Windows agent logs: + +``` +critical/TcpSocket: Invalid socket: 10055, "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full." +``` + +Windows is blocking Icinga 2 and as such, no more TCP connection handling is possible. + +Depending on the version, patch level and installed applications, Windows is changing its +range of [ephemeral ports](https://en.wikipedia.org/wiki/Ephemeral_port#Range). + +In order to solve this, raise the the `MaxUserPort` value in the registry. + +``` +HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters + +Value Name: MaxUserPort Value +Type: DWORD +Value data: 65534 +``` + +More details in [this blogpost](https://www.netways.de/blog/2019/01/24/windows-blocking-icinga-2-with-ephemeral-port-range/) +and this [MS help entry](https://support.microsoft.com/en-us/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t). From 4f494b9a91fb33d571aef8639fd630318ac33ebb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 11 Feb 2019 14:32:02 +0100 Subject: [PATCH 0475/1162] Troubleshooting: Add notes on ephemeral port range blocking on Windows agents (cherry picked from commit 6558287da03bb526ba2728201ff7d558a09faf46) --- doc/15-troubleshooting.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index 8ccfda895..eb44ac995 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -1058,3 +1058,33 @@ Check the following: * Check your [connection](15-troubleshooting.md#troubleshooting-cluster-connection-errors) in general. * Does the log replay work, e.g. are all events processed and the directory gets cleared up over time? * Decrease the `log_duration` attribute value for that specific [endpoint](09-object-types.md#objecttype-endpoint). + + + +### Cluster Troubleshooting: Windows Agents + +#### Windows blocking Icinga 2 with ephemeral port range + +When you see a message like this in your Windows agent logs: + +``` +critical/TcpSocket: Invalid socket: 10055, "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full." +``` + +Windows is blocking Icinga 2 and as such, no more TCP connection handling is possible. + +Depending on the version, patch level and installed applications, Windows is changing its +range of [ephemeral ports](https://en.wikipedia.org/wiki/Ephemeral_port#Range). + +In order to solve this, raise the the `MaxUserPort` value in the registry. + +``` +HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters + +Value Name: MaxUserPort Value +Type: DWORD +Value data: 65534 +``` + +More details in [this blogpost](https://www.netways.de/blog/2019/01/24/windows-blocking-icinga-2-with-ephemeral-port-range/) +and this [MS help entry](https://support.microsoft.com/en-us/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t). From 71bc184de06ae35e7d704a8a9a83cbc64f5e56bc Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 13 Feb 2019 07:44:20 +0100 Subject: [PATCH 0476/1162] fixes check_rbl parameter typo --- doc/10-icinga-template-library.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index 3627d26ca..f83066385 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5469,7 +5469,7 @@ rbl_hostname | **Optional.** The address or name of the SMTP server to check. De rbl_server | **Required** List of RBL servers as an array. rbl_warning | **Optional** Number of blacklisting servers for a warning. rbl_critical | **Optional** Number of blacklisting servers for a critical. -tbl_timeout | **Optional** Seconds before plugin times out (default: 15). +rbl_timeout | **Optional** Seconds before plugin times out (default: 15). #### squid From 3ad911a57cf0eb5aef2d349e0119a1e32346faae Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 15 Feb 2019 12:24:49 +0100 Subject: [PATCH 0477/1162] Fix indent in configcompiler.cpp --- lib/config/configcompiler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/config/configcompiler.cpp b/lib/config/configcompiler.cpp index 74cfaa292..44f5c475b 100644 --- a/lib/config/configcompiler.cpp +++ b/lib/config/configcompiler.cpp @@ -340,7 +340,8 @@ bool ConfigCompiler::HasZoneConfigAuthority(const String& zoneName) if (!empty) { std::vector paths; paths.reserve(zoneDirs.size()); -for (const ZoneFragment& zf : zoneDirs) { + + for (const ZoneFragment& zf : zoneDirs) { paths.push_back(zf.Path); } From 0042b5429814062315be7dac147790d619e087a2 Mon Sep 17 00:00:00 2001 From: Michael Insel Date: Mon, 18 Feb 2019 16:21:26 +0100 Subject: [PATCH 0478/1162] Escape pipe symbol in api documentation This escapes the pipe symbol in the api documentation. refs #6955 --- doc/12-icinga2-api.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/12-icinga2-api.md b/doc/12-icinga2-api.md index 2b982c9aa..d23e718f4 100644 --- a/doc/12-icinga2-api.md +++ b/doc/12-icinga2-api.md @@ -831,16 +831,16 @@ Process a check result for a host or a service. Send a `POST` request to the URL endpoint `/v1/actions/process-check-result`. - Parameter | Type | Description - ------------------|--------------|-------------- - exit\_status | Number | **Required.** For services: 0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN, for hosts: 0=OK, 1=CRITICAL. - plugin\_output | String | **Required.** One or more lines of the plugin main output. Does **not** contain the performance data. - performance\_data | Array|String | **Optional.** The performance data as array of strings. The raw performance data string can be used too. - check\_command | Array | **Optional.** The first entry should be the check commands path, then one entry for each command line option followed by an entry for each of its argument. - check\_source | String | **Optional.** Usually the name of the `command_endpoint` - execution\_start | Timestamp | **Optional.** The timestamp where a script/process started its execution. - execution\_end | Timestamp | **Optional.** The timestamp where a script/process ended its execution. This timestamp is used in features to determine e.g. the metric timestamp. - ttl | Number | **Optional.** Time-to-live duration in seconds for this check result. The next expected check result is `now + ttl` where freshness checks are executed. + Parameter | Type | Description + ------------------ | -------------- | -------------- + exit\_status | Number | **Required.** For services: 0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN, for hosts: 0=OK, 1=CRITICAL. + plugin\_output | String | **Required.** One or more lines of the plugin main output. Does **not** contain the performance data. + performance\_data | Array|String | **Optional.** The performance data as array of strings. The raw performance data string can be used too. + check\_command | Array | **Optional.** The first entry should be the check commands path, then one entry for each command line option followed by an entry for each of its argument. + check\_source | String | **Optional.** Usually the name of the `command_endpoint` + execution\_start | Timestamp | **Optional.** The timestamp where a script/process started its execution. + execution\_end | Timestamp | **Optional.** The timestamp where a script/process ended its execution. This timestamp is used in features to determine e.g. the metric timestamp. + ttl | Number | **Optional.** Time-to-live duration in seconds for this check result. The next expected check result is `now + ttl` where freshness checks are executed. In addition to these parameters a [filter](12-icinga2-api.md#icinga2-api-filters) must be provided. The valid types for this action are `Host` and `Service`. From d98c0704c446b0fd47b18b610a92ac75de180853 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 13:49:52 +0100 Subject: [PATCH 0479/1162] Debug: Log calls to ConfigObject::Deactivate() Only available in debug builds. --- lib/base/configobject.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index bf43dd2ba..f8517d61d 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -631,6 +631,10 @@ void ConfigObject::StopObjects() continue; for (const ConfigObject::Ptr& object : dtype->GetObjects()) { +#ifdef I2_DEBUG + Log(LogDebug, "ConfigObject") + << "Deactivate() called for config object '" << object->GetName() << "' with type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ object->Deactivate(); } } From 466096a6a4d1c61f83886c0de88c4ee45df6f49c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 13:49:52 +0100 Subject: [PATCH 0480/1162] Debug: Log calls to ConfigObject::Deactivate() Only available in debug builds. (cherry picked from commit d98c0704c446b0fd47b18b610a92ac75de180853) --- lib/base/configobject.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index 9d44db60a..b73285bc5 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -624,6 +624,10 @@ void ConfigObject::StopObjects() continue; for (const ConfigObject::Ptr& object : dtype->GetObjects()) { +#ifdef I2_DEBUG + Log(LogDebug, "ConfigObject") + << "Deactivate() called for config object '" << object->GetName() << "' with type '" << type->GetName() << "'."; +#endif /* I2_DEBUG */ object->Deactivate(); } } From a2f5b7a02cfe6a0c96584f3ae60e928955af5502 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 14:05:00 +0100 Subject: [PATCH 0481/1162] Revert "CheckerComponent#Stop(): wait for all running checks" This reverts commit 1eaad0637b75bd24875b1e62fd080fb155b08ed7. --- lib/base/defer.hpp | 59 -------------------------------- lib/checker/checkercomponent.cpp | 12 ------- lib/checker/checkercomponent.hpp | 3 -- 3 files changed, 74 deletions(-) delete mode 100644 lib/base/defer.hpp diff --git a/lib/base/defer.hpp b/lib/base/defer.hpp deleted file mode 100644 index 05ae0b819..000000000 --- a/lib/base/defer.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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. * - ******************************************************************************/ - -#ifndef DEFER -#define DEFER - -#include -#include - -namespace icinga -{ - -/** - * An action to be executed at end of scope. - * - * @ingroup base - */ -class Defer -{ -public: - inline - Defer(std::function func) : m_Func(std::move(func)) - { - } - - Defer(const Defer&) = delete; - Defer(Defer&&) = delete; - Defer& operator=(const Defer&) = delete; - Defer& operator=(Defer&&) = delete; - - inline - ~Defer() - { - m_Func(); - } - -private: - std::function m_Func; -}; - -} - -#endif /* DEFER */ diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index 8878a9d29..c14259b88 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -23,7 +23,6 @@ #include "icinga/cib.hpp" #include "remote/apilistener.hpp" #include "base/configtype.hpp" -#include "base/defer.hpp" #include "base/objectlock.hpp" #include "base/utility.hpp" #include "base/perfdatavalue.hpp" @@ -74,7 +73,6 @@ void CheckerComponent::Start(bool runtimeCreated) Log(LogInformation, "CheckerComponent") << "'" << GetName() << "' started."; - m_RunningChecks.store(0); m_Thread = std::thread(std::bind(&CheckerComponent::CheckThreadProc, this)); @@ -95,10 +93,6 @@ void CheckerComponent::Stop(bool runtimeRemoved) m_ResultTimer->Stop(); m_Thread.join(); - while (m_RunningChecks.load()) { - Utility::Sleep(1.0 / 60.0); - } - Log(LogInformation, "CheckerComponent") << "'" << GetName() << "' stopped."; @@ -213,8 +207,6 @@ void CheckerComponent::CheckThreadProc() Checkable::IncreasePendingChecks(); - m_RunningChecks.fetch_add(1); - Utility::QueueAsyncCallback(std::bind(&CheckerComponent::ExecuteCheckHelper, CheckerComponent::Ptr(this), checkable)); lock.lock(); @@ -223,10 +215,6 @@ void CheckerComponent::CheckThreadProc() void CheckerComponent::ExecuteCheckHelper(const Checkable::Ptr& checkable) { - Defer decrementRunningChecks ([this]{ - m_RunningChecks.fetch_sub(1); - }); - try { checkable->ExecuteCheck(); } catch (const std::exception& ex) { diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp index 3c2753973..f69f5092e 100644 --- a/lib/checker/checkercomponent.hpp +++ b/lib/checker/checkercomponent.hpp @@ -25,13 +25,11 @@ #include "base/configobject.hpp" #include "base/timer.hpp" #include "base/utility.hpp" -#include #include #include #include #include #include -#include #include namespace icinga @@ -92,7 +90,6 @@ private: boost::condition_variable m_CV; bool m_Stopped{false}; std::thread m_Thread; - std::atomic m_RunningChecks; CheckableSet m_IdleCheckables; CheckableSet m_PendingCheckables; From d2e049d57506b6314e04ed16be99e2d94ad8b186 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 14:05:07 +0100 Subject: [PATCH 0482/1162] Revert "CheckerComponent#Stop(): log after actually being stopped" This reverts commit b81aa6af3a23cba179b9da03fda6d2674ccc0956. --- lib/checker/checkercomponent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index c14259b88..cde975b72 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -84,6 +84,9 @@ void CheckerComponent::Start(bool runtimeCreated) void CheckerComponent::Stop(bool runtimeRemoved) { + Log(LogInformation, "CheckerComponent") + << "'" << GetName() << "' stopped."; + { boost::mutex::scoped_lock lock(m_Mutex); m_Stopped = true; @@ -93,9 +96,6 @@ void CheckerComponent::Stop(bool runtimeRemoved) m_ResultTimer->Stop(); m_Thread.join(); - Log(LogInformation, "CheckerComponent") - << "'" << GetName() << "' stopped."; - ObjectImpl::Stop(runtimeRemoved); } From 4edd3ece66a8345d34424068f2140ffaffb809e9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 14:06:15 +0100 Subject: [PATCH 0483/1162] Revert "Deactivate perfdata writers after checker" This reverts commit f0e12ff63ce138b6df9e85bc690eda46ae794ccb. --- lib/perfdata/elasticsearchwriter.ti | 2 +- lib/perfdata/gelfwriter.ti | 2 +- lib/perfdata/graphitewriter.ti | 2 +- lib/perfdata/influxdbwriter.ti | 2 +- lib/perfdata/opentsdbwriter.ti | 2 +- lib/perfdata/perfdatawriter.ti | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.ti b/lib/perfdata/elasticsearchwriter.ti index c3e7fc046..7cf604fb9 100644 --- a/lib/perfdata/elasticsearchwriter.ti +++ b/lib/perfdata/elasticsearchwriter.ti @@ -7,7 +7,7 @@ namespace icinga class ElasticsearchWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config, required] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/gelfwriter.ti b/lib/perfdata/gelfwriter.ti index 92d4a2176..d13ee55d2 100644 --- a/lib/perfdata/gelfwriter.ti +++ b/lib/perfdata/gelfwriter.ti @@ -26,7 +26,7 @@ namespace icinga class GelfWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/graphitewriter.ti b/lib/perfdata/graphitewriter.ti index 4475eb184..b28ba87a9 100644 --- a/lib/perfdata/graphitewriter.ti +++ b/lib/perfdata/graphitewriter.ti @@ -26,7 +26,7 @@ namespace icinga class GraphiteWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/influxdbwriter.ti b/lib/perfdata/influxdbwriter.ti index a26af6d55..d2f1ba6d2 100644 --- a/lib/perfdata/influxdbwriter.ti +++ b/lib/perfdata/influxdbwriter.ti @@ -26,7 +26,7 @@ namespace icinga class InfluxdbWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config, required] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/opentsdbwriter.ti b/lib/perfdata/opentsdbwriter.ti index 09d5f3ede..3418e1606 100644 --- a/lib/perfdata/opentsdbwriter.ti +++ b/lib/perfdata/opentsdbwriter.ti @@ -26,7 +26,7 @@ namespace icinga class OpenTsdbWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config] String host { default {{{ return "127.0.0.1"; }}} diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index dbd303c75..d2ceb6899 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -27,7 +27,7 @@ namespace icinga class PerfdataWriter : ConfigObject { - activation_priority 80; + activation_priority 100; [config] String host_perfdata_path { default {{{ return Configuration::SpoolDir + "/perfdata/host-perfdata"; }}} From 5da1cbd0969ee1fa75a359937cc93976741fe694 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 14:30:44 +0100 Subject: [PATCH 0484/1162] Revert "Respect activation priority also on deactivation" This reverts commit 8ad1717055683c573f81181c7749ba422fa96d13. --- lib/base/configobject.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index f8517d61d..b73285bc5 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -33,7 +33,6 @@ #include "base/workqueue.hpp" #include "base/context.hpp" #include "base/application.hpp" -#include #include #include #include @@ -618,13 +617,7 @@ void ConfigObject::RestoreObjects(const String& filename, int attributeTypes) void ConfigObject::StopObjects() { - auto types = Type::GetAllTypes(); - - std::sort(types.begin(), types.end(), [](const Type::Ptr& a, const Type::Ptr& b) { - return a->GetActivationPriority() > b->GetActivationPriority(); - }); - - for (const Type::Ptr& type : types) { + for (const Type::Ptr& type : Type::GetAllTypes()) { auto *dtype = dynamic_cast(type.get()); if (!dtype) From 7b2b45b503dd193d5eb3eba41353f33b5515ccab Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Feb 2019 14:54:28 +0100 Subject: [PATCH 0485/1162] Revert "InfluxdbWriter#Stop(): flush buffer" This reverts commit 8470facfe2d8437d5db75e4f84434991d30032c7. --- lib/perfdata/influxdbwriter.cpp | 8 -------- lib/perfdata/influxdbwriter.hpp | 1 - 2 files changed, 9 deletions(-) diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 80d050233..91fb1be10 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -140,14 +140,6 @@ void InfluxdbWriter::Pause() ObjectImpl::Pause(); } -void InfluxdbWriter::Stop(bool runtimeDeleted) -{ - FlushTimeout(); - m_WorkQueue.Join(); - - ObjectImpl::Stop(runtimeDeleted); -} - void InfluxdbWriter::AssertOnWorkQueue() { ASSERT(m_WorkQueue.IsWorkerThread()); diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp index 370ca25c5..face44f69 100644 --- a/lib/perfdata/influxdbwriter.hpp +++ b/lib/perfdata/influxdbwriter.hpp @@ -51,7 +51,6 @@ protected: void OnConfigLoaded() override; void Resume() override; void Pause() override; - void Stop(bool runtimeDeleted) override; private: WorkQueue m_WorkQueue{10000000, 1}; From cc8dd42c0a5ad509f60d56b78a43b4039ca14e78 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 12:11:59 +0100 Subject: [PATCH 0486/1162] Start the notification component after general features --- lib/notification/notificationcomponent.ti | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/notification/notificationcomponent.ti b/lib/notification/notificationcomponent.ti index 840667fb8..67266cee0 100644 --- a/lib/notification/notificationcomponent.ti +++ b/lib/notification/notificationcomponent.ti @@ -26,7 +26,7 @@ namespace icinga class NotificationComponent : ConfigObject { - activation_priority 100; + activation_priority 200; [config] bool enable_ha (EnableHA) { default {{{ return true; }}} From 9d5dc4afc1bb66ea25f98dd12acded49e493fbbf Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 12:37:48 +0100 Subject: [PATCH 0487/1162] Start the checker component at the latest point possible --- lib/checker/checkercomponent.ti | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checker/checkercomponent.ti b/lib/checker/checkercomponent.ti index 9663bb189..ee5a74ece 100644 --- a/lib/checker/checkercomponent.ti +++ b/lib/checker/checkercomponent.ti @@ -26,7 +26,7 @@ namespace icinga class CheckerComponent : ConfigObject { - activation_priority 100; + activation_priority 300; [config, no_storage] int concurrent_checks { get {{{ From a25e2b1038c34d2c11c51a47986c9cf5870021e4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 12:38:57 +0100 Subject: [PATCH 0488/1162] Stop object in reversed activation priority order This stops the checker component first, then notifications, then features, then config objects, then the API feature and logger(s). Patch taken from @al2klimov --- lib/base/configobject.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index b73285bc5..149917a43 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -617,7 +617,15 @@ void ConfigObject::RestoreObjects(const String& filename, int attributeTypes) void ConfigObject::StopObjects() { - for (const Type::Ptr& type : Type::GetAllTypes()) { + std::vector types = Type::GetAllTypes(); + + std::sort(types.begin(), types.end(), [](const Type::Ptr& a, const Type::Ptr& b) { + if (a->GetActivationPriority() > b->GetActivationPriority()) + return true; + return false; + }); + + for (const Type::Ptr& type : types) { auto *dtype = dynamic_cast(type.get()); if (!dtype) From a4f97c1246ffac508ff5d3735b4cf27b260c5190 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 13:55:34 +0100 Subject: [PATCH 0489/1162] Stop the IcingaApplication at the latest point, before any loggers --- lib/icinga/icingaapplication.ti | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/icinga/icingaapplication.ti b/lib/icinga/icingaapplication.ti index dd4e060b1..b3f90ff02 100644 --- a/lib/icinga/icingaapplication.ti +++ b/lib/icinga/icingaapplication.ti @@ -26,6 +26,8 @@ namespace icinga class IcingaApplication : Application { + activation_priority -50; + [config, no_storage, virtual] String environment { get; set; From 7936a147ba82ce7e19de43ccb5f4c830edd8d235 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 13:56:15 +0100 Subject: [PATCH 0490/1162] Activate downtimes before any checkable object --- lib/icinga/downtime.ti | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index fe80e0e77..d2880421f 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -37,6 +37,8 @@ public: class Downtime : ConfigObject < DowntimeNameComposer { + activation_priority -10; + load_after Host; load_after Service; From 388999a86fc82cf9e8ac2f13f9a5aa52bbc3b72f Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 14:20:53 +0100 Subject: [PATCH 0491/1162] PerfdataWriter: Rotate and close files on Pause/Shutdown/Reload Refactored the code into a local mutex and added some more debug logging while at it. --- lib/perfdata/perfdatawriter.cpp | 31 +++++++++++++++++++++++++++---- lib/perfdata/perfdatawriter.hpp | 10 ++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/perfdata/perfdatawriter.cpp b/lib/perfdata/perfdatawriter.cpp index c560ef256..7330f3c98 100644 --- a/lib/perfdata/perfdatawriter.cpp +++ b/lib/perfdata/perfdatawriter.cpp @@ -83,6 +83,14 @@ void PerfdataWriter::Resume() void PerfdataWriter::Pause() { +#ifdef I2_DEBUG + //m_HostOutputFile << "\n# Pause the feature" << "\n\n"; + //m_ServiceOutputFile << "\n# Pause the feature" << "\n\n"; +#endif /* I2_DEBUG */ + + /* Force a rotation closing the file stream. */ + RotateAllFiles(); + Log(LogInformation, "PerfdataWriter") << "'" << GetName() << "' paused."; @@ -125,7 +133,8 @@ void PerfdataWriter::CheckResultHandler(const Checkable::Ptr& checkable, const C String line = MacroProcessor::ResolveMacros(GetServiceFormatTemplate(), resolvers, cr, nullptr, &PerfdataWriter::EscapeMacroMetric); { - ObjectLock olock(this); + boost::mutex::scoped_lock lock(m_StreamMutex); + if (!m_ServiceOutputFile.good()) return; @@ -135,7 +144,8 @@ void PerfdataWriter::CheckResultHandler(const Checkable::Ptr& checkable, const C String line = MacroProcessor::ResolveMacros(GetHostFormatTemplate(), resolvers, cr, nullptr, &PerfdataWriter::EscapeMacroMetric); { - ObjectLock olock(this); + boost::mutex::scoped_lock lock(m_StreamMutex); + if (!m_HostOutputFile.good()) return; @@ -146,13 +156,20 @@ void PerfdataWriter::CheckResultHandler(const Checkable::Ptr& checkable, const C void PerfdataWriter::RotateFile(std::ofstream& output, const String& temp_path, const String& perfdata_path) { - ObjectLock olock(this); + Log(LogDebug, "PerfdataWriter") + << "Rotating perfdata files."; + + boost::mutex::scoped_lock lock(m_StreamMutex); if (output.good()) { output.close(); if (Utility::PathExists(temp_path)) { String finalFile = perfdata_path + "." + Convert::ToString((long)Utility::GetTime()); + + Log(LogDebug, "PerfdataWriter") + << "Closed output file and renaming into '" << finalFile << "'."; + if (rename(temp_path.CStr(), finalFile.CStr()) < 0) { BOOST_THROW_EXCEPTION(posix_error() << boost::errinfo_api_function("rename") @@ -164,9 +181,10 @@ void PerfdataWriter::RotateFile(std::ofstream& output, const String& temp_path, output.open(temp_path.CStr()); - if (!output.good()) + if (!output.good()) { Log(LogWarning, "PerfdataWriter") << "Could not open perfdata file '" << temp_path << "' for writing. Perfdata will be lost."; + } } void PerfdataWriter::RotationTimerHandler() @@ -174,6 +192,11 @@ void PerfdataWriter::RotationTimerHandler() if (IsPaused()) return; + RotateAllFiles(); +} + +void PerfdataWriter::RotateAllFiles() +{ RotateFile(m_ServiceOutputFile, GetServiceTempPath(), GetServicePerfdataPath()); RotateFile(m_HostOutputFile, GetHostTempPath(), GetHostPerfdataPath()); } diff --git a/lib/perfdata/perfdatawriter.hpp b/lib/perfdata/perfdatawriter.hpp index 56d01d382..e7ea6aade 100644 --- a/lib/perfdata/perfdatawriter.hpp +++ b/lib/perfdata/perfdatawriter.hpp @@ -51,14 +51,16 @@ protected: void Pause() override; private: + Timer::Ptr m_RotationTimer; + std::ofstream m_ServiceOutputFile; + std::ofstream m_HostOutputFile; + boost::mutex m_StreamMutex; + void CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr); static Value EscapeMacroMetric(const Value& value); - Timer::Ptr m_RotationTimer; void RotationTimerHandler(); - - std::ofstream m_ServiceOutputFile; - std::ofstream m_HostOutputFile; + void RotateAllFiles(); void RotateFile(std::ofstream& output, const String& temp_path, const String& perfdata_path); }; From d79390083dceb69575a4267cc8363608ca8717d6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 14:54:23 +0100 Subject: [PATCH 0492/1162] GraphiteWriter: Improve Pause/Shutdown/Reload handling for metrics --- lib/perfdata/graphitewriter.cpp | 37 ++++++++++++++++++++++++++++++--- lib/perfdata/graphitewriter.hpp | 2 ++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index 1b6461d51..5fa4479e6 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -102,12 +102,26 @@ void GraphiteWriter::Resume() Checkable::OnNewCheckResult.connect(std::bind(&GraphiteWriter::CheckResultHandler, this, _1, _2)); } +/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */ void GraphiteWriter::Pause() { - Log(LogInformation, "GraphiteWriter") - << "'" << GetName() << "' paused."; + m_ReconnectTimer.reset(); + + try { + ReconnectInternal(); + } catch (const std::exception&) { + Log(LogInformation, "GraphiteWriter") + << "'" << GetName() << "' paused. Unable to connect, not flushing buffers. Data may be lost on reload."; + + ObjectImpl::Pause(); + return; + } m_WorkQueue.Join(); + DisconnectInternal(); + + Log(LogInformation, "GraphiteWriter") + << "'" << GetName() << "' paused."; ObjectImpl::Pause(); } @@ -140,6 +154,11 @@ void GraphiteWriter::Reconnect() return; } + ReconnectInternal(); +} + +void GraphiteWriter::ReconnectInternal() +{ double startTime = Utility::GetTime(); CONTEXT("Reconnecting to Graphite '" + GetName() + "'"); @@ -172,6 +191,9 @@ void GraphiteWriter::Reconnect() void GraphiteWriter::ReconnectTimerHandler() { + if (IsPaused()) + return; + m_WorkQueue.Enqueue(std::bind(&GraphiteWriter::Reconnect, this), PriorityNormal); } @@ -179,6 +201,11 @@ void GraphiteWriter::Disconnect() { AssertOnWorkQueue(); + DisconnectInternal(); +} + +void GraphiteWriter::DisconnectInternal() +{ if (!GetConnected()) return; @@ -201,6 +228,10 @@ void GraphiteWriter::CheckResultHandlerInternal(const Checkable::Ptr& checkable, CONTEXT("Processing check result for '" + checkable->GetName() + "'"); + /* TODO: Deal with missing connection here. Needs refactoring + * into parsing the actual performance data and then putting it + * into a queue for re-inserting. */ + if (!IcingaApplication::GetInstance()->GetEnablePerfdata() || !checkable->GetEnablePerfdata()) return; @@ -293,7 +324,7 @@ void GraphiteWriter::SendMetric(const String& prefix, const String& name, double msgbuf << prefix << "." << name << " " << Convert::ToString(value) << " " << static_cast(ts); Log(LogDebug, "GraphiteWriter") - << "Add to metric list:'" << msgbuf.str() << "'."; + << "Add to metric list: '" << msgbuf.str() << "'."; // do not send \n to debug log msgbuf << "\n"; diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index ec4c5bbfe..2a4443e96 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -71,7 +71,9 @@ private: void ReconnectTimerHandler(); void Disconnect(); + void DisconnectInternal(); void Reconnect(); + void ReconnectInternal(); void AssertOnWorkQueue(); From d4bdebc79505f999ec9de2bc3d5a0fea012de976 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 15:21:24 +0100 Subject: [PATCH 0493/1162] InfluxdbWriter: Ensure to flush buffers after emptying the metrics queue on Pause/Shutdown/Reload Patch taken from @al2klimov but moved into Pause() --- lib/perfdata/influxdbwriter.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 91fb1be10..13b15d30b 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -130,13 +130,30 @@ void InfluxdbWriter::Resume() Checkable::OnNewCheckResult.connect(std::bind(&InfluxdbWriter::CheckResultHandler, this, _1, _2)); } +/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */ void InfluxdbWriter::Pause() { - Log(LogInformation, "InfluxdbWriter") - << "'" << GetName() << "' paused."; + /* Force a flush. */ + Log(LogDebug, "InfluxdbWriter") + << "Flushing pending data buffers."; + + Flush(); + + /* Work on the missing tasks. TODO: Find a way to cache them on disk. */ + Log(LogDebug, "InfluxdbWriter") + << "Joining existing WQ tasks."; m_WorkQueue.Join(); + /* Flush again after the WQ tasks have filled the data buffer. */ + Log(LogDebug, "InfluxdbWriter") + << "Flushing data buffers from WQ tasks."; + + Flush(); + + Log(LogInformation, "InfluxdbWriter") + << "'" << GetName() << "' paused."; + ObjectImpl::Pause(); } @@ -428,6 +445,9 @@ void InfluxdbWriter::FlushTimeoutWQ() void InfluxdbWriter::Flush() { + Log(LogDebug, "InfluxdbWriter") + << "Flushing data buffer to InfluxDB."; + String body = boost::algorithm::join(m_DataBuffer, "\n"); m_DataBuffer.clear(); From 1bfe756cb14bd23d53f1e39f76e53e3f302428d7 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 17:10:46 +0100 Subject: [PATCH 0494/1162] DB IDO: Improve queue handling on Pause/Shutdown/Reload --- lib/db_ido/servicedbobject.cpp | 15 --------------- lib/db_ido_mysql/idomysqlconnection.cpp | 19 ++++++++++--------- lib/db_ido_pgsql/idopgsqlconnection.cpp | 19 ++++++++++--------- 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/lib/db_ido/servicedbobject.cpp b/lib/db_ido/servicedbobject.cpp index 903bba655..fcc294cbc 100644 --- a/lib/db_ido/servicedbobject.cpp +++ b/lib/db_ido/servicedbobject.cpp @@ -200,9 +200,6 @@ void ServiceDbObject::OnConfigUpdateHeavy() DbObject::OnMultipleQueries(queries); /* service dependencies */ - Log(LogDebug, "ServiceDbObject") - << "service dependencies for '" << service->GetName() << "'"; - queries.clear(); DbQuery query2; @@ -250,9 +247,6 @@ void ServiceDbObject::OnConfigUpdateHeavy() DbObject::OnMultipleQueries(queries); /* service contacts, contactgroups */ - Log(LogDebug, "ServiceDbObject") - << "service contacts: " << service->GetName(); - queries.clear(); DbQuery query3; @@ -265,9 +259,6 @@ void ServiceDbObject::OnConfigUpdateHeavy() queries.emplace_back(std::move(query3)); for (const User::Ptr& user : CompatUtility::GetCheckableNotificationUsers(service)) { - Log(LogDebug, "ServiceDbObject") - << "service contacts: " << user->GetName(); - DbQuery query_contact; query_contact.Table = GetType()->GetTable() + "_contacts"; query_contact.Type = DbQueryInsert; @@ -283,9 +274,6 @@ void ServiceDbObject::OnConfigUpdateHeavy() DbObject::OnMultipleQueries(queries); - Log(LogDebug, "ServiceDbObject") - << "service contactgroups: " << service->GetName(); - queries.clear(); DbQuery query4; @@ -298,9 +286,6 @@ void ServiceDbObject::OnConfigUpdateHeavy() queries.emplace_back(std::move(query4)); for (const UserGroup::Ptr& usergroup : CompatUtility::GetCheckableNotificationUserGroups(service)) { - Log(LogDebug, "ServiceDbObject") - << "service contactgroups: " << usergroup->GetName(); - DbQuery query_contact; query_contact.Table = GetType()->GetTable() + "_contactgroups"; query_contact.Type = DbQueryInsert; diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 9bbbeb0df..a6323332c 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -107,9 +107,6 @@ void IdoMysqlConnection::Resume() void IdoMysqlConnection::Pause() { - Log(LogInformation, "IdoMysqlConnection") - << "'" << GetName() << "' paused."; - m_ReconnectTimer.reset(); DbConnection::Pause(); @@ -119,8 +116,12 @@ void IdoMysqlConnection::Pause() << "Rescheduling disconnect task."; #endif /* I2_DEBUG */ - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::Disconnect, this), PriorityHigh); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::Disconnect, this), PriorityLow); m_QueryQueue.Join(); + + Log(LogInformation, "IdoMysqlConnection") + << "'" << GetName() << "' paused."; + } void IdoMysqlConnection::ExceptionHandler(boost::exception_ptr exp) @@ -192,7 +193,7 @@ void IdoMysqlConnection::ReconnectTimerHandler() << "Scheduling reconnect task."; #endif /* I2_DEBUG */ - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::Reconnect, this), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::Reconnect, this), PriorityHigh); } void IdoMysqlConnection::Reconnect() @@ -451,9 +452,9 @@ void IdoMysqlConnection::Reconnect() << "Scheduling session table clear and finish connect task."; #endif /* I2_DEBUG */ - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::ClearTablesBySession, this), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::ClearTablesBySession, this), PriorityHigh); - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::FinishConnect, this, startTime), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::FinishConnect, this, startTime), PriorityHigh); } void IdoMysqlConnection::FinishConnect(double startTime) @@ -726,7 +727,7 @@ void IdoMysqlConnection::ActivateObject(const DbObject::Ptr& dbobj) << "Scheduling object activation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; #endif /* I2_DEBUG */ - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::InternalActivateObject, this, dbobj), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::InternalActivateObject, this, dbobj), PriorityHigh); } void IdoMysqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) @@ -771,7 +772,7 @@ void IdoMysqlConnection::DeactivateObject(const DbObject::Ptr& dbobj) << "Scheduling object deactivation task for '" << dbobj->GetName1() << "!" << dbobj->GetName2() << "'."; #endif /* I2_DEBUG */ - m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::InternalDeactivateObject, this, dbobj), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoMysqlConnection::InternalDeactivateObject, this, dbobj), PriorityHigh); } void IdoMysqlConnection::InternalDeactivateObject(const DbObject::Ptr& dbobj) diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 4724ab707..bc791fbd6 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -114,15 +114,16 @@ void IdoPgsqlConnection::Resume() void IdoPgsqlConnection::Pause() { - Log(LogInformation, "IdoPgsqlConnection") - << "'" << GetName() << "' paused."; - m_ReconnectTimer.reset(); DbConnection::Pause(); - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::Disconnect, this), PriorityHigh); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::Disconnect, this), PriorityLow); m_QueryQueue.Join(); + + Log(LogInformation, "IdoPgsqlConnection") + << "'" << GetName() << "' paused."; + } void IdoPgsqlConnection::ExceptionHandler(boost::exception_ptr exp) @@ -182,7 +183,7 @@ void IdoPgsqlConnection::InternalNewTransaction() void IdoPgsqlConnection::ReconnectTimerHandler() { - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::Reconnect, this), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::Reconnect, this), PriorityHigh); } void IdoPgsqlConnection::Reconnect() @@ -425,9 +426,9 @@ void IdoPgsqlConnection::Reconnect() UpdateAllObjects(); - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::ClearTablesBySession, this), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::ClearTablesBySession, this), PriorityHigh); - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::FinishConnect, this, startTime), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::FinishConnect, this, startTime), PriorityHigh); } void IdoPgsqlConnection::FinishConnect(double startTime) @@ -575,7 +576,7 @@ void IdoPgsqlConnection::ActivateObject(const DbObject::Ptr& dbobj) if (IsPaused()) return; - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::InternalActivateObject, this, dbobj), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::InternalActivateObject, this, dbobj), PriorityHigh); } void IdoPgsqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) @@ -612,7 +613,7 @@ void IdoPgsqlConnection::DeactivateObject(const DbObject::Ptr& dbobj) if (IsPaused()) return; - m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::InternalDeactivateObject, this, dbobj), PriorityLow); + m_QueryQueue.Enqueue(std::bind(&IdoPgsqlConnection::InternalDeactivateObject, this, dbobj), PriorityHigh); } void IdoPgsqlConnection::InternalDeactivateObject(const DbObject::Ptr& dbobj) From 301c48e9bc8e5c37e4b091bdf72b6deafa29eb99 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 17:11:39 +0100 Subject: [PATCH 0495/1162] ElasticWriter: Ensure to flush buffers on Pause/Shutdown/Reload --- lib/perfdata/elasticsearchwriter.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index ec89bed01..ac2005d7a 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -104,13 +104,16 @@ void ElasticsearchWriter::Resume() Checkable::OnNotificationSentToAllUsers.connect(std::bind(&ElasticsearchWriter::NotificationSentToAllUsersHandler, this, _1, _2, _3, _4, _5, _6, _7)); } +/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */ void ElasticsearchWriter::Pause() { + Flush(); + m_WorkQueue.Join(); + Flush(); + Log(LogInformation, "ElasticsearchWriter") << "'" << GetName() << "' paused."; - m_WorkQueue.Join(); - ObjectImpl::Pause(); } From 24c3572b034bbb387c9654cef48ab2695ddcb65c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 17:17:45 +0100 Subject: [PATCH 0496/1162] OpenTsdbWriter: Ensure to reset reconnect timer on Pause() --- lib/perfdata/opentsdbwriter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/perfdata/opentsdbwriter.cpp b/lib/perfdata/opentsdbwriter.cpp index 78feea8f2..6999482ca 100644 --- a/lib/perfdata/opentsdbwriter.cpp +++ b/lib/perfdata/opentsdbwriter.cpp @@ -85,8 +85,11 @@ void OpenTsdbWriter::Resume() Service::OnNewCheckResult.connect(std::bind(&OpenTsdbWriter::CheckResultHandler, this, _1, _2)); } +/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */ void OpenTsdbWriter::Pause() { + m_ReconnectTimer.reset(); + Log(LogInformation, "OpentsdbWriter") << "'" << GetName() << "' paused."; From 68e7027c937a0b91e5d75f95971c9b0423f72603 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 17:18:24 +0100 Subject: [PATCH 0497/1162] GelfWriter: Ensure to join queue and execute queries on Pause/Shutdown/Reload --- lib/perfdata/gelfwriter.cpp | 28 ++++++++++++++++++++++++++-- lib/perfdata/gelfwriter.hpp | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/perfdata/gelfwriter.cpp b/lib/perfdata/gelfwriter.cpp index c4c0912d2..ea49231a3 100644 --- a/lib/perfdata/gelfwriter.cpp +++ b/lib/perfdata/gelfwriter.cpp @@ -107,12 +107,26 @@ void GelfWriter::Resume() Checkable::OnStateChange.connect(std::bind(&GelfWriter::StateChangeHandler, this, _1, _2, _3)); } +/* Pause is equivalent to Stop, but with HA capabilities to resume at runtime. */ void GelfWriter::Pause() { - Log(LogInformation, "GelfWriter") - << "'" << GetName() << "' paused."; + m_ReconnectTimer.reset(); + + try { + ReconnectInternal(); + } catch (const std::exception&) { + Log(LogInformation, "GelfWriter") + << "'" << GetName() << "' paused. Unable to connect, not flushing buffers. Data may be lost on reload."; + + ObjectImpl::Pause(); + return; + } m_WorkQueue.Join(); + DisconnectInternal(); + + Log(LogInformation, "GraphiteWriter") + << "'" << GetName() << "' paused."; ObjectImpl::Pause(); } @@ -145,6 +159,11 @@ void GelfWriter::Reconnect() return; } + ReconnectInternal(); +} + +void GelfWriter::ReconnectInternal() +{ double startTime = Utility::GetTime(); CONTEXT("Reconnecting to Graylog Gelf '" + GetName() + "'"); @@ -184,6 +203,11 @@ void GelfWriter::Disconnect() { AssertOnWorkQueue(); + DisconnectInternal(); +} + +void GelfWriter::DisconnectInternal() +{ if (!GetConnected()) return; diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp index 32e35da57..edff50997 100644 --- a/lib/perfdata/gelfwriter.hpp +++ b/lib/perfdata/gelfwriter.hpp @@ -72,7 +72,9 @@ private: void ReconnectTimerHandler(); void Disconnect(); + void DisconnectInternal(); void Reconnect(); + void ReconnectInternal(); void AssertOnWorkQueue(); From 53acb8f2db84df7efffd25f3694c55cd66844b70 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 22 Feb 2019 09:34:16 +0100 Subject: [PATCH 0498/1162] PerfdataWriter: Reset the rotation timer on Pause() --- lib/perfdata/perfdatawriter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/perfdata/perfdatawriter.cpp b/lib/perfdata/perfdatawriter.cpp index 7330f3c98..11d7b5f11 100644 --- a/lib/perfdata/perfdatawriter.cpp +++ b/lib/perfdata/perfdatawriter.cpp @@ -83,6 +83,8 @@ void PerfdataWriter::Resume() void PerfdataWriter::Pause() { + m_RotationTimer.reset(); + #ifdef I2_DEBUG //m_HostOutputFile << "\n# Pause the feature" << "\n\n"; //m_ServiceOutputFile << "\n# Pause the feature" << "\n\n"; From b8043c06c8f99637e72ef01ea58f175d22505699 Mon Sep 17 00:00:00 2001 From: akrus Date: Fri, 22 Feb 2019 10:57:41 +0200 Subject: [PATCH 0499/1162] Add missing args for apache-status and fix a few typos --- doc/10-icinga-template-library.md | 22 +++++++++++++--------- itl/plugins-contrib.d/web.conf | 18 +++++++++++++++++- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/doc/10-icinga-template-library.md b/doc/10-icinga-template-library.md index f83066385..a11d1cd6e 100644 --- a/doc/10-icinga-template-library.md +++ b/doc/10-icinga-template-library.md @@ -5317,15 +5317,19 @@ HTTP endpoint to monitor status metrics for the Apache webserver. Custom attributes passed as [command parameters](03-monitoring-basics.md#command-passing-parameters): -Name | Description -------------------------|---------------------------------------------------------------------------------- -apache_status_address | **Optional.** The host's address. Defaults to "$address$" if the host's `address` attribute is set, `address6` otherwise. -apache_status_port | **Optional.** the http port. -apache_status_url | **Optional.** URL to use, instead of the default (http://`apache_status_address`/server-status). -apache_status_ssl | **Optional.** set to use ssl connection -apache_status_timeout | **Optional.** timeout in seconds -apache_status_warning | **Optional.** Warning threshold (number of open slots, busy workers and idle workers that will cause a WARNING) like ':20,50,:50'. -apache_status_critical | **Optional.** Critical threshold (number of open slots, busy workers and idle workers that will cause a CRITICAL) like ':10,25,:20'. +Name | Description +--------------------------------|---------------------------------------------------------------------------------- +apache_status_address | **Optional.** Host address. Defaults to "$address$" if the host's `address` attribute is set, `address6` otherwise. +apache_status_port | **Optional.** HTTP port. +apache_status_uri | **Optional.** URL to use, instead of the default (http://`apache_status_address`/server-status). +apache_status_ssl | **Optional.** Set to use SSL connection. +apache_status_no_validate | **Optional.** Skip SSL certificate validation. +apache_status_username | **Optional.** Username for basic auth. +apache_status_password | **Optional.** Password for basic auth. +apache_status_timeout | **Optional.** Timeout in seconds. +apache_status_unreachable | **Optional.** Return CRITICAL if socket timed out or http code >= 500. +apache_status_warning | **Optional.** Warning threshold (number of open slots, busy workers and idle workers that will cause a WARNING) like ':20,50,:50'. +apache_status_critical | **Optional.** Critical threshold (number of open slots, busy workers and idle workers that will cause a CRITICAL) like ':10,25,:20'. #### ssl_cert diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 0585248f1..79769cb64 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -342,12 +342,20 @@ object CheckCommand "apache-status" { } "-s" = { set_if = "$apache_status_ssl$" - description = "Wether we should use HTTPS instead of HTTP" + description = "Whether we should use HTTPS instead of HTTP" } "-u" = { value = "$apache_status_uri$" description = "Specific URL to use, instead of the default 'http:///server-status'" } + "-U" = { + value = "$apache_status_username$" + description = "username for basic auth" + } + "-P" = { + value = "$apache_status_password$" + description = "password for basic auth" + } "-w" = { value = "$apache_status_warning$" description = "number of open slots, busy workers and idle workers that will cause a WARNING" @@ -360,6 +368,14 @@ object CheckCommand "apache-status" { value = "$apache_status_timeout$" description = "timeout in seconds" } + "-N" = { + set_if = "$apache_status_no_validate$" + description = "do not validate the SSL certificate chain" + } + "-R" = { + set_if = "$apache_status_unreachable$" + description = "CRITICAL if socket timed out or http code >= 500" + } } vars.apache_status_address = "$check_address$" From 89634c2eb65daef9297179ca0c968a236409c30a Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 22 Feb 2019 15:27:34 +0100 Subject: [PATCH 0500/1162] Re-add Defer functionality --- lib/base/defer.hpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 lib/base/defer.hpp diff --git a/lib/base/defer.hpp b/lib/base/defer.hpp new file mode 100644 index 000000000..05ae0b819 --- /dev/null +++ b/lib/base/defer.hpp @@ -0,0 +1,59 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#ifndef DEFER +#define DEFER + +#include +#include + +namespace icinga +{ + +/** + * An action to be executed at end of scope. + * + * @ingroup base + */ +class Defer +{ +public: + inline + Defer(std::function func) : m_Func(std::move(func)) + { + } + + Defer(const Defer&) = delete; + Defer(Defer&&) = delete; + Defer& operator=(const Defer&) = delete; + Defer& operator=(Defer&&) = delete; + + inline + ~Defer() + { + m_Func(); + } + +private: + std::function m_Func; +}; + +} + +#endif /* DEFER */ From 9558ebc0f46febc7692bbb65394708b78b276d46 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Feb 2019 11:37:07 +0100 Subject: [PATCH 0501/1162] Secure ApiUser::GetByAuthHeader() against timing attacks --- lib/base/utility.cpp | 36 ++++++++++++++++++++++++++++++++++++ lib/base/utility.hpp | 2 ++ lib/remote/apiuser.cpp | 3 ++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index e6582de59..e44d50f23 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -26,6 +26,7 @@ #include "base/utility.hpp" #include "base/json.hpp" #include "base/objectlock.hpp" +#include #include #include #include @@ -1948,3 +1949,38 @@ String Utility::GetFromEnvironment(const String& env) else return String(envValue); } + +/** + * Compare the password entered by a client with the actual password. + * The comparision is safe against timing attacks. + */ +bool Utility::ComparePasswords(const String& enteredPassword, const String& actualPassword) +{ + volatile const char * volatile enteredPasswordCStr = enteredPassword.CStr(); + volatile size_t enteredPasswordLen = enteredPassword.GetLength(); + + volatile const char * volatile actualPasswordCStr = actualPassword.CStr(); + volatile size_t actualPasswordLen = actualPassword.GetLength(); + + volatile uint_fast8_t result = enteredPasswordLen == actualPasswordLen; + + if (result) { + auto cStr (actualPasswordCStr); + auto len (actualPasswordLen); + + actualPasswordCStr = cStr; + actualPasswordLen = len; + } else { + auto cStr (enteredPasswordCStr); + auto len (enteredPasswordLen); + + actualPasswordCStr = cStr; + actualPasswordLen = len; + } + + for (volatile size_t i = 0; i < enteredPasswordLen; ++i) { + result &= uint_fast8_t(enteredPasswordCStr[i] == actualPasswordCStr[i]); + } + + return result; +} diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index b07ca1474..67d2a2768 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -151,6 +151,8 @@ public: static String GetFromEnvironment(const String& env); + static bool ComparePasswords(const String& enteredPassword, const String& actualPassword); + #ifdef I2_DEBUG static void SetTime(double); static void IncrementTime(double); diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index 346aadbef..320935a07 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -22,6 +22,7 @@ #include "base/configtype.hpp" #include "base/base64.hpp" #include "base/tlsutility.hpp" +#include "base/utility.hpp" using namespace icinga; @@ -63,7 +64,7 @@ ApiUser::Ptr ApiUser::GetByAuthHeader(const String& auth_header) */ if (!user || password.IsEmpty()) return nullptr; - else if (user && user->GetPassword() != password) + else if (user && !Utility::ComparePasswords(password, user->GetPassword())) return nullptr; return user; From 1b00331a88c396ab8c94188855074ed907a5bd66 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Feb 2019 16:58:26 +0100 Subject: [PATCH 0502/1162] Test Utility::ComparePasswords() --- test/CMakeLists.txt | 3 ++ test/base-utility.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 test/base-utility.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c78f2732d..714d6a768 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -36,6 +36,7 @@ set(base_test_SOURCES base-string.cpp base-timer.cpp base-type.cpp + base-utility.cpp base-value.cpp config-ops.cpp icinga-checkresult.cpp @@ -120,6 +121,8 @@ add_boost_test(base base_type/assign base_type/byname base_type/instantiate + base_utility/comparepasswords_works + base_utility/comparepasswords_issafe base_value/scalar base_value/convert base_value/format diff --git a/test/base-utility.cpp b/test/base-utility.cpp new file mode 100644 index 000000000..fdc1a17d2 --- /dev/null +++ b/test/base-utility.cpp @@ -0,0 +1,70 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#include "base/utility.hpp" +#include +#include + +using namespace icinga; + +BOOST_AUTO_TEST_SUITE(base_utility) + +BOOST_AUTO_TEST_CASE(comparepasswords_works) +{ + BOOST_CHECK(Utility::ComparePasswords("", "")); + + BOOST_CHECK(!Utility::ComparePasswords("x", "")); + BOOST_CHECK(!Utility::ComparePasswords("", "x")); + + BOOST_CHECK(Utility::ComparePasswords("x", "x")); + BOOST_CHECK(!Utility::ComparePasswords("x", "y")); + + BOOST_CHECK(Utility::ComparePasswords("abcd", "abcd")); + BOOST_CHECK(!Utility::ComparePasswords("abc", "abcd")); + BOOST_CHECK(!Utility::ComparePasswords("abcde", "abcd")); +} + +BOOST_AUTO_TEST_CASE(comparepasswords_issafe) +{ + using std::chrono::duration_cast; + using std::chrono::microseconds; + using std::chrono::steady_clock; + + String a, b; + + a.Append(200000001, 'a'); + b.Append(200000002, 'b'); + + auto start1 (steady_clock::now()); + + Utility::ComparePasswords(a, a); + + auto duration1 (steady_clock::now() - start1); + + auto start2 (steady_clock::now()); + + Utility::ComparePasswords(a, b); + + auto duration2 (steady_clock::now() - start2); + + double diff = (double)duration_cast(duration1).count() / (double)duration_cast(duration2).count(); + BOOST_CHECK(0.9 <= diff && diff <= 1.1); +} + +BOOST_AUTO_TEST_SUITE_END() From ab7a799369b73ab1f46f35169e0110e2479cd567 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 22 Feb 2019 15:53:38 +0100 Subject: [PATCH 0503/1162] Implement ReloadTimeout constant and wait for enqueued checks on Stop() --- doc/17-language-reference.md | 1 + lib/base/application.cpp | 17 ++++++++++++++--- lib/base/configuration.cpp | 11 +++++++++++ lib/base/configuration.hpp | 4 ++++ lib/base/configuration.ti | 5 +++++ lib/checker/checkercomponent.cpp | 29 ++++++++++++++++++++++++++--- lib/remote/configpackageutility.cpp | 2 +- 7 files changed, 62 insertions(+), 7 deletions(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 039e3ad31..775684a1a 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -440,6 +440,7 @@ Constant | Description --------------------|------------------- Vars |**Read-write.** Contains a dictionary with global custom attributes. Not set by default. NodeName |**Read-write.** Contains the cluster node name. Set to the local hostname by default. +ReloadTimeout |**Read-write.** Defines the reload timeout for child processes. Defaults to `300s`. Environment |**Read-write.** The name of the Icinga environment. Included in the SNI host name for outbound connections. Not set by default. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Set in the Icinga 2 sysconfig. diff --git a/lib/base/application.cpp b/lib/base/application.cpp index df93710b7..62ed10cc5 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -77,6 +77,14 @@ void Application::OnConfigLoaded() ASSERT(m_Instance == nullptr); m_Instance = this; + + String reloadTimeout; + + if (ScriptGlobal::Exists("ReloadTimeout")) + reloadTimeout = ScriptGlobal::Get("ReloadTimeout"); + + if (!reloadTimeout.IsEmpty()) + Configuration::ReloadTimeout = Convert::ToDouble(reloadTimeout); } /** @@ -401,8 +409,6 @@ static void ReloadProcessCallback(const ProcessResult& pr) pid_t Application::StartReloadProcess() { - Log(LogInformation, "Application", "Got reload command: Starting new instance."); - // prepare arguments ArrayData args; args.push_back(GetExePath(m_ArgV[0])); @@ -422,9 +428,14 @@ pid_t Application::StartReloadProcess() #endif /* _WIN32 */ Process::Ptr process = new Process(Process::PrepareCommand(new Array(std::move(args)))); - process->SetTimeout(300); + process->SetTimeout(Configuration::ReloadTimeout); process->Run(&ReloadProcessCallback); + Log(LogInformation, "Application") + << "Got reload command: Started new instance with PID '" + << (unsigned long)(process->GetPID()) << "' (timeout is " + << Configuration::ReloadTimeout << "s)."; + return process->GetPID(); } diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp index 0103028de..c22b2f46b 100644 --- a/lib/base/configuration.cpp +++ b/lib/base/configuration.cpp @@ -42,6 +42,7 @@ String Configuration::PidPath; String Configuration::PkgDataDir; String Configuration::PrefixDir; String Configuration::ProgramData; +double Configuration::ReloadTimeout{300}; int Configuration::RLimitFiles; int Configuration::RLimitProcesses; int Configuration::RLimitStack; @@ -240,6 +241,16 @@ void Configuration::SetProgramData(const String& val, bool suppress_events, cons HandleUserWrite("ProgramData", &Configuration::ProgramData, val, m_ReadOnly); } +double Configuration::GetReloadTimeout() const +{ + return Configuration::ReloadTimeout; +} + +void Configuration::SetReloadTimeout(double val, bool suppress_events, const Value& cookie) +{ + HandleUserWrite("ReloadTimeout", &Configuration::ReloadTimeout, val, m_ReadOnly); +} + int Configuration::GetRLimitFiles() const { return Configuration::RLimitFiles; diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp index 96ab2726f..694a02a8c 100644 --- a/lib/base/configuration.hpp +++ b/lib/base/configuration.hpp @@ -87,6 +87,9 @@ public: String GetProgramData() const override; void SetProgramData(const String& value, bool suppress_events = false, const Value& cookie = Empty) override; + double GetReloadTimeout() const override; + void SetReloadTimeout(double value, bool suppress_events = false, const Value& cookie = Empty) override; + int GetRLimitFiles() const override; void SetRLimitFiles(int value, bool suppress_events = false, const Value& cookie = Empty) override; @@ -147,6 +150,7 @@ public: static String PkgDataDir; static String PrefixDir; static String ProgramData; + static double ReloadTimeout; static int RLimitFiles; static int RLimitProcesses; static int RLimitStack; diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti index 22f121411..356c7fa6b 100644 --- a/lib/base/configuration.ti +++ b/lib/base/configuration.ti @@ -111,6 +111,11 @@ abstract class Configuration set; }; + [config, no_storage, virtual] double ReloadTimeout { + get; + set; + }; + [config, no_storage, virtual] int RLimitFiles { get; set; diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index cde975b72..31bf2b20f 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -84,18 +84,41 @@ void CheckerComponent::Start(bool runtimeCreated) void CheckerComponent::Stop(bool runtimeRemoved) { - Log(LogInformation, "CheckerComponent") - << "'" << GetName() << "' stopped."; - { boost::mutex::scoped_lock lock(m_Mutex); m_Stopped = true; m_CV.notify_all(); } + double wait = 0.0; + + while (GetPendingCheckables() > 0) { + Log(LogDebug, "CheckerComponent") + << "Waiting for running checks (" << GetPendingCheckables() + << ") to finish. Waited for " << wait << " seconds now."; + + Utility::Sleep(0.1); + wait += 0.1; + + /* Pick a timeout slightly shorther than the process reload timeout. */ + double waitMax = Configuration::ReloadTimeout - 30; + if (waitMax <= 0) + waitMax = 1; + + if (wait > waitMax) { + Log(LogWarning, "CheckerComponent") + << "Checks running too long for " << wait + << " seconds, hard shutdown before reload timeout: " << Configuration::ReloadTimeout << "."; + break; + } + } + m_ResultTimer->Stop(); m_Thread.join(); + Log(LogInformation, "CheckerComponent") + << "'" << GetName() << "' stopped."; + ObjectImpl::Stop(runtimeRemoved); } diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 3b15724d3..d103b413a 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -235,7 +235,7 @@ void ConfigPackageUtility::AsyncTryActivateStage(const String& packageName, cons args->Add("ActiveStageOverride=" + packageName + ":" + stageName); Process::Ptr process = new Process(Process::PrepareCommand(args)); - process->SetTimeout(300); + process->SetTimeout(Configuration::ReloadTimeout); process->Run(std::bind(&TryActivateStageCallback, _1, packageName, stageName, reload)); } From 82c0197aae9ae11b820e32a4561dca68b9769081 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 20 Feb 2019 13:56:15 +0100 Subject: [PATCH 0504/1162] Activate downtimes before any checkable object (cherry picked from commit 7936a147ba82ce7e19de43ccb5f4c830edd8d235) --- lib/icinga/downtime.ti | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index fe80e0e77..d2880421f 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -37,6 +37,8 @@ public: class Downtime : ConfigObject < DowntimeNameComposer { + activation_priority -10; + load_after Host; load_after Service; From f98e40d880ca7886b4dad475e041b0e8825c8ba3 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Feb 2019 11:37:07 +0100 Subject: [PATCH 0505/1162] Secure ApiUser::GetByAuthHeader() against timing attacks (cherry picked from commit 9558ebc0f46febc7692bbb65394708b78b276d46) --- lib/base/utility.cpp | 36 ++++++++++++++++++++++++++++++++++++ lib/base/utility.hpp | 2 ++ lib/remote/apiuser.cpp | 3 ++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index cf8bc588f..bf50159e5 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -26,6 +26,7 @@ #include "base/utility.hpp" #include "base/json.hpp" #include "base/objectlock.hpp" +#include #include #include #include @@ -1949,3 +1950,38 @@ String Utility::GetFromEnvironment(const String& env) return String(); #endif /* _WIN32 */ } + +/** + * Compare the password entered by a client with the actual password. + * The comparision is safe against timing attacks. + */ +bool Utility::ComparePasswords(const String& enteredPassword, const String& actualPassword) +{ + volatile const char * volatile enteredPasswordCStr = enteredPassword.CStr(); + volatile size_t enteredPasswordLen = enteredPassword.GetLength(); + + volatile const char * volatile actualPasswordCStr = actualPassword.CStr(); + volatile size_t actualPasswordLen = actualPassword.GetLength(); + + volatile uint_fast8_t result = enteredPasswordLen == actualPasswordLen; + + if (result) { + auto cStr (actualPasswordCStr); + auto len (actualPasswordLen); + + actualPasswordCStr = cStr; + actualPasswordLen = len; + } else { + auto cStr (enteredPasswordCStr); + auto len (enteredPasswordLen); + + actualPasswordCStr = cStr; + actualPasswordLen = len; + } + + for (volatile size_t i = 0; i < enteredPasswordLen; ++i) { + result &= uint_fast8_t(enteredPasswordCStr[i] == actualPasswordCStr[i]); + } + + return result; +} diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index e75ebfefa..0adfc9e5c 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -149,6 +149,8 @@ public: static String GetFromEnvironment(const String& env); + static bool ComparePasswords(const String& enteredPassword, const String& actualPassword); + #ifdef I2_DEBUG static void SetTime(double); static void IncrementTime(double); diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index 346aadbef..320935a07 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -22,6 +22,7 @@ #include "base/configtype.hpp" #include "base/base64.hpp" #include "base/tlsutility.hpp" +#include "base/utility.hpp" using namespace icinga; @@ -63,7 +64,7 @@ ApiUser::Ptr ApiUser::GetByAuthHeader(const String& auth_header) */ if (!user || password.IsEmpty()) return nullptr; - else if (user && user->GetPassword() != password) + else if (user && !Utility::ComparePasswords(password, user->GetPassword())) return nullptr; return user; From a4f774aa9487d90278ad5596dc4f1b8cce52ed23 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 22 Feb 2019 16:58:26 +0100 Subject: [PATCH 0506/1162] Test Utility::ComparePasswords() (cherry picked from commit 1b00331a88c396ab8c94188855074ed907a5bd66) --- test/CMakeLists.txt | 3 ++ test/base-utility.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 test/base-utility.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c78f2732d..714d6a768 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -36,6 +36,7 @@ set(base_test_SOURCES base-string.cpp base-timer.cpp base-type.cpp + base-utility.cpp base-value.cpp config-ops.cpp icinga-checkresult.cpp @@ -120,6 +121,8 @@ add_boost_test(base base_type/assign base_type/byname base_type/instantiate + base_utility/comparepasswords_works + base_utility/comparepasswords_issafe base_value/scalar base_value/convert base_value/format diff --git a/test/base-utility.cpp b/test/base-utility.cpp new file mode 100644 index 000000000..fdc1a17d2 --- /dev/null +++ b/test/base-utility.cpp @@ -0,0 +1,70 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2018 Icinga Development Team (https://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. * + ******************************************************************************/ + +#include "base/utility.hpp" +#include +#include + +using namespace icinga; + +BOOST_AUTO_TEST_SUITE(base_utility) + +BOOST_AUTO_TEST_CASE(comparepasswords_works) +{ + BOOST_CHECK(Utility::ComparePasswords("", "")); + + BOOST_CHECK(!Utility::ComparePasswords("x", "")); + BOOST_CHECK(!Utility::ComparePasswords("", "x")); + + BOOST_CHECK(Utility::ComparePasswords("x", "x")); + BOOST_CHECK(!Utility::ComparePasswords("x", "y")); + + BOOST_CHECK(Utility::ComparePasswords("abcd", "abcd")); + BOOST_CHECK(!Utility::ComparePasswords("abc", "abcd")); + BOOST_CHECK(!Utility::ComparePasswords("abcde", "abcd")); +} + +BOOST_AUTO_TEST_CASE(comparepasswords_issafe) +{ + using std::chrono::duration_cast; + using std::chrono::microseconds; + using std::chrono::steady_clock; + + String a, b; + + a.Append(200000001, 'a'); + b.Append(200000002, 'b'); + + auto start1 (steady_clock::now()); + + Utility::ComparePasswords(a, a); + + auto duration1 (steady_clock::now() - start1); + + auto start2 (steady_clock::now()); + + Utility::ComparePasswords(a, b); + + auto duration2 (steady_clock::now() - start2); + + double diff = (double)duration_cast(duration1).count() / (double)duration_cast(duration2).count(); + BOOST_CHECK(0.9 <= diff && diff <= 1.1); +} + +BOOST_AUTO_TEST_SUITE_END() From 710e4fa55e919032bd3b45c774130e1f938d3f81 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 13:40:58 +0100 Subject: [PATCH 0507/1162] Fix formatting in development docs --- doc/21-development.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index 01d82653b..b36d61c41 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1435,39 +1435,39 @@ icinga2 daemon Icinga 2 can be started as a daemon using the provided init script: ``` -# /etc/init.d/icinga2 +/etc/init.d/icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} ``` -### Systemd +#### Systemd If your distribution uses Systemd: ``` -# systemctl {start|stop|reload|status|enable|disable} icinga2 +systemctl {start|stop|reload|status|enable|disable} icinga2 ``` In case the distribution is running Systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. -### openrc +#### openrc Or if your distribution uses openrc (like Alpine): ``` -# rc-service icinga2 +rc-service icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} - ``` +``` Note: the openrc's init.d is not shipped by default. A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. Those few steps can be followed: ``` -# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd -# mv icinga2.initd /etc/init.d/icinga2 -# chmod +x /etc/init.d/icinga2 +wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd +mv icinga2.initd /etc/init.d/icinga2 +chmod +x /etc/init.d/icinga2 ``` Icinga 2 reads a single configuration file which is used to specify all From 14ef7cbc1f146e985724cbce3bfe505470cabd93 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 13:40:58 +0100 Subject: [PATCH 0508/1162] Fix formatting in development docs (cherry picked from commit 710e4fa55e919032bd3b45c774130e1f938d3f81) --- doc/21-development.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/21-development.md b/doc/21-development.md index d26c8dbae..e95307207 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1435,39 +1435,39 @@ icinga2 daemon Icinga 2 can be started as a daemon using the provided init script: ``` -# /etc/init.d/icinga2 +/etc/init.d/icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} ``` -### Systemd +#### Systemd If your distribution uses Systemd: ``` -# systemctl {start|stop|reload|status|enable|disable} icinga2 +systemctl {start|stop|reload|status|enable|disable} icinga2 ``` In case the distribution is running Systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. -### openrc +#### openrc Or if your distribution uses openrc (like Alpine): ``` -# rc-service icinga2 +rc-service icinga2 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} - ``` +``` Note: the openrc's init.d is not shipped by default. A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup. Those few steps can be followed: ``` -# wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd -# mv icinga2.initd /etc/init.d/icinga2 -# chmod +x /etc/init.d/icinga2 +wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd +mv icinga2.initd /etc/init.d/icinga2 +chmod +x /etc/init.d/icinga2 ``` Icinga 2 reads a single configuration file which is used to specify all From c1fedab7aea73f6aa9c9357c54c409665239d698 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 7 Jan 2019 15:59:24 +0100 Subject: [PATCH 0509/1162] Dynamically print current copyright year in `--version` output --- icinga-app/icinga.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index e8d3f5bf3..ce3be0ef1 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -543,7 +543,8 @@ static int Main() } if (vm.count("version")) { - std::cout << "Copyright (c) 2012-2018 Icinga Development Team (https://icinga.com/)" << std::endl + std::cout << "Copyright (c) 2012-" << Utility::FormatDateTime("%Y", Utility::GetTime()) + << " Icinga GmbH (https://icinga.com/)" << std::endl << "License GPLv2+: GNU GPL version 2 or later " << std::endl << "This is free software: you are free to change and redistribute it." << std::endl << "There is NO WARRANTY, to the extent permitted by law."; From d14a88235d410860cb8894bfc8da53c647a841ea Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 14:48:22 +0100 Subject: [PATCH 0510/1162] Replace Copyright header with a short version, part I CLion -> replace in path --- icinga-app/icinga.cpp | 19 +------------------ icinga-installer/icinga-installer.cpp | 19 +------------------ itl/command-icinga.conf | 19 +------------------ itl/command-nscp-local.conf | 19 +------------------ itl/command-plugins-manubulon.conf | 19 +------------------ itl/command-plugins-windows.conf | 19 +------------------ itl/command-plugins.conf | 19 +------------------ itl/hangman | 19 +------------------ itl/itl | 19 +------------------ itl/manubulon | 19 +------------------ itl/nscp | 19 +------------------ itl/plugins | 19 +------------------ itl/plugins-contrib | 19 +------------------ itl/plugins-contrib.d/big-data.conf | 19 +------------------ itl/plugins-contrib.d/databases.conf | 19 +------------------ itl/plugins-contrib.d/hardware.conf | 19 +------------------ itl/plugins-contrib.d/icingacli.conf | 19 +------------------ itl/plugins-contrib.d/ipmi.conf | 19 +------------------ itl/plugins-contrib.d/logmanagement.conf | 19 +------------------ itl/plugins-contrib.d/metrics.conf | 19 +------------------ itl/plugins-contrib.d/network-components.conf | 19 +------------------ itl/plugins-contrib.d/network-services.conf | 19 +------------------ itl/plugins-contrib.d/operating-system.conf | 19 +------------------ itl/plugins-contrib.d/storage.conf | 19 +------------------ itl/plugins-contrib.d/virtualization.conf | 19 +------------------ itl/plugins-contrib.d/vmware.conf | 19 +------------------ itl/plugins-contrib.d/web.conf | 19 +------------------ itl/windows-plugins | 19 +------------------ lib/base/application-environment.cpp | 19 +------------------ lib/base/application-version.cpp | 19 +------------------ lib/base/application.cpp | 19 +------------------ lib/base/application.hpp | 19 +------------------ lib/base/application.ti | 19 +------------------ lib/base/array-script.cpp | 19 +------------------ lib/base/array.cpp | 19 +------------------ lib/base/array.hpp | 19 +------------------ lib/base/base64.cpp | 19 +------------------ lib/base/base64.hpp | 19 +------------------ lib/base/boolean-script.cpp | 19 +------------------ lib/base/boolean.cpp | 19 +------------------ lib/base/boolean.hpp | 19 +------------------ lib/base/configobject-script.cpp | 19 +------------------ lib/base/configobject.cpp | 19 +------------------ lib/base/configobject.hpp | 19 +------------------ lib/base/configobject.ti | 19 +------------------ lib/base/configtype.cpp | 19 +------------------ lib/base/configtype.hpp | 19 +------------------ lib/base/configuration.cpp | 19 +------------------ lib/base/configuration.hpp | 19 +------------------ lib/base/configuration.ti | 19 +------------------ lib/base/configwriter.cpp | 19 +------------------ lib/base/configwriter.hpp | 19 +------------------ lib/base/console.cpp | 19 +------------------ lib/base/console.hpp | 19 +------------------ lib/base/context.cpp | 19 +------------------ lib/base/context.hpp | 19 +------------------ lib/base/convert.cpp | 19 +------------------ lib/base/convert.hpp | 19 +------------------ lib/base/datetime-script.cpp | 19 +------------------ lib/base/datetime.cpp | 19 +------------------ lib/base/datetime.hpp | 19 +------------------ lib/base/datetime.ti | 19 +------------------ lib/base/debug.hpp | 19 +------------------ lib/base/debuginfo.cpp | 19 +------------------ lib/base/debuginfo.hpp | 19 +------------------ lib/base/defer.hpp | 19 +------------------ lib/base/dependencygraph.cpp | 19 +------------------ lib/base/dependencygraph.hpp | 19 +------------------ lib/base/dictionary-script.cpp | 19 +------------------ lib/base/dictionary.cpp | 19 +------------------ lib/base/dictionary.hpp | 19 +------------------ lib/base/exception.cpp | 19 +------------------ lib/base/exception.hpp | 19 +------------------ lib/base/fifo.cpp | 19 +------------------ lib/base/fifo.hpp | 19 +------------------ lib/base/filelogger.cpp | 19 +------------------ lib/base/filelogger.hpp | 19 +------------------ lib/base/filelogger.ti | 19 +------------------ lib/base/function-script.cpp | 19 +------------------ lib/base/function.cpp | 19 +------------------ lib/base/function.hpp | 19 +------------------ lib/base/function.ti | 19 +------------------ lib/base/functionwrapper.hpp | 19 +------------------ lib/base/i2-base.hpp | 19 +------------------ lib/base/initialize.cpp | 19 +------------------ lib/base/initialize.hpp | 19 +------------------ lib/base/json-script.cpp | 19 +------------------ lib/base/json.cpp | 19 +------------------ lib/base/json.hpp | 19 +------------------ lib/base/library.cpp | 19 +------------------ lib/base/library.hpp | 19 +------------------ lib/base/loader.cpp | 19 +------------------ lib/base/loader.hpp | 19 +------------------ lib/base/logger.cpp | 19 +------------------ lib/base/logger.hpp | 19 +------------------ lib/base/logger.ti | 19 +------------------ lib/base/math-script.cpp | 19 +------------------ lib/base/namespace-script.cpp | 19 +------------------ lib/base/namespace.cpp | 19 +------------------ lib/base/namespace.hpp | 19 +------------------ lib/base/netstring.cpp | 19 +------------------ lib/base/netstring.hpp | 19 +------------------ lib/base/networkstream.cpp | 19 +------------------ lib/base/networkstream.hpp | 19 +------------------ lib/base/number-script.cpp | 19 +------------------ lib/base/number.cpp | 19 +------------------ lib/base/number.hpp | 19 +------------------ lib/base/object-packer.cpp | 19 +------------------ lib/base/object-packer.hpp | 19 +------------------ lib/base/object-script.cpp | 19 +------------------ lib/base/object.cpp | 19 +------------------ lib/base/object.hpp | 19 +------------------ lib/base/objectlock.cpp | 19 +------------------ lib/base/objectlock.hpp | 19 +------------------ lib/base/objecttype.cpp | 19 +------------------ lib/base/objecttype.hpp | 19 +------------------ lib/base/perfdatavalue.cpp | 19 +------------------ lib/base/perfdatavalue.hpp | 19 +------------------ lib/base/perfdatavalue.ti | 19 +------------------ lib/base/primitivetype.cpp | 19 +------------------ lib/base/primitivetype.hpp | 19 +------------------ lib/base/process.cpp | 19 +------------------ lib/base/process.hpp | 19 +------------------ lib/base/reference-script.cpp | 19 +------------------ lib/base/reference.cpp | 19 +------------------ lib/base/reference.hpp | 19 +------------------ lib/base/registry.hpp | 19 +------------------ lib/base/ringbuffer.cpp | 19 +------------------ lib/base/ringbuffer.hpp | 19 +------------------ lib/base/scriptframe.cpp | 19 +------------------ lib/base/scriptframe.hpp | 19 +------------------ lib/base/scriptglobal.cpp | 19 +------------------ lib/base/scriptglobal.hpp | 19 +------------------ lib/base/scriptutils.cpp | 19 +------------------ lib/base/scriptutils.hpp | 19 +------------------ lib/base/serializer.cpp | 19 +------------------ lib/base/serializer.hpp | 19 +------------------ lib/base/singleton.hpp | 19 +------------------ lib/base/socket.cpp | 19 +------------------ lib/base/socket.hpp | 19 +------------------ lib/base/socketevents-epoll.cpp | 19 +------------------ lib/base/socketevents-poll.cpp | 19 +------------------ lib/base/socketevents.cpp | 19 +------------------ lib/base/socketevents.hpp | 19 +------------------ lib/base/stacktrace.cpp | 19 +------------------ lib/base/stacktrace.hpp | 19 +------------------ lib/base/statsfunction.hpp | 19 +------------------ lib/base/stdiostream.cpp | 19 +------------------ lib/base/stdiostream.hpp | 19 +------------------ lib/base/stream.cpp | 19 +------------------ lib/base/stream.hpp | 19 +------------------ lib/base/streamlogger.cpp | 19 +------------------ lib/base/streamlogger.hpp | 19 +------------------ lib/base/streamlogger.ti | 19 +------------------ lib/base/string-script.cpp | 19 +------------------ lib/base/string.cpp | 19 +------------------ lib/base/string.hpp | 19 +------------------ lib/base/stringbuilder.cpp | 19 +------------------ lib/base/stringbuilder.hpp | 19 +------------------ lib/base/sysloglogger.cpp | 19 +------------------ lib/base/sysloglogger.hpp | 19 +------------------ lib/base/sysloglogger.ti | 19 +------------------ lib/base/tcpsocket.cpp | 19 +------------------ lib/base/tcpsocket.hpp | 19 +------------------ lib/base/threadpool.cpp | 19 +------------------ lib/base/threadpool.hpp | 19 +------------------ lib/base/timer.cpp | 19 +------------------ lib/base/timer.hpp | 19 +------------------ lib/base/tlsstream.cpp | 19 +------------------ lib/base/tlsstream.hpp | 19 +------------------ lib/base/tlsutility.cpp | 19 +------------------ lib/base/tlsutility.hpp | 19 +------------------ lib/base/type.cpp | 19 +------------------ lib/base/type.hpp | 19 +------------------ lib/base/typetype-script.cpp | 19 +------------------ lib/base/unix.hpp | 19 +------------------ lib/base/unixsocket.cpp | 19 +------------------ lib/base/unixsocket.hpp | 19 +------------------ lib/base/utility.cpp | 19 +------------------ lib/base/utility.hpp | 19 +------------------ lib/base/value-operators.cpp | 19 +------------------ lib/base/value.cpp | 19 +------------------ lib/base/value.hpp | 19 +------------------ lib/base/win32.hpp | 19 +------------------ lib/base/workqueue.cpp | 19 +------------------ lib/base/workqueue.hpp | 19 +------------------ lib/checker/checkercomponent.cpp | 19 +------------------ lib/checker/checkercomponent.hpp | 19 +------------------ lib/checker/checkercomponent.ti | 19 +------------------ lib/cli/apisetupcommand.cpp | 19 +------------------ lib/cli/apisetupcommand.hpp | 19 +------------------ lib/cli/apisetuputility.cpp | 19 +------------------ lib/cli/apisetuputility.hpp | 19 +------------------ lib/cli/calistcommand.cpp | 19 +------------------ lib/cli/calistcommand.hpp | 19 +------------------ lib/cli/casigncommand.cpp | 19 +------------------ lib/cli/casigncommand.hpp | 19 +------------------ lib/cli/clicommand.cpp | 19 +------------------ lib/cli/clicommand.hpp | 19 +------------------ lib/cli/consolecommand.cpp | 19 +------------------ lib/cli/consolecommand.hpp | 19 +------------------ lib/cli/daemoncommand.cpp | 19 +------------------ lib/cli/daemoncommand.hpp | 19 +------------------ lib/cli/daemonutility.cpp | 19 +------------------ lib/cli/daemonutility.hpp | 19 +------------------ lib/cli/editline.hpp | 19 +------------------ lib/cli/featuredisablecommand.cpp | 19 +------------------ lib/cli/featuredisablecommand.hpp | 19 +------------------ lib/cli/featureenablecommand.cpp | 19 +------------------ lib/cli/featureenablecommand.hpp | 19 +------------------ lib/cli/featurelistcommand.cpp | 19 +------------------ lib/cli/featurelistcommand.hpp | 19 +------------------ lib/cli/featureutility.cpp | 19 +------------------ lib/cli/featureutility.hpp | 19 +------------------ lib/cli/i2-cli.hpp | 19 +------------------ lib/cli/internalsignalcommand.cpp | 19 +------------------ lib/cli/internalsignalcommand.hpp | 19 +------------------ lib/cli/nodesetupcommand.cpp | 19 +------------------ lib/cli/nodesetupcommand.hpp | 19 +------------------ lib/cli/nodeutility.cpp | 19 +------------------ lib/cli/nodeutility.hpp | 19 +------------------ lib/cli/nodewizardcommand.cpp | 19 +------------------ lib/cli/nodewizardcommand.hpp | 19 +------------------ lib/cli/objectlistcommand.cpp | 19 +------------------ lib/cli/objectlistcommand.hpp | 19 +------------------ lib/cli/objectlistutility.cpp | 19 +------------------ lib/cli/objectlistutility.hpp | 19 +------------------ lib/cli/pkinewcacommand.cpp | 19 +------------------ lib/cli/pkinewcacommand.hpp | 19 +------------------ lib/cli/pkinewcertcommand.cpp | 19 +------------------ lib/cli/pkinewcertcommand.hpp | 19 +------------------ lib/cli/pkirequestcommand.cpp | 19 +------------------ lib/cli/pkirequestcommand.hpp | 19 +------------------ lib/cli/pkisavecertcommand.cpp | 19 +------------------ lib/cli/pkisavecertcommand.hpp | 19 +------------------ lib/cli/pkisigncsrcommand.cpp | 19 +------------------ lib/cli/pkisigncsrcommand.hpp | 19 +------------------ lib/cli/pkiticketcommand.cpp | 19 +------------------ lib/cli/pkiticketcommand.hpp | 19 +------------------ lib/cli/troubleshootcommand.hpp | 19 +------------------ lib/cli/variablegetcommand.cpp | 19 +------------------ lib/cli/variablegetcommand.hpp | 19 +------------------ lib/cli/variablelistcommand.cpp | 19 +------------------ lib/cli/variablelistcommand.hpp | 19 +------------------ lib/cli/variableutility.cpp | 19 +------------------ lib/cli/variableutility.hpp | 19 +------------------ lib/compat/checkresultreader.cpp | 19 +------------------ lib/compat/checkresultreader.hpp | 19 +------------------ lib/compat/checkresultreader.ti | 19 +------------------ lib/compat/compatlogger.cpp | 19 +------------------ lib/compat/compatlogger.hpp | 19 +------------------ lib/compat/compatlogger.ti | 19 +------------------ lib/compat/externalcommandlistener.cpp | 19 +------------------ lib/compat/externalcommandlistener.hpp | 19 +------------------ lib/compat/externalcommandlistener.ti | 19 +------------------ lib/compat/statusdatawriter.cpp | 19 +------------------ lib/compat/statusdatawriter.hpp | 19 +------------------ lib/compat/statusdatawriter.ti | 19 +------------------ lib/config/activationcontext.cpp | 19 +------------------ lib/config/activationcontext.hpp | 19 +------------------ lib/config/applyrule.cpp | 19 +------------------ lib/config/applyrule.hpp | 19 +------------------ lib/config/configcompiler.cpp | 19 +------------------ lib/config/configcompiler.hpp | 19 +------------------ lib/config/configcompilercontext.cpp | 19 +------------------ lib/config/configcompilercontext.hpp | 19 +------------------ lib/config/configfragment.hpp | 19 +------------------ lib/config/configitem.cpp | 19 +------------------ lib/config/configitem.hpp | 19 +------------------ lib/config/configitembuilder.cpp | 19 +------------------ lib/config/configitembuilder.hpp | 19 +------------------ lib/config/expression.cpp | 19 +------------------ lib/config/expression.hpp | 19 +------------------ lib/config/i2-config.hpp | 19 +------------------ lib/config/objectrule.cpp | 19 +------------------ lib/config/objectrule.hpp | 19 +------------------ lib/config/vmops.hpp | 19 +------------------ lib/db_ido/commanddbobject.cpp | 19 +------------------ lib/db_ido/commanddbobject.hpp | 19 +------------------ lib/db_ido/db_ido-itl.conf | 19 +------------------ lib/db_ido/dbconnection.cpp | 19 +------------------ lib/db_ido/dbconnection.hpp | 19 +------------------ lib/db_ido/dbconnection.ti | 19 +------------------ lib/db_ido/dbevents.cpp | 19 +------------------ lib/db_ido/dbevents.hpp | 19 +------------------ lib/db_ido/dbobject.cpp | 19 +------------------ lib/db_ido/dbobject.hpp | 19 +------------------ lib/db_ido/dbquery.cpp | 19 +------------------ lib/db_ido/dbquery.hpp | 19 +------------------ lib/db_ido/dbreference.cpp | 19 +------------------ lib/db_ido/dbreference.hpp | 19 +------------------ lib/db_ido/dbtype.cpp | 19 +------------------ lib/db_ido/dbtype.hpp | 19 +------------------ lib/db_ido/dbvalue.cpp | 19 +------------------ lib/db_ido/dbvalue.hpp | 19 +------------------ lib/db_ido/endpointdbobject.cpp | 19 +------------------ lib/db_ido/endpointdbobject.hpp | 19 +------------------ lib/db_ido/hostdbobject.cpp | 19 +------------------ lib/db_ido/hostdbobject.hpp | 19 +------------------ lib/db_ido/hostgroupdbobject.cpp | 19 +------------------ lib/db_ido/hostgroupdbobject.hpp | 19 +------------------ lib/db_ido/i2-db_ido.hpp | 19 +------------------ lib/db_ido/idochecktask.cpp | 19 +------------------ lib/db_ido/idochecktask.hpp | 19 +------------------ lib/db_ido/servicedbobject.cpp | 19 +------------------ lib/db_ido/servicedbobject.hpp | 19 +------------------ lib/db_ido/servicegroupdbobject.cpp | 19 +------------------ lib/db_ido/servicegroupdbobject.hpp | 19 +------------------ lib/db_ido/timeperioddbobject.cpp | 19 +------------------ lib/db_ido/timeperioddbobject.hpp | 19 +------------------ lib/db_ido/userdbobject.cpp | 19 +------------------ lib/db_ido/userdbobject.hpp | 19 +------------------ lib/db_ido/usergroupdbobject.cpp | 19 +------------------ lib/db_ido/usergroupdbobject.hpp | 19 +------------------ lib/db_ido/zonedbobject.cpp | 19 +------------------ lib/db_ido/zonedbobject.hpp | 19 +------------------ lib/db_ido_mysql/idomysqlconnection.cpp | 19 +------------------ lib/db_ido_mysql/idomysqlconnection.hpp | 19 +------------------ lib/db_ido_mysql/idomysqlconnection.ti | 19 +------------------ lib/db_ido_pgsql/idopgsqlconnection.cpp | 19 +------------------ lib/db_ido_pgsql/idopgsqlconnection.hpp | 19 +------------------ lib/db_ido_pgsql/idopgsqlconnection.ti | 19 +------------------ lib/icinga/apiactions.cpp | 19 +------------------ lib/icinga/apiactions.hpp | 19 +------------------ lib/icinga/apievents.cpp | 19 +------------------ lib/icinga/apievents.hpp | 19 +------------------ lib/icinga/checkable-check.cpp | 19 +------------------ lib/icinga/checkable-comment.cpp | 19 +------------------ lib/icinga/checkable-dependency.cpp | 19 +------------------ lib/icinga/checkable-downtime.cpp | 19 +------------------ lib/icinga/checkable-event.cpp | 19 +------------------ lib/icinga/checkable-flapping.cpp | 19 +------------------ lib/icinga/checkable-notification.cpp | 19 +------------------ lib/icinga/checkable-script.cpp | 19 +------------------ lib/icinga/checkable.cpp | 19 +------------------ lib/icinga/checkable.hpp | 19 +------------------ lib/icinga/checkable.ti | 19 +------------------ lib/icinga/checkcommand.cpp | 19 +------------------ lib/icinga/checkcommand.hpp | 19 +------------------ lib/icinga/checkcommand.ti | 19 +------------------ lib/icinga/checkresult.cpp | 19 +------------------ lib/icinga/checkresult.hpp | 19 +------------------ lib/icinga/checkresult.ti | 19 +------------------ lib/icinga/cib.cpp | 19 +------------------ lib/icinga/cib.hpp | 19 +------------------ lib/icinga/clusterevents-check.cpp | 19 +------------------ lib/icinga/clusterevents.cpp | 19 +------------------ lib/icinga/clusterevents.hpp | 19 +------------------ lib/icinga/command.cpp | 19 +------------------ lib/icinga/command.hpp | 19 +------------------ lib/icinga/command.ti | 19 +------------------ lib/icinga/comment.cpp | 19 +------------------ lib/icinga/comment.hpp | 19 +------------------ lib/icinga/comment.ti | 19 +------------------ lib/icinga/compatutility.cpp | 19 +------------------ lib/icinga/compatutility.hpp | 19 +------------------ lib/icinga/customvarobject.cpp | 19 +------------------ lib/icinga/customvarobject.hpp | 19 +------------------ lib/icinga/customvarobject.ti | 19 +------------------ lib/icinga/dependency-apply.cpp | 19 +------------------ lib/icinga/dependency.cpp | 19 +------------------ lib/icinga/dependency.hpp | 19 +------------------ lib/icinga/dependency.ti | 19 +------------------ lib/icinga/downtime.cpp | 19 +------------------ lib/icinga/downtime.hpp | 19 +------------------ lib/icinga/downtime.ti | 19 +------------------ lib/icinga/eventcommand.cpp | 19 +------------------ lib/icinga/eventcommand.hpp | 19 +------------------ lib/icinga/eventcommand.ti | 19 +------------------ lib/icinga/externalcommandprocessor.cpp | 19 +------------------ lib/icinga/externalcommandprocessor.hpp | 19 +------------------ lib/icinga/host.cpp | 19 +------------------ lib/icinga/host.hpp | 19 +------------------ lib/icinga/host.ti | 19 +------------------ lib/icinga/hostgroup.cpp | 19 +------------------ lib/icinga/hostgroup.hpp | 19 +------------------ lib/icinga/hostgroup.ti | 19 +------------------ lib/icinga/i2-icinga.hpp | 19 +------------------ lib/icinga/icinga-itl.conf | 19 +------------------ lib/icinga/icingaapplication.cpp | 19 +------------------ lib/icinga/icingaapplication.hpp | 19 +------------------ lib/icinga/icingaapplication.ti | 19 +------------------ lib/icinga/legacytimeperiod.cpp | 19 +------------------ lib/icinga/legacytimeperiod.hpp | 19 +------------------ lib/icinga/macroprocessor.cpp | 19 +------------------ lib/icinga/macroprocessor.hpp | 19 +------------------ lib/icinga/macroresolver.hpp | 19 +------------------ lib/icinga/notification-apply.cpp | 19 +------------------ lib/icinga/notification.cpp | 19 +------------------ lib/icinga/notification.hpp | 19 +------------------ lib/icinga/notification.ti | 19 +------------------ lib/icinga/notificationcommand.cpp | 19 +------------------ lib/icinga/notificationcommand.hpp | 19 +------------------ lib/icinga/notificationcommand.ti | 19 +------------------ lib/icinga/objectutils.cpp | 19 +------------------ lib/icinga/objectutils.hpp | 19 +------------------ lib/icinga/pluginutility.cpp | 19 +------------------ lib/icinga/pluginutility.hpp | 19 +------------------ lib/icinga/scheduleddowntime-apply.cpp | 19 +------------------ lib/icinga/scheduleddowntime.cpp | 19 +------------------ lib/icinga/scheduleddowntime.hpp | 19 +------------------ lib/icinga/scheduleddowntime.ti | 19 +------------------ lib/icinga/service-apply.cpp | 19 +------------------ lib/icinga/service.cpp | 19 +------------------ lib/icinga/service.hpp | 19 +------------------ lib/icinga/service.ti | 19 +------------------ lib/icinga/servicegroup.cpp | 19 +------------------ lib/icinga/servicegroup.hpp | 19 +------------------ lib/icinga/servicegroup.ti | 19 +------------------ lib/icinga/timeperiod.cpp | 19 +------------------ lib/icinga/timeperiod.hpp | 19 +------------------ lib/icinga/timeperiod.ti | 19 +------------------ lib/icinga/user.cpp | 19 +------------------ lib/icinga/user.hpp | 19 +------------------ lib/icinga/user.ti | 19 +------------------ lib/icinga/usergroup.cpp | 19 +------------------ lib/icinga/usergroup.hpp | 19 +------------------ lib/icinga/usergroup.ti | 19 +------------------ lib/livestatus/aggregator.cpp | 19 +------------------ lib/livestatus/aggregator.hpp | 19 +------------------ lib/livestatus/andfilter.cpp | 19 +------------------ lib/livestatus/andfilter.hpp | 19 +------------------ lib/livestatus/attributefilter.cpp | 19 +------------------ lib/livestatus/attributefilter.hpp | 19 +------------------ lib/livestatus/avgaggregator.cpp | 19 +------------------ lib/livestatus/avgaggregator.hpp | 19 +------------------ lib/livestatus/column.cpp | 19 +------------------ lib/livestatus/column.hpp | 19 +------------------ lib/livestatus/combinerfilter.cpp | 19 +------------------ lib/livestatus/combinerfilter.hpp | 19 +------------------ lib/livestatus/commandstable.cpp | 19 +------------------ lib/livestatus/commandstable.hpp | 19 +------------------ lib/livestatus/commentstable.cpp | 19 +------------------ lib/livestatus/commentstable.hpp | 19 +------------------ lib/livestatus/contactgroupstable.cpp | 19 +------------------ lib/livestatus/contactgroupstable.hpp | 19 +------------------ lib/livestatus/contactstable.cpp | 19 +------------------ lib/livestatus/contactstable.hpp | 19 +------------------ lib/livestatus/countaggregator.cpp | 19 +------------------ lib/livestatus/countaggregator.hpp | 19 +------------------ lib/livestatus/downtimestable.cpp | 19 +------------------ lib/livestatus/downtimestable.hpp | 19 +------------------ lib/livestatus/endpointstable.cpp | 19 +------------------ lib/livestatus/endpointstable.hpp | 19 +------------------ lib/livestatus/filter.hpp | 19 +------------------ lib/livestatus/historytable.hpp | 19 +------------------ lib/livestatus/hostgroupstable.cpp | 19 +------------------ lib/livestatus/hostgroupstable.hpp | 19 +------------------ lib/livestatus/hoststable.cpp | 19 +------------------ lib/livestatus/hoststable.hpp | 19 +------------------ lib/livestatus/i2-livestatus.hpp | 19 +------------------ lib/livestatus/invavgaggregator.cpp | 19 +------------------ lib/livestatus/invavgaggregator.hpp | 19 +------------------ lib/livestatus/invsumaggregator.cpp | 19 +------------------ lib/livestatus/invsumaggregator.hpp | 19 +------------------ lib/livestatus/livestatuslistener.cpp | 19 +------------------ lib/livestatus/livestatuslistener.hpp | 19 +------------------ lib/livestatus/livestatuslistener.ti | 19 +------------------ lib/livestatus/livestatuslogutility.cpp | 19 +------------------ lib/livestatus/livestatuslogutility.hpp | 19 +------------------ lib/livestatus/livestatusquery.cpp | 19 +------------------ lib/livestatus/livestatusquery.hpp | 19 +------------------ lib/livestatus/logtable.cpp | 19 +------------------ lib/livestatus/logtable.hpp | 19 +------------------ lib/livestatus/maxaggregator.cpp | 19 +------------------ lib/livestatus/maxaggregator.hpp | 19 +------------------ lib/livestatus/minaggregator.cpp | 19 +------------------ lib/livestatus/minaggregator.hpp | 19 +------------------ lib/livestatus/negatefilter.cpp | 19 +------------------ lib/livestatus/negatefilter.hpp | 19 +------------------ lib/livestatus/orfilter.cpp | 19 +------------------ lib/livestatus/orfilter.hpp | 19 +------------------ lib/livestatus/servicegroupstable.cpp | 19 +------------------ lib/livestatus/servicegroupstable.hpp | 19 +------------------ lib/livestatus/servicestable.cpp | 19 +------------------ lib/livestatus/servicestable.hpp | 19 +------------------ lib/livestatus/statehisttable.cpp | 19 +------------------ lib/livestatus/statehisttable.hpp | 19 +------------------ lib/livestatus/statustable.cpp | 19 +------------------ lib/livestatus/statustable.hpp | 19 +------------------ lib/livestatus/stdaggregator.cpp | 19 +------------------ lib/livestatus/stdaggregator.hpp | 19 +------------------ lib/livestatus/sumaggregator.cpp | 19 +------------------ lib/livestatus/sumaggregator.hpp | 19 +------------------ lib/livestatus/table.cpp | 19 +------------------ lib/livestatus/table.hpp | 19 +------------------ lib/livestatus/timeperiodstable.cpp | 19 +------------------ lib/livestatus/timeperiodstable.hpp | 19 +------------------ lib/livestatus/zonestable.cpp | 19 +------------------ lib/livestatus/zonestable.hpp | 19 +------------------ lib/methods/clusterchecktask.cpp | 19 +------------------ lib/methods/clusterchecktask.hpp | 19 +------------------ lib/methods/clusterzonechecktask.cpp | 19 +------------------ lib/methods/clusterzonechecktask.hpp | 19 +------------------ lib/methods/dummychecktask.cpp | 19 +------------------ lib/methods/dummychecktask.hpp | 19 +------------------ lib/methods/exceptionchecktask.cpp | 19 +------------------ lib/methods/exceptionchecktask.hpp | 19 +------------------ lib/methods/i2-methods.hpp | 19 +------------------ lib/methods/icingachecktask.cpp | 19 +------------------ lib/methods/icingachecktask.hpp | 19 +------------------ lib/methods/methods-itl.conf | 19 +------------------ lib/methods/nullchecktask.cpp | 19 +------------------ lib/methods/nullchecktask.hpp | 19 +------------------ lib/methods/nulleventtask.cpp | 19 +------------------ lib/methods/nulleventtask.hpp | 19 +------------------ lib/methods/pluginchecktask.cpp | 19 +------------------ lib/methods/pluginchecktask.hpp | 19 +------------------ lib/methods/plugineventtask.cpp | 19 +------------------ lib/methods/plugineventtask.hpp | 19 +------------------ lib/methods/pluginnotificationtask.cpp | 19 +------------------ lib/methods/pluginnotificationtask.hpp | 19 +------------------ lib/methods/randomchecktask.cpp | 19 +------------------ lib/methods/randomchecktask.hpp | 19 +------------------ lib/methods/timeperiodtask.cpp | 19 +------------------ lib/methods/timeperiodtask.hpp | 19 +------------------ lib/mysql_shim/mysqlinterface.cpp | 19 +------------------ lib/mysql_shim/mysqlinterface.hpp | 19 +------------------ lib/notification/notificationcomponent.cpp | 19 +------------------ lib/notification/notificationcomponent.hpp | 19 +------------------ lib/notification/notificationcomponent.ti | 19 +------------------ lib/perfdata/elasticsearchwriter.cpp | 19 +------------------ lib/perfdata/elasticsearchwriter.hpp | 19 +------------------ lib/perfdata/gelfwriter.cpp | 19 +------------------ lib/perfdata/gelfwriter.hpp | 19 +------------------ lib/perfdata/gelfwriter.ti | 19 +------------------ lib/perfdata/graphitewriter.cpp | 19 +------------------ lib/perfdata/graphitewriter.hpp | 19 +------------------ lib/perfdata/graphitewriter.ti | 19 +------------------ lib/perfdata/influxdbwriter.cpp | 19 +------------------ lib/perfdata/influxdbwriter.hpp | 19 +------------------ lib/perfdata/influxdbwriter.ti | 19 +------------------ lib/perfdata/opentsdbwriter.cpp | 19 +------------------ lib/perfdata/opentsdbwriter.hpp | 19 +------------------ lib/perfdata/opentsdbwriter.ti | 19 +------------------ lib/perfdata/perfdatawriter.cpp | 19 +------------------ lib/perfdata/perfdatawriter.hpp | 19 +------------------ lib/perfdata/perfdatawriter.ti | 19 +------------------ lib/pgsql_shim/pgsqlinterface.cpp | 19 +------------------ lib/pgsql_shim/pgsqlinterface.hpp | 19 +------------------ lib/remote/actionshandler.cpp | 19 +------------------ lib/remote/actionshandler.hpp | 19 +------------------ lib/remote/apiaction.cpp | 19 +------------------ lib/remote/apiaction.hpp | 19 +------------------ lib/remote/apiclient.cpp | 19 +------------------ lib/remote/apiclient.hpp | 19 +------------------ lib/remote/apifunction.cpp | 19 +------------------ lib/remote/apifunction.hpp | 19 +------------------ lib/remote/apilistener-configsync.cpp | 19 +------------------ lib/remote/apilistener-filesync.cpp | 19 +------------------ lib/remote/apilistener.cpp | 19 +------------------ lib/remote/apilistener.hpp | 19 +------------------ lib/remote/apilistener.ti | 19 +------------------ lib/remote/apiuser.cpp | 19 +------------------ lib/remote/apiuser.hpp | 19 +------------------ lib/remote/apiuser.ti | 19 +------------------ lib/remote/authority.cpp | 19 +------------------ lib/remote/configfileshandler.cpp | 19 +------------------ lib/remote/configfileshandler.hpp | 19 +------------------ lib/remote/configobjectutility.cpp | 19 +------------------ lib/remote/configobjectutility.hpp | 19 +------------------ lib/remote/configpackageshandler.cpp | 19 +------------------ lib/remote/configpackageshandler.hpp | 19 +------------------ lib/remote/configpackageutility.cpp | 19 +------------------ lib/remote/configpackageutility.hpp | 19 +------------------ lib/remote/configstageshandler.cpp | 19 +------------------ lib/remote/configstageshandler.hpp | 19 +------------------ lib/remote/consolehandler.cpp | 19 +------------------ lib/remote/consolehandler.hpp | 19 +------------------ lib/remote/createobjecthandler.cpp | 19 +------------------ lib/remote/createobjecthandler.hpp | 19 +------------------ lib/remote/deleteobjecthandler.cpp | 19 +------------------ lib/remote/deleteobjecthandler.hpp | 19 +------------------ lib/remote/endpoint.cpp | 19 +------------------ lib/remote/endpoint.hpp | 19 +------------------ lib/remote/endpoint.ti | 19 +------------------ lib/remote/eventqueue.cpp | 19 +------------------ lib/remote/eventqueue.hpp | 19 +------------------ lib/remote/eventshandler.cpp | 19 +------------------ lib/remote/eventshandler.hpp | 19 +------------------ lib/remote/filterutility.cpp | 19 +------------------ lib/remote/filterutility.hpp | 19 +------------------ lib/remote/httpchunkedencoding.cpp | 19 +------------------ lib/remote/httpchunkedencoding.hpp | 19 +------------------ lib/remote/httpclientconnection.cpp | 19 +------------------ lib/remote/httpclientconnection.hpp | 19 +------------------ lib/remote/httphandler.cpp | 19 +------------------ lib/remote/httphandler.hpp | 19 +------------------ lib/remote/httprequest.cpp | 19 +------------------ lib/remote/httprequest.hpp | 19 +------------------ lib/remote/httpresponse.cpp | 19 +------------------ lib/remote/httpresponse.hpp | 19 +------------------ lib/remote/httpserverconnection.cpp | 19 +------------------ lib/remote/httpserverconnection.hpp | 19 +------------------ lib/remote/httputility.cpp | 19 +------------------ lib/remote/httputility.hpp | 19 +------------------ lib/remote/i2-remote.hpp | 19 +------------------ lib/remote/infohandler.cpp | 19 +------------------ lib/remote/infohandler.hpp | 19 +------------------ lib/remote/jsonrpc.cpp | 19 +------------------ lib/remote/jsonrpc.hpp | 19 +------------------ lib/remote/jsonrpcconnection-heartbeat.cpp | 19 +------------------ lib/remote/jsonrpcconnection-pki.cpp | 19 +------------------ lib/remote/jsonrpcconnection.cpp | 19 +------------------ lib/remote/jsonrpcconnection.hpp | 19 +------------------ lib/remote/messageorigin.cpp | 19 +------------------ lib/remote/messageorigin.hpp | 19 +------------------ lib/remote/modifyobjecthandler.cpp | 19 +------------------ lib/remote/modifyobjecthandler.hpp | 19 +------------------ lib/remote/objectqueryhandler.cpp | 19 +------------------ lib/remote/objectqueryhandler.hpp | 19 +------------------ lib/remote/pkiutility.cpp | 19 +------------------ lib/remote/pkiutility.hpp | 19 +------------------ lib/remote/statushandler.cpp | 19 +------------------ lib/remote/statushandler.hpp | 19 +------------------ lib/remote/templatequeryhandler.cpp | 19 +------------------ lib/remote/templatequeryhandler.hpp | 19 +------------------ lib/remote/typequeryhandler.cpp | 19 +------------------ lib/remote/typequeryhandler.hpp | 19 +------------------ lib/remote/url-characters.hpp | 19 +------------------ lib/remote/url.cpp | 19 +------------------ lib/remote/url.hpp | 19 +------------------ lib/remote/variablequeryhandler.cpp | 19 +------------------ lib/remote/variablequeryhandler.hpp | 19 +------------------ lib/remote/zone.cpp | 19 +------------------ lib/remote/zone.hpp | 19 +------------------ lib/remote/zone.ti | 19 +------------------ plugins/check_disk.cpp | 19 +------------------ plugins/check_load.cpp | 19 +------------------ plugins/check_memory.cpp | 19 +------------------ plugins/check_network.cpp | 19 +------------------ plugins/check_nscp_api.cpp | 19 +------------------ plugins/check_perfmon.cpp | 19 +------------------ plugins/check_ping.cpp | 19 +------------------ plugins/check_procs.cpp | 19 +------------------ plugins/check_service.cpp | 19 +------------------ plugins/check_swap.cpp | 19 +------------------ plugins/check_update.cpp | 19 +------------------ plugins/check_uptime.cpp | 19 +------------------ plugins/check_users.cpp | 19 +------------------ plugins/thresholds.cpp | 19 +------------------ plugins/thresholds.hpp | 19 +------------------ test/base-array.cpp | 19 +------------------ test/base-base64.cpp | 19 +------------------ test/base-convert.cpp | 19 +------------------ test/base-dictionary.cpp | 19 +------------------ test/base-fifo.cpp | 19 +------------------ test/base-json.cpp | 19 +------------------ test/base-match.cpp | 19 +------------------ test/base-netstring.cpp | 19 +------------------ test/base-object-packer.cpp | 19 +------------------ test/base-object.cpp | 19 +------------------ test/base-serialize.cpp | 19 +------------------ test/base-shellescape.cpp | 19 +------------------ test/base-stacktrace.cpp | 19 +------------------ test/base-stream.cpp | 19 +------------------ test/base-string.cpp | 19 +------------------ test/base-timer.cpp | 19 +------------------ test/base-type.cpp | 19 +------------------ test/base-utility.cpp | 19 +------------------ test/base-value.cpp | 19 +------------------ test/config-ops.cpp | 19 +------------------ test/icinga-checkable-fixture.cpp | 19 +------------------ test/icinga-checkable-flapping.cpp | 19 +------------------ test/icinga-checkresult.cpp | 19 +------------------ test/icinga-legacytimeperiod.cpp | 19 +------------------ test/icinga-macros.cpp | 19 +------------------ test/icinga-notification.cpp | 19 +------------------ test/icinga-perfdata.cpp | 19 +------------------ test/icingaapplication-fixture.cpp | 19 +------------------ test/icingaapplication-fixture.hpp | 19 +------------------ test/livestatus-fixture.cpp | 19 +------------------ test/livestatus.cpp | 19 +------------------ test/remote-url.cpp | 19 +------------------ test/test-runner.cpp | 19 +------------------ third-party/execvpe/execvpe.h | 19 +------------------ tools/mkclass/class_lexer.ll | 19 +------------------ tools/mkclass/class_parser.yy | 19 +------------------ tools/mkclass/classcompiler.cpp | 19 +------------------ tools/mkclass/classcompiler.hpp | 19 +------------------ tools/mkclass/mkclass.cpp | 19 +------------------ tools/mkembedconfig/mkembedconfig.c | 19 +------------------ tools/mkunity/mkunity.c | 19 +------------------ 683 files changed, 683 insertions(+), 12294 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index ce3be0ef1..2d283a1aa 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/clicommand.hpp" #include "config/configcompilercontext.hpp" diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 81e88f803..268bb9b95 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 #include diff --git a/itl/command-icinga.conf b/itl/command-icinga.conf index 29ca06082..9d28aecd5 100644 --- a/itl/command-icinga.conf +++ b/itl/command-icinga.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "icinga" { import "icinga-check-command" diff --git a/itl/command-nscp-local.conf b/itl/command-nscp-local.conf index da4f0b549..b654922da 100644 --- a/itl/command-nscp-local.conf +++ b/itl/command-nscp-local.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ if (!globals.contains("NscpPath")) { NscpPath = dirname(msi_get_component_path("{5C45463A-4AE9-4325-96DB-6E239C034F93}")) diff --git a/itl/command-plugins-manubulon.conf b/itl/command-plugins-manubulon.conf index 18a2ddc24..d5cd08c25 100644 --- a/itl/command-plugins-manubulon.conf +++ b/itl/command-plugins-manubulon.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * main snmp-manubulon template diff --git a/itl/command-plugins-windows.conf b/itl/command-plugins-windows.conf index cc83ca885..98a723452 100644 --- a/itl/command-plugins-windows.conf +++ b/itl/command-plugins-windows.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "disk-windows" { command = [ PluginDir + "/check_disk.exe" ] diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index e5b365539..44ef7f628 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ template CheckCommand "ipv4-or-ipv6" { vars.check_address = {{ diff --git a/itl/hangman b/itl/hangman index 336796945..b2feb3a79 100644 --- a/itl/hangman +++ b/itl/hangman @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ if (!globals.contains("irc")) { globals.irc = log diff --git a/itl/itl b/itl/itl index 519e367c7..8f98fe60e 100644 --- a/itl/itl +++ b/itl/itl @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * This is the Icinga Templare Library, a collection of general purpose Icinga diff --git a/itl/manubulon b/itl/manubulon index 635037750..6b6855da8 100644 --- a/itl/manubulon +++ b/itl/manubulon @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * This is the SNMP Manubulon Template Library. diff --git a/itl/nscp b/itl/nscp index c191c4163..c62513e54 100644 --- a/itl/nscp +++ b/itl/nscp @@ -1,20 +1,3 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "command-nscp-local.conf" diff --git a/itl/plugins b/itl/plugins index b2367de06..edfe4cea3 100644 --- a/itl/plugins +++ b/itl/plugins @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * This is the Icinga Templare Library, a collection of general purpose Icinga diff --git a/itl/plugins-contrib b/itl/plugins-contrib index dd1fe4dde..f2f56e042 100644 --- a/itl/plugins-contrib +++ b/itl/plugins-contrib @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * This is a directory for various contributed command definitions. diff --git a/itl/plugins-contrib.d/big-data.conf b/itl/plugins-contrib.d/big-data.conf index d765a4b7c..83cc6244f 100644 --- a/itl/plugins-contrib.d/big-data.conf +++ b/itl/plugins-contrib.d/big-data.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "cloudera_service_status" { command = [ PluginDir + "/check_cloudera_service_status.py" ] diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index 18ddc7311..a9671eb81 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "mssql_health" { import "ipv4-or-ipv6" diff --git a/itl/plugins-contrib.d/hardware.conf b/itl/plugins-contrib.d/hardware.conf index 29d7b91b5..4d7b02e82 100644 --- a/itl/plugins-contrib.d/hardware.conf +++ b/itl/plugins-contrib.d/hardware.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "hpasm" { import "ipv4-or-ipv6" diff --git a/itl/plugins-contrib.d/icingacli.conf b/itl/plugins-contrib.d/icingacli.conf index 1d27ab2ca..6b2137735 100644 --- a/itl/plugins-contrib.d/icingacli.conf +++ b/itl/plugins-contrib.d/icingacli.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ template CheckCommand "icingacli" { command = [ PrefixDir + "/bin/icingacli" ] diff --git a/itl/plugins-contrib.d/ipmi.conf b/itl/plugins-contrib.d/ipmi.conf index b290fe50d..200d56747 100644 --- a/itl/plugins-contrib.d/ipmi.conf +++ b/itl/plugins-contrib.d/ipmi.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "ipmi-sensor" { import "ipv4-or-ipv6" diff --git a/itl/plugins-contrib.d/logmanagement.conf b/itl/plugins-contrib.d/logmanagement.conf index 4b5c5a9a4..fbfa0445a 100644 --- a/itl/plugins-contrib.d/logmanagement.conf +++ b/itl/plugins-contrib.d/logmanagement.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "logstash" { import "ipv4-or-ipv6" diff --git a/itl/plugins-contrib.d/metrics.conf b/itl/plugins-contrib.d/metrics.conf index 76b3a8eff..856ba755c 100644 --- a/itl/plugins-contrib.d/metrics.conf +++ b/itl/plugins-contrib.d/metrics.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "graphite" { command = [ PluginContribDir + "/check_graphite" ] diff --git a/itl/plugins-contrib.d/network-components.conf b/itl/plugins-contrib.d/network-components.conf index 3abd8853d..69a0b492b 100644 --- a/itl/plugins-contrib.d/network-components.conf +++ b/itl/plugins-contrib.d/network-components.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "interfacetable" { command = [ PluginContribDir + "/check_interface_table_v3t" ] diff --git a/itl/plugins-contrib.d/network-services.conf b/itl/plugins-contrib.d/network-services.conf index d8034fe8b..4f5847d19 100644 --- a/itl/plugins-contrib.d/network-services.conf +++ b/itl/plugins-contrib.d/network-services.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "kdc" { import "ipv4-or-ipv6" diff --git a/itl/plugins-contrib.d/operating-system.conf b/itl/plugins-contrib.d/operating-system.conf index 1ebfadfe0..34e7ea9cf 100644 --- a/itl/plugins-contrib.d/operating-system.conf +++ b/itl/plugins-contrib.d/operating-system.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "mem" { command = [ PluginContribDir + "/check_mem.pl" ] diff --git a/itl/plugins-contrib.d/storage.conf b/itl/plugins-contrib.d/storage.conf index 1d1822ea0..440430080 100644 --- a/itl/plugins-contrib.d/storage.conf +++ b/itl/plugins-contrib.d/storage.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "glusterfs" { command = [ "sudo", PluginDir + "/check_glusterfs" ] diff --git a/itl/plugins-contrib.d/virtualization.conf b/itl/plugins-contrib.d/virtualization.conf index 9c02e7545..bdbc7598c 100644 --- a/itl/plugins-contrib.d/virtualization.conf +++ b/itl/plugins-contrib.d/virtualization.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "esxi_hardware" { command = [ PluginContribDir + "/check_esxi_hardware.py" ] diff --git a/itl/plugins-contrib.d/vmware.conf b/itl/plugins-contrib.d/vmware.conf index 92abe8986..63ee3fa06 100644 --- a/itl/plugins-contrib.d/vmware.conf +++ b/itl/plugins-contrib.d/vmware.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ /** * main vmware-esx template diff --git a/itl/plugins-contrib.d/web.conf b/itl/plugins-contrib.d/web.conf index 79769cb64..b58261dd6 100644 --- a/itl/plugins-contrib.d/web.conf +++ b/itl/plugins-contrib.d/web.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ object CheckCommand "webinject" { command = [ PluginContribDir + "/check_webinject" ] diff --git a/itl/windows-plugins b/itl/windows-plugins index dfff686b6..a6e00db86 100644 --- a/itl/windows-plugins +++ b/itl/windows-plugins @@ -1,20 +1,3 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "command-plugins-windows.conf" diff --git a/lib/base/application-environment.cpp b/lib/base/application-environment.cpp index 358935f7b..819783f8d 100644 --- a/lib/base/application-environment.cpp +++ b/lib/base/application-environment.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/application.hpp" #include "base/scriptglobal.hpp" diff --git a/lib/base/application-version.cpp b/lib/base/application-version.cpp index 2d454caa4..d17775b73 100644 --- a/lib/base/application-version.cpp +++ b/lib/base/application-version.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/application.hpp" #include "icinga-version.h" diff --git a/lib/base/application.cpp b/lib/base/application.cpp index df93710b7..bdef02f83 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/application.hpp" #include "base/application-ti.cpp" diff --git a/lib/base/application.hpp b/lib/base/application.hpp index d88e65a7a..e612502ed 100644 --- a/lib/base/application.hpp +++ b/lib/base/application.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APPLICATION_H #define APPLICATION_H diff --git a/lib/base/application.ti b/lib/base/application.ti index fb6309574..3d5908a29 100644 --- a/lib/base/application.ti +++ b/lib/base/application.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/base/array-script.cpp b/lib/base/array-script.cpp index adc475c3e..fa7a52dcb 100644 --- a/lib/base/array-script.cpp +++ b/lib/base/array-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/array.hpp" #include "base/function.hpp" diff --git a/lib/base/array.cpp b/lib/base/array.cpp index 7baf331fd..5e3f3c69f 100644 --- a/lib/base/array.cpp +++ b/lib/base/array.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/array.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/array.hpp b/lib/base/array.hpp index 6dfbbe2d4..eaecfdf24 100644 --- a/lib/base/array.hpp +++ b/lib/base/array.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ARRAY_H #define ARRAY_H diff --git a/lib/base/base64.cpp b/lib/base/base64.cpp index 61c9295b1..42999c39b 100644 --- a/lib/base/base64.cpp +++ b/lib/base/base64.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/base64.hpp" #include diff --git a/lib/base/base64.hpp b/lib/base/base64.hpp index cbfbf86b3..8abbdbf36 100644 --- a/lib/base/base64.hpp +++ b/lib/base/base64.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef BASE64_H #define BASE64_H diff --git a/lib/base/boolean-script.cpp b/lib/base/boolean-script.cpp index aab8ff0e5..a9167ca87 100644 --- a/lib/base/boolean-script.cpp +++ b/lib/base/boolean-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/boolean.hpp" #include "base/convert.hpp" diff --git a/lib/base/boolean.cpp b/lib/base/boolean.cpp index 23839f722..683a7271d 100644 --- a/lib/base/boolean.cpp +++ b/lib/base/boolean.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/boolean.hpp" #include "base/primitivetype.hpp" diff --git a/lib/base/boolean.hpp b/lib/base/boolean.hpp index ed6232ed1..6533cb418 100644 --- a/lib/base/boolean.hpp +++ b/lib/base/boolean.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef BOOLEAN_H #define BOOLEAN_H diff --git a/lib/base/configobject-script.cpp b/lib/base/configobject-script.cpp index 3d60699c3..46a9ca27c 100644 --- a/lib/base/configobject-script.cpp +++ b/lib/base/configobject-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/dictionary.hpp" diff --git a/lib/base/configobject.cpp b/lib/base/configobject.cpp index f8517d61d..1969a9e6a 100644 --- a/lib/base/configobject.cpp +++ b/lib/base/configobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/configobject-ti.cpp" diff --git a/lib/base/configobject.hpp b/lib/base/configobject.hpp index 886c56105..1e89d45a9 100644 --- a/lib/base/configobject.hpp +++ b/lib/base/configobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGOBJECT_H #define CONFIGOBJECT_H diff --git a/lib/base/configobject.ti b/lib/base/configobject.ti index 60e651231..fcfcb0223 100644 --- a/lib/base/configobject.ti +++ b/lib/base/configobject.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/debuginfo.hpp" #include "base/configtype.hpp" diff --git a/lib/base/configtype.cpp b/lib/base/configtype.cpp index f265bd71f..50a53d547 100644 --- a/lib/base/configtype.cpp +++ b/lib/base/configtype.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/convert.hpp" diff --git a/lib/base/configtype.hpp b/lib/base/configtype.hpp index 07e590a21..2244cc5fa 100644 --- a/lib/base/configtype.hpp +++ b/lib/base/configtype.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGTYPE_H #define CONFIGTYPE_H diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp index 0103028de..d163937e2 100644 --- a/lib/base/configuration.cpp +++ b/lib/base/configuration.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configuration.hpp" #include "base/configuration-ti.cpp" diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp index 96ab2726f..560906596 100644 --- a/lib/base/configuration.hpp +++ b/lib/base/configuration.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGURATION_H #define CONFIGURATION_H diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti index 22f121411..72fa92dcf 100644 --- a/lib/base/configuration.ti +++ b/lib/base/configuration.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/base/configwriter.cpp b/lib/base/configwriter.cpp index cb2592dd3..cef3f7eb8 100644 --- a/lib/base/configwriter.cpp +++ b/lib/base/configwriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configwriter.hpp" #include "base/exception.hpp" diff --git a/lib/base/configwriter.hpp b/lib/base/configwriter.hpp index f221e7ba7..a0c70f76f 100644 --- a/lib/base/configwriter.hpp +++ b/lib/base/configwriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGWRITER_H #define CONFIGWRITER_H diff --git a/lib/base/console.cpp b/lib/base/console.cpp index fff57d5ba..99a5fad3d 100644 --- a/lib/base/console.cpp +++ b/lib/base/console.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/console.hpp" #include "base/initialize.hpp" diff --git a/lib/base/console.hpp b/lib/base/console.hpp index 0980c167a..f5b8c9a3e 100644 --- a/lib/base/console.hpp +++ b/lib/base/console.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONSOLE_H #define CONSOLE_H diff --git a/lib/base/context.cpp b/lib/base/context.cpp index 3cec8a1fe..2cac7a8db 100644 --- a/lib/base/context.cpp +++ b/lib/base/context.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/context.hpp" #include diff --git a/lib/base/context.hpp b/lib/base/context.hpp index 204ee029a..0e4b92a78 100644 --- a/lib/base/context.hpp +++ b/lib/base/context.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONTEXT_H #define CONTEXT_H diff --git a/lib/base/convert.cpp b/lib/base/convert.cpp index deb445cd6..3c60e1b44 100644 --- a/lib/base/convert.cpp +++ b/lib/base/convert.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/convert.hpp" #include "base/datetime.hpp" diff --git a/lib/base/convert.hpp b/lib/base/convert.hpp index bb7bd3e5c..e0754b36d 100644 --- a/lib/base/convert.hpp +++ b/lib/base/convert.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONVERT_H #define CONVERT_H diff --git a/lib/base/datetime-script.cpp b/lib/base/datetime-script.cpp index 8ac29fc85..6c1838153 100644 --- a/lib/base/datetime-script.cpp +++ b/lib/base/datetime-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/datetime.hpp" #include "base/function.hpp" diff --git a/lib/base/datetime.cpp b/lib/base/datetime.cpp index 863b9a9eb..aa7b5e59e 100644 --- a/lib/base/datetime.cpp +++ b/lib/base/datetime.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/datetime.hpp" #include "base/datetime-ti.cpp" diff --git a/lib/base/datetime.hpp b/lib/base/datetime.hpp index b82edfd88..e7b8a1fdd 100644 --- a/lib/base/datetime.hpp +++ b/lib/base/datetime.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DATETIME_H #define DATETIME_H diff --git a/lib/base/datetime.ti b/lib/base/datetime.ti index 789bfac08..b9d737506 100644 --- a/lib/base/datetime.ti +++ b/lib/base/datetime.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ library base; diff --git a/lib/base/debug.hpp b/lib/base/debug.hpp index e5d306ccb..54b424c6d 100644 --- a/lib/base/debug.hpp +++ b/lib/base/debug.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DEBUG_H #define DEBUG_H diff --git a/lib/base/debuginfo.cpp b/lib/base/debuginfo.cpp index 28414f7ac..99006aca5 100644 --- a/lib/base/debuginfo.cpp +++ b/lib/base/debuginfo.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/debuginfo.hpp" #include "base/convert.hpp" diff --git a/lib/base/debuginfo.hpp b/lib/base/debuginfo.hpp index 6947f43f0..d47db91c1 100644 --- a/lib/base/debuginfo.hpp +++ b/lib/base/debuginfo.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DEBUGINFO_H #define DEBUGINFO_H diff --git a/lib/base/defer.hpp b/lib/base/defer.hpp index 05ae0b819..33cc197db 100644 --- a/lib/base/defer.hpp +++ b/lib/base/defer.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DEFER #define DEFER diff --git a/lib/base/dependencygraph.cpp b/lib/base/dependencygraph.cpp index 796b5d55e..63763af95 100644 --- a/lib/base/dependencygraph.cpp +++ b/lib/base/dependencygraph.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dependencygraph.hpp" diff --git a/lib/base/dependencygraph.hpp b/lib/base/dependencygraph.hpp index 1ccacef5c..426607488 100644 --- a/lib/base/dependencygraph.hpp +++ b/lib/base/dependencygraph.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DEPENDENCYGRAPH_H #define DEPENDENCYGRAPH_H diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp index 905a7a3e3..ad19c5b52 100644 --- a/lib/base/dictionary-script.cpp +++ b/lib/base/dictionary-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/function.hpp" diff --git a/lib/base/dictionary.cpp b/lib/base/dictionary.cpp index d917e9f96..4fd9d24b9 100644 --- a/lib/base/dictionary.cpp +++ b/lib/base/dictionary.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/dictionary.hpp b/lib/base/dictionary.hpp index c6534e9b6..227868751 100644 --- a/lib/base/dictionary.hpp +++ b/lib/base/dictionary.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DICTIONARY_H #define DICTIONARY_H diff --git a/lib/base/exception.cpp b/lib/base/exception.cpp index c36ac787e..d0e363e61 100644 --- a/lib/base/exception.cpp +++ b/lib/base/exception.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/exception.hpp" diff --git a/lib/base/exception.hpp b/lib/base/exception.hpp index a3f78f458..47e53dac5 100644 --- a/lib/base/exception.hpp +++ b/lib/base/exception.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXCEPTION_H #define EXCEPTION_H diff --git a/lib/base/fifo.cpp b/lib/base/fifo.cpp index d9453f066..8653f5176 100644 --- a/lib/base/fifo.cpp +++ b/lib/base/fifo.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/fifo.hpp" diff --git a/lib/base/fifo.hpp b/lib/base/fifo.hpp index 3f01c8eba..a8273c1ba 100644 --- a/lib/base/fifo.hpp +++ b/lib/base/fifo.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FIFO_H #define FIFO_H diff --git a/lib/base/filelogger.cpp b/lib/base/filelogger.cpp index 6c9c832ed..60efdba26 100644 --- a/lib/base/filelogger.cpp +++ b/lib/base/filelogger.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/filelogger.hpp" #include "base/filelogger-ti.cpp" diff --git a/lib/base/filelogger.hpp b/lib/base/filelogger.hpp index e0f4cdb09..420337f6a 100644 --- a/lib/base/filelogger.hpp +++ b/lib/base/filelogger.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FILELOGGER_H #define FILELOGGER_H diff --git a/lib/base/filelogger.ti b/lib/base/filelogger.ti index 7bc29f1dd..8af2498ec 100644 --- a/lib/base/filelogger.ti +++ b/lib/base/filelogger.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/streamlogger.hpp" diff --git a/lib/base/function-script.cpp b/lib/base/function-script.cpp index 19dbd399d..e59e84dbc 100644 --- a/lib/base/function-script.cpp +++ b/lib/base/function-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/function.hpp" #include "base/functionwrapper.hpp" diff --git a/lib/base/function.cpp b/lib/base/function.cpp index 27b10e6ce..f9a261dc0 100644 --- a/lib/base/function.cpp +++ b/lib/base/function.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/function.hpp" #include "base/function-ti.cpp" diff --git a/lib/base/function.hpp b/lib/base/function.hpp index 1d6306c47..d6f1d17e0 100644 --- a/lib/base/function.hpp +++ b/lib/base/function.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FUNCTION_H #define FUNCTION_H diff --git a/lib/base/function.ti b/lib/base/function.ti index 0f4c2eea8..f2623c168 100644 --- a/lib/base/function.ti +++ b/lib/base/function.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/base/functionwrapper.hpp b/lib/base/functionwrapper.hpp index f076b4993..03b8a44aa 100644 --- a/lib/base/functionwrapper.hpp +++ b/lib/base/functionwrapper.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FUNCTIONWRAPPER_H #define FUNCTIONWRAPPER_H diff --git a/lib/base/i2-base.hpp b/lib/base/i2-base.hpp index add2e46a2..6bb756338 100644 --- a/lib/base/i2-base.hpp +++ b/lib/base/i2-base.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2BASE_H #define I2BASE_H diff --git a/lib/base/initialize.cpp b/lib/base/initialize.cpp index a2102f172..23373cc23 100644 --- a/lib/base/initialize.cpp +++ b/lib/base/initialize.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/initialize.hpp" #include "base/loader.hpp" diff --git a/lib/base/initialize.hpp b/lib/base/initialize.hpp index ac6ce3cf4..0629abe68 100644 --- a/lib/base/initialize.hpp +++ b/lib/base/initialize.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INITIALIZE_H #define INITIALIZE_H diff --git a/lib/base/json-script.cpp b/lib/base/json-script.cpp index d5140e2fc..ee4221142 100644 --- a/lib/base/json-script.cpp +++ b/lib/base/json-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/function.hpp" diff --git a/lib/base/json.cpp b/lib/base/json.cpp index 237fac23a..a9a1e5f56 100644 --- a/lib/base/json.cpp +++ b/lib/base/json.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/json.hpp" #include "base/debug.hpp" diff --git a/lib/base/json.hpp b/lib/base/json.hpp index 8791b6009..df0ea18a0 100644 --- a/lib/base/json.hpp +++ b/lib/base/json.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef JSON_H #define JSON_H diff --git a/lib/base/library.cpp b/lib/base/library.cpp index 2fa3a31ce..541ed74ad 100644 --- a/lib/base/library.cpp +++ b/lib/base/library.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/library.hpp" #include "base/loader.hpp" diff --git a/lib/base/library.hpp b/lib/base/library.hpp index d7ba69ee1..6bd2065ec 100644 --- a/lib/base/library.hpp +++ b/lib/base/library.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LIBRARY_H #define LIBRARY_H diff --git a/lib/base/loader.cpp b/lib/base/loader.cpp index dd54c8937..e969f371d 100644 --- a/lib/base/loader.cpp +++ b/lib/base/loader.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/loader.hpp" #include "base/logger.hpp" diff --git a/lib/base/loader.hpp b/lib/base/loader.hpp index 63d42b738..704a32a09 100644 --- a/lib/base/loader.hpp +++ b/lib/base/loader.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LOADER_H #define LOADER_H diff --git a/lib/base/logger.cpp b/lib/base/logger.cpp index adb288376..d2c5db8fd 100644 --- a/lib/base/logger.cpp +++ b/lib/base/logger.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/logger.hpp" #include "base/logger-ti.cpp" diff --git a/lib/base/logger.hpp b/lib/base/logger.hpp index 599cca416..4200fcc6c 100644 --- a/lib/base/logger.hpp +++ b/lib/base/logger.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LOGGER_H #define LOGGER_H diff --git a/lib/base/logger.ti b/lib/base/logger.ti index d2ff595da..df68b2540 100644 --- a/lib/base/logger.ti +++ b/lib/base/logger.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/base/math-script.cpp b/lib/base/math-script.cpp index 9a0b4b13a..21dbee411 100644 --- a/lib/base/math-script.cpp +++ b/lib/base/math-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/function.hpp" diff --git a/lib/base/namespace-script.cpp b/lib/base/namespace-script.cpp index 08dfa3618..29d23a000 100644 --- a/lib/base/namespace-script.cpp +++ b/lib/base/namespace-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/namespace.hpp" #include "base/function.hpp" diff --git a/lib/base/namespace.cpp b/lib/base/namespace.cpp index 8ca785318..d80220087 100644 --- a/lib/base/namespace.cpp +++ b/lib/base/namespace.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/namespace.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/namespace.hpp b/lib/base/namespace.hpp index 5a7158aa1..6b2e92018 100644 --- a/lib/base/namespace.hpp +++ b/lib/base/namespace.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NAMESPACE_H #define NAMESPACE_H diff --git a/lib/base/netstring.cpp b/lib/base/netstring.cpp index 5bc026167..6e3b8a1fc 100644 --- a/lib/base/netstring.cpp +++ b/lib/base/netstring.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/netstring.hpp" #include "base/debug.hpp" diff --git a/lib/base/netstring.hpp b/lib/base/netstring.hpp index 51836ec9f..10ff4e2fc 100644 --- a/lib/base/netstring.hpp +++ b/lib/base/netstring.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NETSTRING_H #define NETSTRING_H diff --git a/lib/base/networkstream.cpp b/lib/base/networkstream.cpp index 19f661b33..57da507d8 100644 --- a/lib/base/networkstream.cpp +++ b/lib/base/networkstream.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/networkstream.hpp" diff --git a/lib/base/networkstream.hpp b/lib/base/networkstream.hpp index cbaf1ca54..06eb9501e 100644 --- a/lib/base/networkstream.hpp +++ b/lib/base/networkstream.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NETWORKSTREAM_H #define NETWORKSTREAM_H diff --git a/lib/base/number-script.cpp b/lib/base/number-script.cpp index 8946676cc..0dcaca58b 100644 --- a/lib/base/number-script.cpp +++ b/lib/base/number-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/number.hpp" #include "base/convert.hpp" diff --git a/lib/base/number.cpp b/lib/base/number.cpp index 8aedda9db..a33651988 100644 --- a/lib/base/number.cpp +++ b/lib/base/number.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/number.hpp" #include "base/primitivetype.hpp" diff --git a/lib/base/number.hpp b/lib/base/number.hpp index 0d6cbf05a..dd5196f98 100644 --- a/lib/base/number.hpp +++ b/lib/base/number.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NUMBER_H #define NUMBER_H diff --git a/lib/base/object-packer.cpp b/lib/base/object-packer.cpp index 4100ba52e..024325e3d 100644 --- a/lib/base/object-packer.cpp +++ b/lib/base/object-packer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object-packer.hpp" #include "base/debug.hpp" diff --git a/lib/base/object-packer.hpp b/lib/base/object-packer.hpp index cfa2aec90..00f7b998b 100644 --- a/lib/base/object-packer.hpp +++ b/lib/base/object-packer.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECT_PACKER #define OBJECT_PACKER diff --git a/lib/base/object-script.cpp b/lib/base/object-script.cpp index 4f93b0946..fff7df0c9 100644 --- a/lib/base/object-script.cpp +++ b/lib/base/object-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object.hpp" #include "base/dictionary.hpp" diff --git a/lib/base/object.cpp b/lib/base/object.cpp index 6aa52afb8..4f186628e 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object.hpp" #include "base/value.hpp" diff --git a/lib/base/object.hpp b/lib/base/object.hpp index 9b155bbe8..00f3e0ee2 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECT_H #define OBJECT_H diff --git a/lib/base/objectlock.cpp b/lib/base/objectlock.cpp index 8eed66bf3..bc966cd80 100644 --- a/lib/base/objectlock.cpp +++ b/lib/base/objectlock.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/objectlock.hpp" #include diff --git a/lib/base/objectlock.hpp b/lib/base/objectlock.hpp index 9dfdd6735..96cbac3d7 100644 --- a/lib/base/objectlock.hpp +++ b/lib/base/objectlock.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTLOCK_H #define OBJECTLOCK_H diff --git a/lib/base/objecttype.cpp b/lib/base/objecttype.cpp index 4fb6f9d7c..7ab0f2ad8 100644 --- a/lib/base/objecttype.cpp +++ b/lib/base/objecttype.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/objecttype.hpp" #include "base/initialize.hpp" diff --git a/lib/base/objecttype.hpp b/lib/base/objecttype.hpp index ad2a31d5a..0db715e18 100644 --- a/lib/base/objecttype.hpp +++ b/lib/base/objecttype.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTTYPE_H #define OBJECTTYPE_H diff --git a/lib/base/perfdatavalue.cpp b/lib/base/perfdatavalue.cpp index b977011de..422988d80 100644 --- a/lib/base/perfdatavalue.cpp +++ b/lib/base/perfdatavalue.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/perfdatavalue.hpp" #include "base/perfdatavalue-ti.cpp" diff --git a/lib/base/perfdatavalue.hpp b/lib/base/perfdatavalue.hpp index 49ff57936..05b2c34ac 100644 --- a/lib/base/perfdatavalue.hpp +++ b/lib/base/perfdatavalue.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PERFDATAVALUE_H #define PERFDATAVALUE_H diff --git a/lib/base/perfdatavalue.ti b/lib/base/perfdatavalue.ti index 194682382..b2692e98a 100644 --- a/lib/base/perfdatavalue.ti +++ b/lib/base/perfdatavalue.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ library base; diff --git a/lib/base/primitivetype.cpp b/lib/base/primitivetype.cpp index 4ade53f48..10286c781 100644 --- a/lib/base/primitivetype.cpp +++ b/lib/base/primitivetype.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/primitivetype.hpp" #include "base/dictionary.hpp" diff --git a/lib/base/primitivetype.hpp b/lib/base/primitivetype.hpp index c752c1de4..ae7454e07 100644 --- a/lib/base/primitivetype.hpp +++ b/lib/base/primitivetype.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PRIMITIVETYPE_H #define PRIMITIVETYPE_H diff --git a/lib/base/process.cpp b/lib/base/process.cpp index 71454b5ac..497cca352 100644 --- a/lib/base/process.cpp +++ b/lib/base/process.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/process.hpp" #include "base/exception.hpp" diff --git a/lib/base/process.hpp b/lib/base/process.hpp index ad72aea4c..7fbfe0ac0 100644 --- a/lib/base/process.hpp +++ b/lib/base/process.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PROCESS_H #define PROCESS_H diff --git a/lib/base/reference-script.cpp b/lib/base/reference-script.cpp index 9d70877e4..940824578 100644 --- a/lib/base/reference-script.cpp +++ b/lib/base/reference-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/reference.hpp" #include "base/function.hpp" diff --git a/lib/base/reference.cpp b/lib/base/reference.cpp index 877b40137..b0104af6c 100644 --- a/lib/base/reference.cpp +++ b/lib/base/reference.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/reference.hpp" #include "base/debug.hpp" diff --git a/lib/base/reference.hpp b/lib/base/reference.hpp index 6d6472281..30faabe5f 100644 --- a/lib/base/reference.hpp +++ b/lib/base/reference.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef REFERENCE_H #define REFERENCE_H diff --git a/lib/base/registry.hpp b/lib/base/registry.hpp index ead44e457..b8b0aced2 100644 --- a/lib/base/registry.hpp +++ b/lib/base/registry.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef REGISTRY_H #define REGISTRY_H diff --git a/lib/base/ringbuffer.cpp b/lib/base/ringbuffer.cpp index 9fb62413c..75ffff3eb 100644 --- a/lib/base/ringbuffer.cpp +++ b/lib/base/ringbuffer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/ringbuffer.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/ringbuffer.hpp b/lib/base/ringbuffer.hpp index 07f55112f..ed5802829 100644 --- a/lib/base/ringbuffer.hpp +++ b/lib/base/ringbuffer.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef RINGBUFFER_H #define RINGBUFFER_H diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index ebb6399b3..fef3b7c99 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/scriptframe.hpp" #include "base/scriptglobal.hpp" diff --git a/lib/base/scriptframe.hpp b/lib/base/scriptframe.hpp index 1fd1f2344..18e23ef2f 100644 --- a/lib/base/scriptframe.hpp +++ b/lib/base/scriptframe.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SCRIPTFRAME_H #define SCRIPTFRAME_H diff --git a/lib/base/scriptglobal.cpp b/lib/base/scriptglobal.cpp index 6796d5223..d4ac81e9f 100644 --- a/lib/base/scriptglobal.cpp +++ b/lib/base/scriptglobal.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/scriptglobal.hpp" #include "base/singleton.hpp" diff --git a/lib/base/scriptglobal.hpp b/lib/base/scriptglobal.hpp index abb500e5e..c31cdcdf6 100644 --- a/lib/base/scriptglobal.hpp +++ b/lib/base/scriptglobal.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SCRIPTGLOBAL_H #define SCRIPTGLOBAL_H diff --git a/lib/base/scriptutils.cpp b/lib/base/scriptutils.cpp index 9337ae464..47f2ccdea 100644 --- a/lib/base/scriptutils.cpp +++ b/lib/base/scriptutils.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/scriptutils.hpp" #include "base/function.hpp" diff --git a/lib/base/scriptutils.hpp b/lib/base/scriptutils.hpp index 778ab9587..c874ff857 100644 --- a/lib/base/scriptutils.hpp +++ b/lib/base/scriptutils.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SCRIPTUTILS_H #define SCRIPTUTILS_H diff --git a/lib/base/serializer.cpp b/lib/base/serializer.cpp index cb4088ed7..416a8607c 100644 --- a/lib/base/serializer.cpp +++ b/lib/base/serializer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/serializer.hpp" #include "base/type.hpp" diff --git a/lib/base/serializer.hpp b/lib/base/serializer.hpp index a475e15cf..8dfea0865 100644 --- a/lib/base/serializer.hpp +++ b/lib/base/serializer.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERIALIZER_H #define SERIALIZER_H diff --git a/lib/base/singleton.hpp b/lib/base/singleton.hpp index 05f15d6d0..bc4fa9cc2 100644 --- a/lib/base/singleton.hpp +++ b/lib/base/singleton.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SINGLETON_H #define SINGLETON_H diff --git a/lib/base/socket.cpp b/lib/base/socket.cpp index 6406d2122..cc3183b96 100644 --- a/lib/base/socket.cpp +++ b/lib/base/socket.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/socket.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/socket.hpp b/lib/base/socket.hpp index 5b0be13ca..a642fc496 100644 --- a/lib/base/socket.hpp +++ b/lib/base/socket.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SOCKET_H #define SOCKET_H diff --git a/lib/base/socketevents-epoll.cpp b/lib/base/socketevents-epoll.cpp index 932323c6e..f241b54af 100644 --- a/lib/base/socketevents-epoll.cpp +++ b/lib/base/socketevents-epoll.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/socketevents.hpp" #include "base/exception.hpp" diff --git a/lib/base/socketevents-poll.cpp b/lib/base/socketevents-poll.cpp index afb43177e..4b12316b2 100644 --- a/lib/base/socketevents-poll.cpp +++ b/lib/base/socketevents-poll.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/socketevents.hpp" #include "base/exception.hpp" diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 286460eab..1d31b4662 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/socketevents.hpp" #include "base/exception.hpp" diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index 44bca3071..5b0f39d74 100644 --- a/lib/base/socketevents.hpp +++ b/lib/base/socketevents.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SOCKETEVENTS_H #define SOCKETEVENTS_H diff --git a/lib/base/stacktrace.cpp b/lib/base/stacktrace.cpp index e81ecb5fa..81fdd3380 100644 --- a/lib/base/stacktrace.cpp +++ b/lib/base/stacktrace.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stacktrace.hpp" #include "base/utility.hpp" diff --git a/lib/base/stacktrace.hpp b/lib/base/stacktrace.hpp index 69c1f3104..1416d6558 100644 --- a/lib/base/stacktrace.hpp +++ b/lib/base/stacktrace.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STACKTRACE_H #define STACKTRACE_H diff --git a/lib/base/statsfunction.hpp b/lib/base/statsfunction.hpp index 991e6d5fc..ecac33c57 100644 --- a/lib/base/statsfunction.hpp +++ b/lib/base/statsfunction.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STATSFUNCTION_H #define STATSFUNCTION_H diff --git a/lib/base/stdiostream.cpp b/lib/base/stdiostream.cpp index 84bd8b5ad..449036f03 100644 --- a/lib/base/stdiostream.cpp +++ b/lib/base/stdiostream.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stdiostream.hpp" #include "base/objectlock.hpp" diff --git a/lib/base/stdiostream.hpp b/lib/base/stdiostream.hpp index c89ef9812..05c7f0d57 100644 --- a/lib/base/stdiostream.hpp +++ b/lib/base/stdiostream.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STDIOSTREAM_H #define STDIOSTREAM_H diff --git a/lib/base/stream.cpp b/lib/base/stream.cpp index f41bc52a2..77d39d3aa 100644 --- a/lib/base/stream.cpp +++ b/lib/base/stream.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stream.hpp" #include diff --git a/lib/base/stream.hpp b/lib/base/stream.hpp index 72da2ba9a..393a0aee4 100644 --- a/lib/base/stream.hpp +++ b/lib/base/stream.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STREAM_H #define STREAM_H diff --git a/lib/base/streamlogger.cpp b/lib/base/streamlogger.cpp index aa1d62cd3..0c3d797f2 100644 --- a/lib/base/streamlogger.cpp +++ b/lib/base/streamlogger.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/streamlogger.hpp" #include "base/streamlogger-ti.cpp" diff --git a/lib/base/streamlogger.hpp b/lib/base/streamlogger.hpp index d1400bfe8..81482aa98 100644 --- a/lib/base/streamlogger.hpp +++ b/lib/base/streamlogger.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STREAMLOGGER_H #define STREAMLOGGER_H diff --git a/lib/base/streamlogger.ti b/lib/base/streamlogger.ti index 3585dccb2..6dc36e0cb 100644 --- a/lib/base/streamlogger.ti +++ b/lib/base/streamlogger.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/logger.hpp" diff --git a/lib/base/string-script.cpp b/lib/base/string-script.cpp index ea6e944b6..323f99c41 100644 --- a/lib/base/string-script.cpp +++ b/lib/base/string-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object.hpp" #include "base/dictionary.hpp" diff --git a/lib/base/string.cpp b/lib/base/string.cpp index de8e79167..c4617e357 100644 --- a/lib/base/string.cpp +++ b/lib/base/string.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/string.hpp" #include "base/value.hpp" diff --git a/lib/base/string.hpp b/lib/base/string.hpp index bc4e33ee4..e9799e7eb 100644 --- a/lib/base/string.hpp +++ b/lib/base/string.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STRING_H #define STRING_H diff --git a/lib/base/stringbuilder.cpp b/lib/base/stringbuilder.cpp index f0c44c8c4..5b5a508ec 100644 --- a/lib/base/stringbuilder.cpp +++ b/lib/base/stringbuilder.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stringbuilder.hpp" #include diff --git a/lib/base/stringbuilder.hpp b/lib/base/stringbuilder.hpp index 841ce19bf..4d806f4b7 100644 --- a/lib/base/stringbuilder.hpp +++ b/lib/base/stringbuilder.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STRINGBUILDER_H #define STRINGBUILDER_H diff --git a/lib/base/sysloglogger.cpp b/lib/base/sysloglogger.cpp index 8bee06315..44babc31c 100644 --- a/lib/base/sysloglogger.cpp +++ b/lib/base/sysloglogger.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef _WIN32 #include "base/sysloglogger.hpp" diff --git a/lib/base/sysloglogger.hpp b/lib/base/sysloglogger.hpp index 9c1b63edd..168c5d9a5 100644 --- a/lib/base/sysloglogger.hpp +++ b/lib/base/sysloglogger.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SYSLOGLOGGER_H #define SYSLOGLOGGER_H diff --git a/lib/base/sysloglogger.ti b/lib/base/sysloglogger.ti index b7dd7343c..8f343597f 100644 --- a/lib/base/sysloglogger.ti +++ b/lib/base/sysloglogger.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/logger.hpp" diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 2c3f6c7c3..a06b21106 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/tcpsocket.hpp" #include "base/logger.hpp" diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp index c65eb3c18..4f8a2a0f0 100644 --- a/lib/base/tcpsocket.hpp +++ b/lib/base/tcpsocket.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TCPSOCKET_H #define TCPSOCKET_H diff --git a/lib/base/threadpool.cpp b/lib/base/threadpool.cpp index 1dad249bc..0021bb84b 100644 --- a/lib/base/threadpool.cpp +++ b/lib/base/threadpool.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/threadpool.hpp" #include "base/logger.hpp" diff --git a/lib/base/threadpool.hpp b/lib/base/threadpool.hpp index f2083cd38..742e891c5 100644 --- a/lib/base/threadpool.hpp +++ b/lib/base/threadpool.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef THREADPOOL_H #define THREADPOOL_H diff --git a/lib/base/timer.cpp b/lib/base/timer.cpp index 2bcff3a4b..65a5d688b 100644 --- a/lib/base/timer.cpp +++ b/lib/base/timer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/timer.hpp" #include "base/debug.hpp" diff --git a/lib/base/timer.hpp b/lib/base/timer.hpp index 96b775322..24937b7d5 100644 --- a/lib/base/timer.hpp +++ b/lib/base/timer.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TIMER_H #define TIMER_H diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index a694f86bf..5d7678417 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/tlsstream.hpp" #include "base/utility.hpp" diff --git a/lib/base/tlsstream.hpp b/lib/base/tlsstream.hpp index 45519b5b1..8af5fb58e 100644 --- a/lib/base/tlsstream.hpp +++ b/lib/base/tlsstream.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TLSSTREAM_H #define TLSSTREAM_H diff --git a/lib/base/tlsutility.cpp b/lib/base/tlsutility.cpp index 306d2941f..35f4d3ba5 100644 --- a/lib/base/tlsutility.cpp +++ b/lib/base/tlsutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/tlsutility.hpp" #include "base/convert.hpp" diff --git a/lib/base/tlsutility.hpp b/lib/base/tlsutility.hpp index b9af961d3..afe21f2e4 100644 --- a/lib/base/tlsutility.hpp +++ b/lib/base/tlsutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TLSUTILITY_H #define TLSUTILITY_H diff --git a/lib/base/type.cpp b/lib/base/type.cpp index 3fa505d8c..493833d0c 100644 --- a/lib/base/type.cpp +++ b/lib/base/type.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/type.hpp" #include "base/scriptglobal.hpp" diff --git a/lib/base/type.hpp b/lib/base/type.hpp index d01b605da..2bf54ccf5 100644 --- a/lib/base/type.hpp +++ b/lib/base/type.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TYPE_H #define TYPE_H diff --git a/lib/base/typetype-script.cpp b/lib/base/typetype-script.cpp index f20b46a3c..df6a1873b 100644 --- a/lib/base/typetype-script.cpp +++ b/lib/base/typetype-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/type.hpp" #include "base/dictionary.hpp" diff --git a/lib/base/unix.hpp b/lib/base/unix.hpp index 7083d0f02..7413a5b15 100644 --- a/lib/base/unix.hpp +++ b/lib/base/unix.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef UNIX_H #define UNIX_H diff --git a/lib/base/unixsocket.cpp b/lib/base/unixsocket.cpp index 9813298ef..dcc56ffa1 100644 --- a/lib/base/unixsocket.cpp +++ b/lib/base/unixsocket.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/unixsocket.hpp" #include "base/exception.hpp" diff --git a/lib/base/unixsocket.hpp b/lib/base/unixsocket.hpp index b3b718ada..5d6df8fa8 100644 --- a/lib/base/unixsocket.hpp +++ b/lib/base/unixsocket.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef UNIXSOCKET_H #define UNIXSOCKET_H diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index e44d50f23..3609ca495 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/utility.hpp" #include "base/convert.hpp" diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index 67d2a2768..1f4059b3f 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef UTILITY_H #define UTILITY_H diff --git a/lib/base/value-operators.cpp b/lib/base/value-operators.cpp index 9ce78460c..69974d038 100644 --- a/lib/base/value-operators.cpp +++ b/lib/base/value-operators.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/value.hpp" #include "base/array.hpp" diff --git a/lib/base/value.cpp b/lib/base/value.cpp index 7132e95e0..867c8217e 100644 --- a/lib/base/value.cpp +++ b/lib/base/value.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/value.hpp" #include "base/array.hpp" diff --git a/lib/base/value.hpp b/lib/base/value.hpp index 55ecd1926..86a3b115d 100644 --- a/lib/base/value.hpp +++ b/lib/base/value.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VALUE_H #define VALUE_H diff --git a/lib/base/win32.hpp b/lib/base/win32.hpp index bd880b8a8..064c5d669 100644 --- a/lib/base/win32.hpp +++ b/lib/base/win32.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef WIN32_H #define WIN32_H diff --git a/lib/base/workqueue.cpp b/lib/base/workqueue.cpp index 49a441289..99bb50927 100644 --- a/lib/base/workqueue.cpp +++ b/lib/base/workqueue.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/workqueue.hpp" #include "base/utility.hpp" diff --git a/lib/base/workqueue.hpp b/lib/base/workqueue.hpp index f1a1f4115..ca9afb352 100644 --- a/lib/base/workqueue.hpp +++ b/lib/base/workqueue.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef WORKQUEUE_H #define WORKQUEUE_H diff --git a/lib/checker/checkercomponent.cpp b/lib/checker/checkercomponent.cpp index 8878a9d29..5321b4d39 100644 --- a/lib/checker/checkercomponent.cpp +++ b/lib/checker/checkercomponent.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "checker/checkercomponent.hpp" #include "checker/checkercomponent-ti.cpp" diff --git a/lib/checker/checkercomponent.hpp b/lib/checker/checkercomponent.hpp index 3c2753973..bea6ac066 100644 --- a/lib/checker/checkercomponent.hpp +++ b/lib/checker/checkercomponent.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CHECKERCOMPONENT_H #define CHECKERCOMPONENT_H diff --git a/lib/checker/checkercomponent.ti b/lib/checker/checkercomponent.ti index 9663bb189..0bde3dc80 100644 --- a/lib/checker/checkercomponent.ti +++ b/lib/checker/checkercomponent.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/cli/apisetupcommand.cpp b/lib/cli/apisetupcommand.cpp index 27c49a304..d68aeedd5 100644 --- a/lib/cli/apisetupcommand.cpp +++ b/lib/cli/apisetupcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/apisetupcommand.hpp" #include "cli/apisetuputility.hpp" diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp index d46c0da49..9d0864eb0 100644 --- a/lib/cli/apisetupcommand.hpp +++ b/lib/cli/apisetupcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APISETUPCOMMAND_H #define APISETUPCOMMAND_H diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp index 8a2f7d62f..cee4e1ee3 100644 --- a/lib/cli/apisetuputility.cpp +++ b/lib/cli/apisetuputility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/apisetuputility.hpp" #include "cli/nodeutility.hpp" diff --git a/lib/cli/apisetuputility.hpp b/lib/cli/apisetuputility.hpp index 426c6c18a..d3614462d 100644 --- a/lib/cli/apisetuputility.hpp +++ b/lib/cli/apisetuputility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APISETUPUTILITY_H #define APISETUPUTILITY_H diff --git a/lib/cli/calistcommand.cpp b/lib/cli/calistcommand.cpp index 5f793273a..509d0a91d 100644 --- a/lib/cli/calistcommand.cpp +++ b/lib/cli/calistcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/calistcommand.hpp" #include "remote/apilistener.hpp" diff --git a/lib/cli/calistcommand.hpp b/lib/cli/calistcommand.hpp index e89aa6eb4..ddf44d43b 100644 --- a/lib/cli/calistcommand.hpp +++ b/lib/cli/calistcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CALISTCOMMAND_H #define CALISTCOMMAND_H diff --git a/lib/cli/casigncommand.cpp b/lib/cli/casigncommand.cpp index 37b26fdbe..a6b547d98 100644 --- a/lib/cli/casigncommand.cpp +++ b/lib/cli/casigncommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/casigncommand.hpp" #include "remote/apilistener.hpp" diff --git a/lib/cli/casigncommand.hpp b/lib/cli/casigncommand.hpp index 41c7b9013..0089af76c 100644 --- a/lib/cli/casigncommand.hpp +++ b/lib/cli/casigncommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CASIGNCOMMAND_H #define CASIGNCOMMAND_H diff --git a/lib/cli/clicommand.cpp b/lib/cli/clicommand.cpp index 1ac721345..878beac77 100644 --- a/lib/cli/clicommand.cpp +++ b/lib/cli/clicommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/clicommand.hpp" #include "base/logger.hpp" diff --git a/lib/cli/clicommand.hpp b/lib/cli/clicommand.hpp index 1aa4aca91..e3bbae171 100644 --- a/lib/cli/clicommand.hpp +++ b/lib/cli/clicommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CLICOMMAND_H #define CLICOMMAND_H diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index 86019022a..9cd6ffb13 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/consolecommand.hpp" #include "config/configcompiler.hpp" diff --git a/lib/cli/consolecommand.hpp b/lib/cli/consolecommand.hpp index 88f8c8b0a..f36f37cd9 100644 --- a/lib/cli/consolecommand.hpp +++ b/lib/cli/consolecommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONSOLECOMMAND_H #define CONSOLECOMMAND_H diff --git a/lib/cli/daemoncommand.cpp b/lib/cli/daemoncommand.cpp index 88461f148..c5b0376a0 100644 --- a/lib/cli/daemoncommand.cpp +++ b/lib/cli/daemoncommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/daemoncommand.hpp" #include "cli/daemonutility.hpp" diff --git a/lib/cli/daemoncommand.hpp b/lib/cli/daemoncommand.hpp index 437a19383..da8a34bd3 100644 --- a/lib/cli/daemoncommand.hpp +++ b/lib/cli/daemoncommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DAEMONCOMMAND_H #define DAEMONCOMMAND_H diff --git a/lib/cli/daemonutility.cpp b/lib/cli/daemonutility.cpp index 5a4bd2c1d..ba1c24d9a 100644 --- a/lib/cli/daemonutility.cpp +++ b/lib/cli/daemonutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/daemonutility.hpp" #include "base/utility.hpp" diff --git a/lib/cli/daemonutility.hpp b/lib/cli/daemonutility.hpp index 457b7e7dc..963bfba74 100644 --- a/lib/cli/daemonutility.hpp +++ b/lib/cli/daemonutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DAEMONUTILITY_H #define DAEMONUTILITY_H diff --git a/lib/cli/editline.hpp b/lib/cli/editline.hpp index 3670bdd2b..f97525edb 100644 --- a/lib/cli/editline.hpp +++ b/lib/cli/editline.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EDITLINE_H #define EDITLINE_H diff --git a/lib/cli/featuredisablecommand.cpp b/lib/cli/featuredisablecommand.cpp index acee0209e..df8e35062 100644 --- a/lib/cli/featuredisablecommand.cpp +++ b/lib/cli/featuredisablecommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/featuredisablecommand.hpp" #include "cli/featureutility.hpp" diff --git a/lib/cli/featuredisablecommand.hpp b/lib/cli/featuredisablecommand.hpp index cc3f6dc33..b24655de6 100644 --- a/lib/cli/featuredisablecommand.hpp +++ b/lib/cli/featuredisablecommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FEATUREDISABLECOMMAND_H #define FEATUREDISABLECOMMAND_H diff --git a/lib/cli/featureenablecommand.cpp b/lib/cli/featureenablecommand.cpp index f4d41cd53..7426e56ca 100644 --- a/lib/cli/featureenablecommand.cpp +++ b/lib/cli/featureenablecommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/featureenablecommand.hpp" #include "cli/featureutility.hpp" diff --git a/lib/cli/featureenablecommand.hpp b/lib/cli/featureenablecommand.hpp index c337ae80c..fc917787d 100644 --- a/lib/cli/featureenablecommand.hpp +++ b/lib/cli/featureenablecommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FEATUREENABLECOMMAND_H #define FEATUREENABLECOMMAND_H diff --git a/lib/cli/featurelistcommand.cpp b/lib/cli/featurelistcommand.cpp index 8f1667cca..2aad4a9cd 100644 --- a/lib/cli/featurelistcommand.cpp +++ b/lib/cli/featurelistcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/featurelistcommand.hpp" #include "cli/featureutility.hpp" diff --git a/lib/cli/featurelistcommand.hpp b/lib/cli/featurelistcommand.hpp index 30a599408..cae1d740b 100644 --- a/lib/cli/featurelistcommand.hpp +++ b/lib/cli/featurelistcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FEATURELISTCOMMAND_H #define FEATURELISTCOMMAND_H diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp index bfb6026a6..a882104f6 100644 --- a/lib/cli/featureutility.cpp +++ b/lib/cli/featureutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/featureutility.hpp" #include "base/logger.hpp" diff --git a/lib/cli/featureutility.hpp b/lib/cli/featureutility.hpp index a153f53ac..9cb2128c6 100644 --- a/lib/cli/featureutility.hpp +++ b/lib/cli/featureutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FEATUREUTILITY_H #define FEATUREUTILITY_H diff --git a/lib/cli/i2-cli.hpp b/lib/cli/i2-cli.hpp index f0770f6e4..86e5ddd14 100644 --- a/lib/cli/i2-cli.hpp +++ b/lib/cli/i2-cli.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2CLI_H #define I2CLI_H diff --git a/lib/cli/internalsignalcommand.cpp b/lib/cli/internalsignalcommand.cpp index 24797de12..b09796569 100644 --- a/lib/cli/internalsignalcommand.cpp +++ b/lib/cli/internalsignalcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/internalsignalcommand.hpp" #include "base/logger.hpp" diff --git a/lib/cli/internalsignalcommand.hpp b/lib/cli/internalsignalcommand.hpp index 98f134d23..d599b80cd 100644 --- a/lib/cli/internalsignalcommand.hpp +++ b/lib/cli/internalsignalcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INTERNALSIGNALCOMMAND_H #define INTERNALSIGNALCOMMAND_H diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index 166c8425b..82ba04289 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/nodesetupcommand.hpp" #include "cli/nodeutility.hpp" diff --git a/lib/cli/nodesetupcommand.hpp b/lib/cli/nodesetupcommand.hpp index 16d0b6c0f..d25d21e11 100644 --- a/lib/cli/nodesetupcommand.hpp +++ b/lib/cli/nodesetupcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NODESETUPCOMMAND_H #define NODESETUPCOMMAND_H diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index 3f0aead7c..da9167c36 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/nodeutility.hpp" #include "cli/clicommand.hpp" diff --git a/lib/cli/nodeutility.hpp b/lib/cli/nodeutility.hpp index 60d1b8217..7016b6bae 100644 --- a/lib/cli/nodeutility.hpp +++ b/lib/cli/nodeutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NODEUTILITY_H #define NODEUTILITY_H diff --git a/lib/cli/nodewizardcommand.cpp b/lib/cli/nodewizardcommand.cpp index ea5759305..bb48bfc75 100644 --- a/lib/cli/nodewizardcommand.cpp +++ b/lib/cli/nodewizardcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/nodewizardcommand.hpp" #include "cli/nodeutility.hpp" diff --git a/lib/cli/nodewizardcommand.hpp b/lib/cli/nodewizardcommand.hpp index fcf9e5495..e295ee7f8 100644 --- a/lib/cli/nodewizardcommand.hpp +++ b/lib/cli/nodewizardcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NODEWIZARDCOMMAND_H #define NODEWIZARDCOMMAND_H diff --git a/lib/cli/objectlistcommand.cpp b/lib/cli/objectlistcommand.cpp index 89859fe77..f931d8c25 100644 --- a/lib/cli/objectlistcommand.cpp +++ b/lib/cli/objectlistcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/objectlistcommand.hpp" #include "cli/objectlistutility.hpp" diff --git a/lib/cli/objectlistcommand.hpp b/lib/cli/objectlistcommand.hpp index 067f90514..bafe3ec71 100644 --- a/lib/cli/objectlistcommand.hpp +++ b/lib/cli/objectlistcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTLISTCOMMAND_H #define OBJECTLISTCOMMAND_H diff --git a/lib/cli/objectlistutility.cpp b/lib/cli/objectlistutility.cpp index 00de35b14..a8135d98a 100644 --- a/lib/cli/objectlistutility.cpp +++ b/lib/cli/objectlistutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/objectlistutility.hpp" #include "base/json.hpp" diff --git a/lib/cli/objectlistutility.hpp b/lib/cli/objectlistutility.hpp index 3c7a48f00..ee1b97c4d 100644 --- a/lib/cli/objectlistutility.hpp +++ b/lib/cli/objectlistutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTLISTUTILITY_H #define OBJECTLISTUTILITY_H diff --git a/lib/cli/pkinewcacommand.cpp b/lib/cli/pkinewcacommand.cpp index f67dd4276..eba08c69f 100644 --- a/lib/cli/pkinewcacommand.cpp +++ b/lib/cli/pkinewcacommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkinewcacommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkinewcacommand.hpp b/lib/cli/pkinewcacommand.hpp index d1058d20e..5b1bff645 100644 --- a/lib/cli/pkinewcacommand.hpp +++ b/lib/cli/pkinewcacommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKINEWCACOMMAND_H #define PKINEWCACOMMAND_H diff --git a/lib/cli/pkinewcertcommand.cpp b/lib/cli/pkinewcertcommand.cpp index 8ee01b0b6..5201d9239 100644 --- a/lib/cli/pkinewcertcommand.cpp +++ b/lib/cli/pkinewcertcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkinewcertcommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkinewcertcommand.hpp b/lib/cli/pkinewcertcommand.hpp index 57e0417af..0c39bb6fb 100644 --- a/lib/cli/pkinewcertcommand.hpp +++ b/lib/cli/pkinewcertcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKINEWCERTCOMMAND_H #define PKINEWCERTCOMMAND_H diff --git a/lib/cli/pkirequestcommand.cpp b/lib/cli/pkirequestcommand.cpp index 0f2cc6d8d..d2b79f0a9 100644 --- a/lib/cli/pkirequestcommand.cpp +++ b/lib/cli/pkirequestcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkirequestcommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkirequestcommand.hpp b/lib/cli/pkirequestcommand.hpp index d6f5f202a..6e2a39334 100644 --- a/lib/cli/pkirequestcommand.hpp +++ b/lib/cli/pkirequestcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKIREQUESTCOMMAND_H #define PKIREQUESTCOMMAND_H diff --git a/lib/cli/pkisavecertcommand.cpp b/lib/cli/pkisavecertcommand.cpp index d78f3202b..dbde44339 100644 --- a/lib/cli/pkisavecertcommand.cpp +++ b/lib/cli/pkisavecertcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkisavecertcommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkisavecertcommand.hpp b/lib/cli/pkisavecertcommand.hpp index 1b362e435..c552eefc2 100644 --- a/lib/cli/pkisavecertcommand.hpp +++ b/lib/cli/pkisavecertcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKISAVECERTCOMMAND_H #define PKISAVECERTCOMMAND_H diff --git a/lib/cli/pkisigncsrcommand.cpp b/lib/cli/pkisigncsrcommand.cpp index c03f1a0fc..ce1427bcd 100644 --- a/lib/cli/pkisigncsrcommand.cpp +++ b/lib/cli/pkisigncsrcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkisigncsrcommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkisigncsrcommand.hpp b/lib/cli/pkisigncsrcommand.hpp index 0de37578e..a66fd3935 100644 --- a/lib/cli/pkisigncsrcommand.hpp +++ b/lib/cli/pkisigncsrcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKISIGNCSRCOMMAND_H #define PKISIGNCSRCOMMAND_H diff --git a/lib/cli/pkiticketcommand.cpp b/lib/cli/pkiticketcommand.cpp index 20110cb6d..82f3586f0 100644 --- a/lib/cli/pkiticketcommand.cpp +++ b/lib/cli/pkiticketcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/pkiticketcommand.hpp" #include "remote/pkiutility.hpp" diff --git a/lib/cli/pkiticketcommand.hpp b/lib/cli/pkiticketcommand.hpp index 14dfe255e..500ce864c 100644 --- a/lib/cli/pkiticketcommand.hpp +++ b/lib/cli/pkiticketcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKITICKETCOMMAND_H #define PKITICKETCOMMAND_H diff --git a/lib/cli/troubleshootcommand.hpp b/lib/cli/troubleshootcommand.hpp index 2646ec0ec..56a4f41c8 100644 --- a/lib/cli/troubleshootcommand.hpp +++ b/lib/cli/troubleshootcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TROUBLESHOOTCOMMAND_H #define TROUBLESHOOTCOMMAND_H diff --git a/lib/cli/variablegetcommand.cpp b/lib/cli/variablegetcommand.cpp index 564552d19..c05ac965a 100644 --- a/lib/cli/variablegetcommand.cpp +++ b/lib/cli/variablegetcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/variablegetcommand.hpp" #include "cli/variableutility.hpp" diff --git a/lib/cli/variablegetcommand.hpp b/lib/cli/variablegetcommand.hpp index f85b24a21..9479b3a43 100644 --- a/lib/cli/variablegetcommand.hpp +++ b/lib/cli/variablegetcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VARIABLEGETCOMMAND_H #define VARIABLEGETCOMMAND_H diff --git a/lib/cli/variablelistcommand.cpp b/lib/cli/variablelistcommand.cpp index 1fe58dbdd..b7ba1be3f 100644 --- a/lib/cli/variablelistcommand.cpp +++ b/lib/cli/variablelistcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/variablelistcommand.hpp" #include "cli/variableutility.hpp" diff --git a/lib/cli/variablelistcommand.hpp b/lib/cli/variablelistcommand.hpp index f96cf3a86..909d9eb74 100644 --- a/lib/cli/variablelistcommand.hpp +++ b/lib/cli/variablelistcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VARIABLELISTCOMMAND_H #define VARIABLELISTCOMMAND_H diff --git a/lib/cli/variableutility.cpp b/lib/cli/variableutility.cpp index cc97c03f9..398c9a0e5 100644 --- a/lib/cli/variableutility.cpp +++ b/lib/cli/variableutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/variableutility.hpp" #include "base/logger.hpp" diff --git a/lib/cli/variableutility.hpp b/lib/cli/variableutility.hpp index f758a9287..69869b2b6 100644 --- a/lib/cli/variableutility.hpp +++ b/lib/cli/variableutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VARIABLEUTILITY_H #define VARIABLEUTILITY_H diff --git a/lib/compat/checkresultreader.cpp b/lib/compat/checkresultreader.cpp index f900ad189..656804313 100644 --- a/lib/compat/checkresultreader.cpp +++ b/lib/compat/checkresultreader.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/compatutility.hpp" #include "compat/checkresultreader.hpp" diff --git a/lib/compat/checkresultreader.hpp b/lib/compat/checkresultreader.hpp index 53068b0be..6cd28e318 100644 --- a/lib/compat/checkresultreader.hpp +++ b/lib/compat/checkresultreader.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CHECKRESULTREADER_H #define CHECKRESULTREADER_H diff --git a/lib/compat/checkresultreader.ti b/lib/compat/checkresultreader.ti index 86b5ca701..0132818cf 100644 --- a/lib/compat/checkresultreader.ti +++ b/lib/compat/checkresultreader.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/compat/compatlogger.cpp b/lib/compat/compatlogger.cpp index 8c177c23a..87a4da5dc 100644 --- a/lib/compat/compatlogger.cpp +++ b/lib/compat/compatlogger.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "compat/compatlogger.hpp" #include "compat/compatlogger-ti.cpp" diff --git a/lib/compat/compatlogger.hpp b/lib/compat/compatlogger.hpp index 94a62756f..9fb0b2978 100644 --- a/lib/compat/compatlogger.hpp +++ b/lib/compat/compatlogger.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMPATLOGGER_H #define COMPATLOGGER_H diff --git a/lib/compat/compatlogger.ti b/lib/compat/compatlogger.ti index e6192f5b5..56431eccd 100644 --- a/lib/compat/compatlogger.ti +++ b/lib/compat/compatlogger.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/compat/externalcommandlistener.cpp b/lib/compat/externalcommandlistener.cpp index 84d7adb16..1d849225c 100644 --- a/lib/compat/externalcommandlistener.cpp +++ b/lib/compat/externalcommandlistener.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "compat/externalcommandlistener.hpp" #include "compat/externalcommandlistener-ti.cpp" diff --git a/lib/compat/externalcommandlistener.hpp b/lib/compat/externalcommandlistener.hpp index 370dec668..895531f78 100644 --- a/lib/compat/externalcommandlistener.hpp +++ b/lib/compat/externalcommandlistener.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXTERNALCOMMANDLISTENER_H #define EXTERNALCOMMANDLISTENER_H diff --git a/lib/compat/externalcommandlistener.ti b/lib/compat/externalcommandlistener.ti index 3ba8d3220..5b529442e 100644 --- a/lib/compat/externalcommandlistener.ti +++ b/lib/compat/externalcommandlistener.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/compat/statusdatawriter.cpp b/lib/compat/statusdatawriter.cpp index 95514f2e5..11103336b 100644 --- a/lib/compat/statusdatawriter.cpp +++ b/lib/compat/statusdatawriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "compat/statusdatawriter.hpp" #include "compat/statusdatawriter-ti.cpp" diff --git a/lib/compat/statusdatawriter.hpp b/lib/compat/statusdatawriter.hpp index ed6a35616..31a5efe54 100644 --- a/lib/compat/statusdatawriter.hpp +++ b/lib/compat/statusdatawriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STATUSDATAWRITER_H #define STATUSDATAWRITER_H diff --git a/lib/compat/statusdatawriter.ti b/lib/compat/statusdatawriter.ti index 346540003..cc7eb113f 100644 --- a/lib/compat/statusdatawriter.ti +++ b/lib/compat/statusdatawriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/config/activationcontext.cpp b/lib/config/activationcontext.cpp index c9bd3897d..d05087552 100644 --- a/lib/config/activationcontext.cpp +++ b/lib/config/activationcontext.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/activationcontext.hpp" #include "base/exception.hpp" diff --git a/lib/config/activationcontext.hpp b/lib/config/activationcontext.hpp index df4ce58a5..3fe5d09ab 100644 --- a/lib/config/activationcontext.hpp +++ b/lib/config/activationcontext.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ACTIVATIONCONTEXT_H #define ACTIVATIONCONTEXT_H diff --git a/lib/config/applyrule.cpp b/lib/config/applyrule.cpp index e7200c314..f7b7cbdd2 100644 --- a/lib/config/applyrule.cpp +++ b/lib/config/applyrule.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/applyrule.hpp" #include "base/logger.hpp" diff --git a/lib/config/applyrule.hpp b/lib/config/applyrule.hpp index b4feff743..bc4868b9e 100644 --- a/lib/config/applyrule.hpp +++ b/lib/config/applyrule.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APPLYRULE_H #define APPLYRULE_H diff --git a/lib/config/configcompiler.cpp b/lib/config/configcompiler.cpp index 44f5c475b..8f450994f 100644 --- a/lib/config/configcompiler.cpp +++ b/lib/config/configcompiler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configcompiler.hpp" #include "config/configitem.hpp" diff --git a/lib/config/configcompiler.hpp b/lib/config/configcompiler.hpp index 8d10c72e1..b89fdf05c 100644 --- a/lib/config/configcompiler.hpp +++ b/lib/config/configcompiler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGCOMPILER_H #define CONFIGCOMPILER_H diff --git a/lib/config/configcompilercontext.cpp b/lib/config/configcompilercontext.cpp index 03843e89b..4a04b258b 100644 --- a/lib/config/configcompilercontext.cpp +++ b/lib/config/configcompilercontext.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configcompilercontext.hpp" #include "base/singleton.hpp" diff --git a/lib/config/configcompilercontext.hpp b/lib/config/configcompilercontext.hpp index 145f682dd..58c55d539 100644 --- a/lib/config/configcompilercontext.hpp +++ b/lib/config/configcompilercontext.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGCOMPILERCONTEXT_H #define CONFIGCOMPILERCONTEXT_H diff --git a/lib/config/configfragment.hpp b/lib/config/configfragment.hpp index 9d3bf9ab8..55038f8bf 100644 --- a/lib/config/configfragment.hpp +++ b/lib/config/configfragment.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGFRAGMENT_H #define CONFIGFRAGMENT_H diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 1fd640cff..1c3b950d7 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configitem.hpp" #include "config/configcompilercontext.hpp" diff --git a/lib/config/configitem.hpp b/lib/config/configitem.hpp index 54c664c57..1064fb273 100644 --- a/lib/config/configitem.hpp +++ b/lib/config/configitem.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGITEM_H #define CONFIGITEM_H diff --git a/lib/config/configitembuilder.cpp b/lib/config/configitembuilder.cpp index 2652761fb..6a64c76a8 100644 --- a/lib/config/configitembuilder.cpp +++ b/lib/config/configitembuilder.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configitembuilder.hpp" #include "base/configtype.hpp" diff --git a/lib/config/configitembuilder.hpp b/lib/config/configitembuilder.hpp index ceb29e202..792e351b7 100644 --- a/lib/config/configitembuilder.hpp +++ b/lib/config/configitembuilder.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGITEMBUILDER_H #define CONFIGITEMBUILDER_H diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index e2c8bef31..814a15304 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/expression.hpp" #include "config/configitem.hpp" diff --git a/lib/config/expression.hpp b/lib/config/expression.hpp index 390f1cef0..6c36f06e7 100644 --- a/lib/config/expression.hpp +++ b/lib/config/expression.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXPRESSION_H #define EXPRESSION_H diff --git a/lib/config/i2-config.hpp b/lib/config/i2-config.hpp index 05d99690e..8c26287f9 100644 --- a/lib/config/i2-config.hpp +++ b/lib/config/i2-config.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2CONFIG_H #define I2CONFIG_H diff --git a/lib/config/objectrule.cpp b/lib/config/objectrule.cpp index c46836a6e..6a74a40b9 100644 --- a/lib/config/objectrule.cpp +++ b/lib/config/objectrule.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/objectrule.hpp" #include diff --git a/lib/config/objectrule.hpp b/lib/config/objectrule.hpp index 04bf7628a..d093c9f5f 100644 --- a/lib/config/objectrule.hpp +++ b/lib/config/objectrule.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTRULE_H #define OBJECTRULE_H diff --git a/lib/config/vmops.hpp b/lib/config/vmops.hpp index 2e1ba76a2..72d820dfb 100644 --- a/lib/config/vmops.hpp +++ b/lib/config/vmops.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VMOPS_H #define VMOPS_H diff --git a/lib/db_ido/commanddbobject.cpp b/lib/db_ido/commanddbobject.cpp index 277c61709..2ac167aab 100644 --- a/lib/db_ido/commanddbobject.cpp +++ b/lib/db_ido/commanddbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/commanddbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/commanddbobject.hpp b/lib/db_ido/commanddbobject.hpp index 80c423830..6d227472b 100644 --- a/lib/db_ido/commanddbobject.hpp +++ b/lib/db_ido/commanddbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMMANDDBOBJECT_H #define COMMANDDBOBJECT_H diff --git a/lib/db_ido/db_ido-itl.conf b/lib/db_ido/db_ido-itl.conf index 61a84c9f1..e2c42c3d0 100644 --- a/lib/db_ido/db_ido-itl.conf +++ b/lib/db_ido/db_ido-itl.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ System.assert(Internal.run_with_activation_context(function() { template CheckCommand "ido-check-command" use (checkFunc = Internal.IdoCheck) { diff --git a/lib/db_ido/dbconnection.cpp b/lib/db_ido/dbconnection.cpp index b8e1a50f2..80c9fe336 100644 --- a/lib/db_ido/dbconnection.cpp +++ b/lib/db_ido/dbconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbconnection.hpp" #include "db_ido/dbconnection-ti.cpp" diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index ba68a44d1..3cb049f64 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBCONNECTION_H #define DBCONNECTION_H diff --git a/lib/db_ido/dbconnection.ti b/lib/db_ido/dbconnection.ti index 2200ee1a1..7a4b949cc 100644 --- a/lib/db_ido/dbconnection.ti +++ b/lib/db_ido/dbconnection.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbquery.hpp" #include "base/configobject.hpp" diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index 00e08e0a4..111999b5e 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbevents.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/dbevents.hpp b/lib/db_ido/dbevents.hpp index 0db322aea..858f3b3da 100644 --- a/lib/db_ido/dbevents.hpp +++ b/lib/db_ido/dbevents.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBEVENTS_H #define DBEVENTS_H diff --git a/lib/db_ido/dbobject.cpp b/lib/db_ido/dbobject.cpp index a615b873f..c48739ede 100644 --- a/lib/db_ido/dbobject.cpp +++ b/lib/db_ido/dbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/dbobject.hpp b/lib/db_ido/dbobject.hpp index 7a0490d04..21c23504c 100644 --- a/lib/db_ido/dbobject.hpp +++ b/lib/db_ido/dbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBOBJECT_H #define DBOBJECT_H diff --git a/lib/db_ido/dbquery.cpp b/lib/db_ido/dbquery.cpp index a5e4fb616..01196a537 100644 --- a/lib/db_ido/dbquery.cpp +++ b/lib/db_ido/dbquery.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbquery.hpp" #include "base/initialize.hpp" diff --git a/lib/db_ido/dbquery.hpp b/lib/db_ido/dbquery.hpp index 1badcbf14..fecb2e346 100644 --- a/lib/db_ido/dbquery.hpp +++ b/lib/db_ido/dbquery.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBQUERY_H #define DBQUERY_H diff --git a/lib/db_ido/dbreference.cpp b/lib/db_ido/dbreference.cpp index 1b4f4f561..e8f13c0d7 100644 --- a/lib/db_ido/dbreference.cpp +++ b/lib/db_ido/dbreference.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "dbreference.hpp" diff --git a/lib/db_ido/dbreference.hpp b/lib/db_ido/dbreference.hpp index 2942b3fd9..70edf9a90 100644 --- a/lib/db_ido/dbreference.hpp +++ b/lib/db_ido/dbreference.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBREFERENCE_H #define DBREFERENCE_H diff --git a/lib/db_ido/dbtype.cpp b/lib/db_ido/dbtype.cpp index 123901ad2..0870490cb 100644 --- a/lib/db_ido/dbtype.cpp +++ b/lib/db_ido/dbtype.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbtype.hpp" #include "db_ido/dbconnection.hpp" diff --git a/lib/db_ido/dbtype.hpp b/lib/db_ido/dbtype.hpp index 292f36d80..a667ecc6e 100644 --- a/lib/db_ido/dbtype.hpp +++ b/lib/db_ido/dbtype.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBTYPE_H #define DBTYPE_H diff --git a/lib/db_ido/dbvalue.cpp b/lib/db_ido/dbvalue.cpp index c9ea1b6ba..e1e3e6c69 100644 --- a/lib/db_ido/dbvalue.cpp +++ b/lib/db_ido/dbvalue.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbvalue.hpp" diff --git a/lib/db_ido/dbvalue.hpp b/lib/db_ido/dbvalue.hpp index 83e285442..cb59e3ad4 100644 --- a/lib/db_ido/dbvalue.hpp +++ b/lib/db_ido/dbvalue.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DBVALUE_H #define DBVALUE_H diff --git a/lib/db_ido/endpointdbobject.cpp b/lib/db_ido/endpointdbobject.cpp index ed6a82c22..ad343cfa0 100644 --- a/lib/db_ido/endpointdbobject.cpp +++ b/lib/db_ido/endpointdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/endpointdbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/endpointdbobject.hpp b/lib/db_ido/endpointdbobject.hpp index 10524ca4a..e4fba360f 100644 --- a/lib/db_ido/endpointdbobject.hpp +++ b/lib/db_ido/endpointdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ENDPOINTDBOBJECT_H #define ENDPOINTDBOBJECT_H diff --git a/lib/db_ido/hostdbobject.cpp b/lib/db_ido/hostdbobject.cpp index a50d59166..eb93f8b11 100644 --- a/lib/db_ido/hostdbobject.cpp +++ b/lib/db_ido/hostdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/hostdbobject.hpp" #include "db_ido/hostgroupdbobject.hpp" diff --git a/lib/db_ido/hostdbobject.hpp b/lib/db_ido/hostdbobject.hpp index 111836b11..9fff10ad5 100644 --- a/lib/db_ido/hostdbobject.hpp +++ b/lib/db_ido/hostdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOSTDBOBJECT_H #define HOSTDBOBJECT_H diff --git a/lib/db_ido/hostgroupdbobject.cpp b/lib/db_ido/hostgroupdbobject.cpp index 013b75f7e..cef6aa2c5 100644 --- a/lib/db_ido/hostgroupdbobject.cpp +++ b/lib/db_ido/hostgroupdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/hostgroupdbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/hostgroupdbobject.hpp b/lib/db_ido/hostgroupdbobject.hpp index 5c77b40b8..9c48f2995 100644 --- a/lib/db_ido/hostgroupdbobject.hpp +++ b/lib/db_ido/hostgroupdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOSTGROUPDBOBJECT_H #define HOSTGROUPDBOBJECT_H diff --git a/lib/db_ido/i2-db_ido.hpp b/lib/db_ido/i2-db_ido.hpp index e88a1a05f..1da9fdcf8 100644 --- a/lib/db_ido/i2-db_ido.hpp +++ b/lib/db_ido/i2-db_ido.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2DB_IDO_H #define I2DB_IDO_H diff --git a/lib/db_ido/idochecktask.cpp b/lib/db_ido/idochecktask.cpp index 871aa27d5..33d20657e 100644 --- a/lib/db_ido/idochecktask.cpp +++ b/lib/db_ido/idochecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/idochecktask.hpp" #include "icinga/host.hpp" diff --git a/lib/db_ido/idochecktask.hpp b/lib/db_ido/idochecktask.hpp index b0705c5bf..5868c3867 100644 --- a/lib/db_ido/idochecktask.hpp +++ b/lib/db_ido/idochecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef IDOCHECKTASK_H #define IDOCHECKTASK_H diff --git a/lib/db_ido/servicedbobject.cpp b/lib/db_ido/servicedbobject.cpp index 903bba655..bbf3e21aa 100644 --- a/lib/db_ido/servicedbobject.cpp +++ b/lib/db_ido/servicedbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/servicedbobject.hpp" #include "db_ido/servicegroupdbobject.hpp" diff --git a/lib/db_ido/servicedbobject.hpp b/lib/db_ido/servicedbobject.hpp index 3693ff3f7..19824be70 100644 --- a/lib/db_ido/servicedbobject.hpp +++ b/lib/db_ido/servicedbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICEDBOBJECT_H #define SERVICEDBOBJECT_H diff --git a/lib/db_ido/servicegroupdbobject.cpp b/lib/db_ido/servicegroupdbobject.cpp index b667b3ed9..ea4d40c32 100644 --- a/lib/db_ido/servicegroupdbobject.cpp +++ b/lib/db_ido/servicegroupdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/servicegroupdbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/servicegroupdbobject.hpp b/lib/db_ido/servicegroupdbobject.hpp index 23e1f2d7c..7f0d6c15a 100644 --- a/lib/db_ido/servicegroupdbobject.hpp +++ b/lib/db_ido/servicegroupdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICEGROUPDBOBJECT_H #define SERVICEGROUPDBOBJECT_H diff --git a/lib/db_ido/timeperioddbobject.cpp b/lib/db_ido/timeperioddbobject.cpp index d7f41141c..98997f527 100644 --- a/lib/db_ido/timeperioddbobject.cpp +++ b/lib/db_ido/timeperioddbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/timeperioddbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/timeperioddbobject.hpp b/lib/db_ido/timeperioddbobject.hpp index 5759de109..e3cc13cb7 100644 --- a/lib/db_ido/timeperioddbobject.hpp +++ b/lib/db_ido/timeperioddbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TIMEPERIODDBOBJECT_H #define TIMEPERIODDBOBJECT_H diff --git a/lib/db_ido/userdbobject.cpp b/lib/db_ido/userdbobject.cpp index 10c55b2a3..f0d80b604 100644 --- a/lib/db_ido/userdbobject.cpp +++ b/lib/db_ido/userdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/userdbobject.hpp" #include "db_ido/usergroupdbobject.hpp" diff --git a/lib/db_ido/userdbobject.hpp b/lib/db_ido/userdbobject.hpp index 6eb742193..e0f36c5fb 100644 --- a/lib/db_ido/userdbobject.hpp +++ b/lib/db_ido/userdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef USERDBOBJECT_H #define USERDBOBJECT_H diff --git a/lib/db_ido/usergroupdbobject.cpp b/lib/db_ido/usergroupdbobject.cpp index 0bbde24d5..23b3581a7 100644 --- a/lib/db_ido/usergroupdbobject.cpp +++ b/lib/db_ido/usergroupdbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/usergroupdbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/usergroupdbobject.hpp b/lib/db_ido/usergroupdbobject.hpp index d387b79db..9469823ab 100644 --- a/lib/db_ido/usergroupdbobject.hpp +++ b/lib/db_ido/usergroupdbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef USERGROUPDBOBJECT_H #define USERGROUPDBOBJECT_H diff --git a/lib/db_ido/zonedbobject.cpp b/lib/db_ido/zonedbobject.cpp index a321dd3a8..b8ad0c196 100644 --- a/lib/db_ido/zonedbobject.cpp +++ b/lib/db_ido/zonedbobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/zonedbobject.hpp" #include "db_ido/dbtype.hpp" diff --git a/lib/db_ido/zonedbobject.hpp b/lib/db_ido/zonedbobject.hpp index 03ae4e3f6..3901c81b3 100644 --- a/lib/db_ido/zonedbobject.hpp +++ b/lib/db_ido/zonedbobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ZONEDBOBJECT_H #define ZONEDBOBJECT_H diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 9bbbeb0df..10c47666e 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido_mysql/idomysqlconnection.hpp" #include "db_ido_mysql/idomysqlconnection-ti.cpp" diff --git a/lib/db_ido_mysql/idomysqlconnection.hpp b/lib/db_ido_mysql/idomysqlconnection.hpp index 79946f34d..748243a4c 100644 --- a/lib/db_ido_mysql/idomysqlconnection.hpp +++ b/lib/db_ido_mysql/idomysqlconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef IDOMYSQLCONNECTION_H #define IDOMYSQLCONNECTION_H diff --git a/lib/db_ido_mysql/idomysqlconnection.ti b/lib/db_ido_mysql/idomysqlconnection.ti index ed84d09fa..ad5139703 100644 --- a/lib/db_ido_mysql/idomysqlconnection.ti +++ b/lib/db_ido_mysql/idomysqlconnection.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbconnection.hpp" diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 4724ab707..81e646ebd 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido_pgsql/idopgsqlconnection.hpp" #include "db_ido_pgsql/idopgsqlconnection-ti.cpp" diff --git a/lib/db_ido_pgsql/idopgsqlconnection.hpp b/lib/db_ido_pgsql/idopgsqlconnection.hpp index b3763a51a..83e4d3f9f 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.hpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef IDOPGSQLCONNECTION_H #define IDOPGSQLCONNECTION_H diff --git a/lib/db_ido_pgsql/idopgsqlconnection.ti b/lib/db_ido_pgsql/idopgsqlconnection.ti index d2b539203..90ca84ecd 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.ti +++ b/lib/db_ido_pgsql/idopgsqlconnection.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "db_ido/dbconnection.hpp" diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 6d2fc3fc5..a9939b9e3 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/apiactions.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/apiactions.hpp b/lib/icinga/apiactions.hpp index 9cd9fbbb9..c2c8b6188 100644 --- a/lib/icinga/apiactions.hpp +++ b/lib/icinga/apiactions.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APIACTIONS_H #define APIACTIONS_H diff --git a/lib/icinga/apievents.cpp b/lib/icinga/apievents.cpp index 55c8a541b..57760c598 100644 --- a/lib/icinga/apievents.cpp +++ b/lib/icinga/apievents.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/apievents.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/apievents.hpp b/lib/icinga/apievents.hpp index ce6d95451..e4dcc7835 100644 --- a/lib/icinga/apievents.hpp +++ b/lib/icinga/apievents.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APIEVENTS_H #define APIEVENTS_H diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 2437aa787..832decaf2 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/checkable-comment.cpp b/lib/icinga/checkable-comment.cpp index c0de3eca2..b2184e1ff 100644 --- a/lib/icinga/checkable-comment.cpp +++ b/lib/icinga/checkable-comment.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/service.hpp" #include "remote/configobjectutility.hpp" diff --git a/lib/icinga/checkable-dependency.cpp b/lib/icinga/checkable-dependency.cpp index 8c0d6e02e..10e39ab58 100644 --- a/lib/icinga/checkable-dependency.cpp +++ b/lib/icinga/checkable-dependency.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/service.hpp" #include "icinga/dependency.hpp" diff --git a/lib/icinga/checkable-downtime.cpp b/lib/icinga/checkable-downtime.cpp index 1df068442..dcc1539a8 100644 --- a/lib/icinga/checkable-downtime.cpp +++ b/lib/icinga/checkable-downtime.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/service.hpp" #include "base/configtype.hpp" diff --git a/lib/icinga/checkable-event.cpp b/lib/icinga/checkable-event.cpp index 900c40012..91b2a443d 100644 --- a/lib/icinga/checkable-event.cpp +++ b/lib/icinga/checkable-event.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/eventcommand.hpp" diff --git a/lib/icinga/checkable-flapping.cpp b/lib/icinga/checkable-flapping.cpp index d4e6987ca..d0c8f8ec0 100644 --- a/lib/icinga/checkable-flapping.cpp +++ b/lib/icinga/checkable-flapping.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/icingaapplication.hpp" diff --git a/lib/icinga/checkable-notification.cpp b/lib/icinga/checkable-notification.cpp index 2a909769c..abb33ad39 100644 --- a/lib/icinga/checkable-notification.cpp +++ b/lib/icinga/checkable-notification.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/icingaapplication.hpp" diff --git a/lib/icinga/checkable-script.cpp b/lib/icinga/checkable-script.cpp index d0fe3be6c..4a0d1d805 100644 --- a/lib/icinga/checkable-script.cpp +++ b/lib/icinga/checkable-script.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "base/configobject.hpp" diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp index c577848d5..a4c62500e 100644 --- a/lib/icinga/checkable.cpp +++ b/lib/icinga/checkable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/checkable-ti.cpp" diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 824f41b8d..29a5c6db0 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CHECKABLE_H #define CHECKABLE_H diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index d6a65a834..158c5ceae 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/icingaapplication.hpp" #include "icinga/customvarobject.hpp" diff --git a/lib/icinga/checkcommand.cpp b/lib/icinga/checkcommand.cpp index 4d33341c4..e0da41547 100644 --- a/lib/icinga/checkcommand.cpp +++ b/lib/icinga/checkcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkcommand.hpp" #include "icinga/checkcommand-ti.cpp" diff --git a/lib/icinga/checkcommand.hpp b/lib/icinga/checkcommand.hpp index 9bf12f412..6eb6119a3 100644 --- a/lib/icinga/checkcommand.hpp +++ b/lib/icinga/checkcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CHECKCOMMAND_H #define CHECKCOMMAND_H diff --git a/lib/icinga/checkcommand.ti b/lib/icinga/checkcommand.ti index 85275c8f2..c211f0f68 100644 --- a/lib/icinga/checkcommand.ti +++ b/lib/icinga/checkcommand.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/command.hpp" diff --git a/lib/icinga/checkresult.cpp b/lib/icinga/checkresult.cpp index 47288a22d..cb445af6c 100644 --- a/lib/icinga/checkresult.cpp +++ b/lib/icinga/checkresult.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkresult.hpp" #include "icinga/checkresult-ti.cpp" diff --git a/lib/icinga/checkresult.hpp b/lib/icinga/checkresult.hpp index ade435bc5..ac54d6b0d 100644 --- a/lib/icinga/checkresult.hpp +++ b/lib/icinga/checkresult.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CHECKRESULT_H #define CHECKRESULT_H diff --git a/lib/icinga/checkresult.ti b/lib/icinga/checkresult.ti index 91fcd894d..6fe49ae94 100644 --- a/lib/icinga/checkresult.ti +++ b/lib/icinga/checkresult.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ library icinga; diff --git a/lib/icinga/cib.cpp b/lib/icinga/cib.cpp index a0a8e1271..bed01e22a 100644 --- a/lib/icinga/cib.cpp +++ b/lib/icinga/cib.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/cib.hpp" #include "icinga/host.hpp" diff --git a/lib/icinga/cib.hpp b/lib/icinga/cib.hpp index 82f8c0da9..23a81f951 100644 --- a/lib/icinga/cib.hpp +++ b/lib/icinga/cib.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CIB_H #define CIB_H diff --git a/lib/icinga/clusterevents-check.cpp b/lib/icinga/clusterevents-check.cpp index 29b4e2445..28fa3fa19 100644 --- a/lib/icinga/clusterevents-check.cpp +++ b/lib/icinga/clusterevents-check.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/clusterevents.hpp" #include "remote/apilistener.hpp" diff --git a/lib/icinga/clusterevents.cpp b/lib/icinga/clusterevents.cpp index 6c54be340..11f43f7ad 100644 --- a/lib/icinga/clusterevents.cpp +++ b/lib/icinga/clusterevents.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/clusterevents.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/clusterevents.hpp b/lib/icinga/clusterevents.hpp index d2c2e48f2..5ad18c3d9 100644 --- a/lib/icinga/clusterevents.hpp +++ b/lib/icinga/clusterevents.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CLUSTEREVENTS_H #define CLUSTEREVENTS_H diff --git a/lib/icinga/command.cpp b/lib/icinga/command.cpp index 3de275943..8e0f357e7 100644 --- a/lib/icinga/command.cpp +++ b/lib/icinga/command.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/command.hpp" #include "icinga/command-ti.cpp" diff --git a/lib/icinga/command.hpp b/lib/icinga/command.hpp index 65c6b668a..19bb05013 100644 --- a/lib/icinga/command.hpp +++ b/lib/icinga/command.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMMAND_H #define COMMAND_H diff --git a/lib/icinga/command.ti b/lib/icinga/command.ti index 4f72e3569..5055ee3d5 100644 --- a/lib/icinga/command.ti +++ b/lib/icinga/command.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #include "base/function.hpp" diff --git a/lib/icinga/comment.cpp b/lib/icinga/comment.cpp index c4630354f..0945724ea 100644 --- a/lib/icinga/comment.cpp +++ b/lib/icinga/comment.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/comment.hpp" #include "icinga/comment-ti.cpp" diff --git a/lib/icinga/comment.hpp b/lib/icinga/comment.hpp index 89211b5e4..166654d31 100644 --- a/lib/icinga/comment.hpp +++ b/lib/icinga/comment.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMMENT_H #define COMMENT_H diff --git a/lib/icinga/comment.ti b/lib/icinga/comment.ti index 5baee7453..4bf667f31 100644 --- a/lib/icinga/comment.ti +++ b/lib/icinga/comment.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/utility.hpp" diff --git a/lib/icinga/compatutility.cpp b/lib/icinga/compatutility.cpp index d3e106be3..305d3b247 100644 --- a/lib/icinga/compatutility.cpp +++ b/lib/icinga/compatutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/compatutility.hpp" #include "icinga/checkcommand.hpp" diff --git a/lib/icinga/compatutility.hpp b/lib/icinga/compatutility.hpp index e6f49b3b6..7b96fb308 100644 --- a/lib/icinga/compatutility.hpp +++ b/lib/icinga/compatutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMPATUTILITY_H #define COMPATUTILITY_H diff --git a/lib/icinga/customvarobject.cpp b/lib/icinga/customvarobject.cpp index 90cb3a00e..fc1fd27b4 100644 --- a/lib/icinga/customvarobject.cpp +++ b/lib/icinga/customvarobject.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #include "icinga/customvarobject-ti.cpp" diff --git a/lib/icinga/customvarobject.hpp b/lib/icinga/customvarobject.hpp index 2c4a72510..e10ef3245 100644 --- a/lib/icinga/customvarobject.hpp +++ b/lib/icinga/customvarobject.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CUSTOMVAROBJECT_H #define CUSTOMVAROBJECT_H diff --git a/lib/icinga/customvarobject.ti b/lib/icinga/customvarobject.ti index 4231a01fe..18da48b00 100644 --- a/lib/icinga/customvarobject.ti +++ b/lib/icinga/customvarobject.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/icinga/dependency-apply.cpp b/lib/icinga/dependency-apply.cpp index 5304da1ff..0f8eddc5b 100644 --- a/lib/icinga/dependency-apply.cpp +++ b/lib/icinga/dependency-apply.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/dependency.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/dependency.cpp b/lib/icinga/dependency.cpp index 02073ba54..d2261cfe1 100644 --- a/lib/icinga/dependency.cpp +++ b/lib/icinga/dependency.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/dependency.hpp" #include "icinga/dependency-ti.cpp" diff --git a/lib/icinga/dependency.hpp b/lib/icinga/dependency.hpp index 1306594f7..6a80d84f5 100644 --- a/lib/icinga/dependency.hpp +++ b/lib/icinga/dependency.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DEPENDENCY_H #define DEPENDENCY_H diff --git a/lib/icinga/dependency.ti b/lib/icinga/dependency.ti index e43701c9a..62e6d8b31 100644 --- a/lib/icinga/dependency.ti +++ b/lib/icinga/dependency.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #include "icinga/checkable.hpp" diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 0f0a74ceb..856ac9b10 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/downtime.hpp" #include "icinga/downtime-ti.cpp" diff --git a/lib/icinga/downtime.hpp b/lib/icinga/downtime.hpp index 59209e8c9..c33d9017d 100644 --- a/lib/icinga/downtime.hpp +++ b/lib/icinga/downtime.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DOWNTIME_H #define DOWNTIME_H diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index fe80e0e77..1e8ec0a75 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/utility.hpp" diff --git a/lib/icinga/eventcommand.cpp b/lib/icinga/eventcommand.cpp index a7a035e9d..f9ab3be19 100644 --- a/lib/icinga/eventcommand.cpp +++ b/lib/icinga/eventcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/eventcommand.hpp" #include "icinga/eventcommand-ti.cpp" diff --git a/lib/icinga/eventcommand.hpp b/lib/icinga/eventcommand.hpp index 158a5b466..95bd1095a 100644 --- a/lib/icinga/eventcommand.hpp +++ b/lib/icinga/eventcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EVENTCOMMAND_H #define EVENTCOMMAND_H diff --git a/lib/icinga/eventcommand.ti b/lib/icinga/eventcommand.ti index c4eee11d0..a166d1eb8 100644 --- a/lib/icinga/eventcommand.ti +++ b/lib/icinga/eventcommand.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/command.hpp" diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index b2d2c3cb2..9f088ae67 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/externalcommandprocessor.hpp" #include "icinga/host.hpp" diff --git a/lib/icinga/externalcommandprocessor.hpp b/lib/icinga/externalcommandprocessor.hpp index 54e01fcf3..f7f0d75d6 100644 --- a/lib/icinga/externalcommandprocessor.hpp +++ b/lib/icinga/externalcommandprocessor.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXTERNALCOMMANDPROCESSOR_H #define EXTERNALCOMMANDPROCESSOR_H diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index 4f464652e..4b95ffa9f 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/host.hpp" #include "icinga/host-ti.cpp" diff --git a/lib/icinga/host.hpp b/lib/icinga/host.hpp index 28b09975c..a72a7874c 100644 --- a/lib/icinga/host.hpp +++ b/lib/icinga/host.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOST_H #define HOST_H diff --git a/lib/icinga/host.ti b/lib/icinga/host.ti index 9736d459c..03c606228 100644 --- a/lib/icinga/host.ti +++ b/lib/icinga/host.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/customvarobject.hpp" diff --git a/lib/icinga/hostgroup.cpp b/lib/icinga/hostgroup.cpp index a859139c2..02dc6d7c9 100644 --- a/lib/icinga/hostgroup.cpp +++ b/lib/icinga/hostgroup.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/hostgroup.hpp" #include "icinga/hostgroup-ti.cpp" diff --git a/lib/icinga/hostgroup.hpp b/lib/icinga/hostgroup.hpp index edeeae8d1..283930a23 100644 --- a/lib/icinga/hostgroup.hpp +++ b/lib/icinga/hostgroup.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOSTGROUP_H #define HOSTGROUP_H diff --git a/lib/icinga/hostgroup.ti b/lib/icinga/hostgroup.ti index f8ad91070..a4404eafe 100644 --- a/lib/icinga/hostgroup.ti +++ b/lib/icinga/hostgroup.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" diff --git a/lib/icinga/i2-icinga.hpp b/lib/icinga/i2-icinga.hpp index 3738eaf88..7163822da 100644 --- a/lib/icinga/i2-icinga.hpp +++ b/lib/icinga/i2-icinga.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2ICINGA_H #define I2ICINGA_H diff --git a/lib/icinga/icinga-itl.conf b/lib/icinga/icinga-itl.conf index 5e6546e71..22b688a7d 100644 --- a/lib/icinga/icinga-itl.conf +++ b/lib/icinga/icinga-itl.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ System.assert(Internal.run_with_activation_context(function() { template TimePeriod "legacy-timeperiod" use (LegacyTimePeriod = Internal.LegacyTimePeriod) default { diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index bcad227b5..b0f62b208 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/icingaapplication.hpp" #include "icinga/icingaapplication-ti.cpp" diff --git a/lib/icinga/icingaapplication.hpp b/lib/icinga/icingaapplication.hpp index cb4b8717e..c878f91ce 100644 --- a/lib/icinga/icingaapplication.hpp +++ b/lib/icinga/icingaapplication.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ICINGAAPPLICATION_H #define ICINGAAPPLICATION_H diff --git a/lib/icinga/icingaapplication.ti b/lib/icinga/icingaapplication.ti index dd4e060b1..867efd3bd 100644 --- a/lib/icinga/icingaapplication.ti +++ b/lib/icinga/icingaapplication.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/application.hpp" diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 6433d0d6c..a599a1c15 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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" diff --git a/lib/icinga/legacytimeperiod.hpp b/lib/icinga/legacytimeperiod.hpp index 9e6ee257a..2b9767b2f 100644 --- a/lib/icinga/legacytimeperiod.hpp +++ b/lib/icinga/legacytimeperiod.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LEGACYTIMEPERIOD_H #define LEGACYTIMEPERIOD_H diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index dfe3c3c0e..df1e41d17 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/macroprocessor.hpp" #include "icinga/macroresolver.hpp" diff --git a/lib/icinga/macroprocessor.hpp b/lib/icinga/macroprocessor.hpp index 9a17d5131..1ff21efbf 100644 --- a/lib/icinga/macroprocessor.hpp +++ b/lib/icinga/macroprocessor.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MACROPROCESSOR_H #define MACROPROCESSOR_H diff --git a/lib/icinga/macroresolver.hpp b/lib/icinga/macroresolver.hpp index 523487231..ea29ce1e4 100644 --- a/lib/icinga/macroresolver.hpp +++ b/lib/icinga/macroresolver.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MACRORESOLVER_H #define MACRORESOLVER_H diff --git a/lib/icinga/notification-apply.cpp b/lib/icinga/notification-apply.cpp index 653f52e57..713bacea7 100644 --- a/lib/icinga/notification-apply.cpp +++ b/lib/icinga/notification-apply.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/notification.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index 507c814c0..9379cf40a 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/notification.hpp" #include "icinga/notification-ti.cpp" diff --git a/lib/icinga/notification.hpp b/lib/icinga/notification.hpp index 1be21603f..32333a559 100644 --- a/lib/icinga/notification.hpp +++ b/lib/icinga/notification.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NOTIFICATION_H #define NOTIFICATION_H diff --git a/lib/icinga/notification.ti b/lib/icinga/notification.ti index 8cae58072..04e6214ea 100644 --- a/lib/icinga/notification.ti +++ b/lib/icinga/notification.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #impl_include "icinga/notificationcommand.hpp" diff --git a/lib/icinga/notificationcommand.cpp b/lib/icinga/notificationcommand.cpp index 492566162..8ae3e82a5 100644 --- a/lib/icinga/notificationcommand.cpp +++ b/lib/icinga/notificationcommand.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/notificationcommand.hpp" #include "icinga/notificationcommand-ti.cpp" diff --git a/lib/icinga/notificationcommand.hpp b/lib/icinga/notificationcommand.hpp index ff288ac76..210c91e86 100644 --- a/lib/icinga/notificationcommand.hpp +++ b/lib/icinga/notificationcommand.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NOTIFICATIONCOMMAND_H #define NOTIFICATIONCOMMAND_H diff --git a/lib/icinga/notificationcommand.ti b/lib/icinga/notificationcommand.ti index cf7b29c98..51207a362 100644 --- a/lib/icinga/notificationcommand.ti +++ b/lib/icinga/notificationcommand.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/command.hpp" diff --git a/lib/icinga/objectutils.cpp b/lib/icinga/objectutils.cpp index eacbace69..559ca4328 100644 --- a/lib/icinga/objectutils.cpp +++ b/lib/icinga/objectutils.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/objectutils.hpp" #include "icinga/host.hpp" diff --git a/lib/icinga/objectutils.hpp b/lib/icinga/objectutils.hpp index 16f269d24..42e295342 100644 --- a/lib/icinga/objectutils.hpp +++ b/lib/icinga/objectutils.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTUTILS_H #define OBJECTUTILS_H diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 2a15c0e25..d19399870 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/pluginutility.hpp" #include "icinga/macroprocessor.hpp" diff --git a/lib/icinga/pluginutility.hpp b/lib/icinga/pluginutility.hpp index a11b558a0..0ea56e2c5 100644 --- a/lib/icinga/pluginutility.hpp +++ b/lib/icinga/pluginutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PLUGINUTILITY_H #define PLUGINUTILITY_H diff --git a/lib/icinga/scheduleddowntime-apply.cpp b/lib/icinga/scheduleddowntime-apply.cpp index 498b7b1ed..770688cd4 100644 --- a/lib/icinga/scheduleddowntime-apply.cpp +++ b/lib/icinga/scheduleddowntime-apply.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/scheduleddowntime.hpp" #include "icinga/service.hpp" diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 37c3693bd..113f9fc4c 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/scheduleddowntime.hpp" #include "icinga/scheduleddowntime-ti.cpp" diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index 4322999b7..90e12d240 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SCHEDULEDDOWNTIME_H #define SCHEDULEDDOWNTIME_H diff --git a/lib/icinga/scheduleddowntime.ti b/lib/icinga/scheduleddowntime.ti index 27195d21f..7dfb8bf39 100644 --- a/lib/icinga/scheduleddowntime.ti +++ b/lib/icinga/scheduleddowntime.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #impl_include "icinga/service.hpp" diff --git a/lib/icinga/service-apply.cpp b/lib/icinga/service-apply.cpp index 8cbce1bb7..6479aac52 100644 --- a/lib/icinga/service-apply.cpp +++ b/lib/icinga/service-apply.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/service.hpp" #include "config/configitembuilder.hpp" diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index ef8a99df9..63fd70445 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/service.hpp" #include "icinga/service-ti.cpp" diff --git a/lib/icinga/service.hpp b/lib/icinga/service.hpp index 44e9c3806..8617eee3b 100644 --- a/lib/icinga/service.hpp +++ b/lib/icinga/service.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICE_H #define SERVICE_H diff --git a/lib/icinga/service.ti b/lib/icinga/service.ti index 73e041b3f..bab1ebc8f 100644 --- a/lib/icinga/service.ti +++ b/lib/icinga/service.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/checkable.hpp" #include "icinga/host.hpp" diff --git a/lib/icinga/servicegroup.cpp b/lib/icinga/servicegroup.cpp index 7ef7347cb..45d953f63 100644 --- a/lib/icinga/servicegroup.cpp +++ b/lib/icinga/servicegroup.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/servicegroup.hpp" #include "icinga/servicegroup-ti.cpp" diff --git a/lib/icinga/servicegroup.hpp b/lib/icinga/servicegroup.hpp index a0c375caf..a4fe132fb 100644 --- a/lib/icinga/servicegroup.hpp +++ b/lib/icinga/servicegroup.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICEGROUP_H #define SERVICEGROUP_H diff --git a/lib/icinga/servicegroup.ti b/lib/icinga/servicegroup.ti index 4fea8d87b..69f300508 100644 --- a/lib/icinga/servicegroup.ti +++ b/lib/icinga/servicegroup.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" diff --git a/lib/icinga/timeperiod.cpp b/lib/icinga/timeperiod.cpp index f71e36c74..21b1271d7 100644 --- a/lib/icinga/timeperiod.cpp +++ b/lib/icinga/timeperiod.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/timeperiod.hpp" #include "icinga/timeperiod-ti.cpp" diff --git a/lib/icinga/timeperiod.hpp b/lib/icinga/timeperiod.hpp index d5a589508..a5a2f73fa 100644 --- a/lib/icinga/timeperiod.hpp +++ b/lib/icinga/timeperiod.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TIMEPERIOD_H #define TIMEPERIOD_H diff --git a/lib/icinga/timeperiod.ti b/lib/icinga/timeperiod.ti index 362432cea..27365988e 100644 --- a/lib/icinga/timeperiod.ti +++ b/lib/icinga/timeperiod.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #include "base/function.hpp" diff --git a/lib/icinga/user.cpp b/lib/icinga/user.cpp index 87c818219..f55a36aaa 100644 --- a/lib/icinga/user.cpp +++ b/lib/icinga/user.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/user.hpp" #include "icinga/user-ti.cpp" diff --git a/lib/icinga/user.hpp b/lib/icinga/user.hpp index 4aa8b134d..f91aefd08 100644 --- a/lib/icinga/user.hpp +++ b/lib/icinga/user.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef USER_H #define USER_H diff --git a/lib/icinga/user.ti b/lib/icinga/user.ti index cca3c936a..450d95358 100644 --- a/lib/icinga/user.ti +++ b/lib/icinga/user.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" #include "base/array.hpp" diff --git a/lib/icinga/usergroup.cpp b/lib/icinga/usergroup.cpp index d9feee4bb..913882d1c 100644 --- a/lib/icinga/usergroup.cpp +++ b/lib/icinga/usergroup.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/usergroup.hpp" #include "icinga/usergroup-ti.cpp" diff --git a/lib/icinga/usergroup.hpp b/lib/icinga/usergroup.hpp index d72680157..169f29c10 100644 --- a/lib/icinga/usergroup.hpp +++ b/lib/icinga/usergroup.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef USERGROUP_H #define USERGROUP_H diff --git a/lib/icinga/usergroup.ti b/lib/icinga/usergroup.ti index ccb03e65c..311932171 100644 --- a/lib/icinga/usergroup.ti +++ b/lib/icinga/usergroup.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/customvarobject.hpp" diff --git a/lib/livestatus/aggregator.cpp b/lib/livestatus/aggregator.cpp index a5294b51c..a809b073f 100644 --- a/lib/livestatus/aggregator.cpp +++ b/lib/livestatus/aggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/aggregator.hpp" diff --git a/lib/livestatus/aggregator.hpp b/lib/livestatus/aggregator.hpp index 4b9e1b190..1c0f7781e 100644 --- a/lib/livestatus/aggregator.hpp +++ b/lib/livestatus/aggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef AGGREGATOR_H #define AGGREGATOR_H diff --git a/lib/livestatus/andfilter.cpp b/lib/livestatus/andfilter.cpp index 7ce777b80..98525806f 100644 --- a/lib/livestatus/andfilter.cpp +++ b/lib/livestatus/andfilter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/andfilter.hpp" diff --git a/lib/livestatus/andfilter.hpp b/lib/livestatus/andfilter.hpp index 26c6fbdbd..8192bf72e 100644 --- a/lib/livestatus/andfilter.hpp +++ b/lib/livestatus/andfilter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ANDFILTER_H #define ANDFILTER_H diff --git a/lib/livestatus/attributefilter.cpp b/lib/livestatus/attributefilter.cpp index 347819858..50d7244eb 100644 --- a/lib/livestatus/attributefilter.cpp +++ b/lib/livestatus/attributefilter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/attributefilter.hpp" #include "base/convert.hpp" diff --git a/lib/livestatus/attributefilter.hpp b/lib/livestatus/attributefilter.hpp index d584824c2..18bd8431e 100644 --- a/lib/livestatus/attributefilter.hpp +++ b/lib/livestatus/attributefilter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ATTRIBUTEFILTER_H #define ATTRIBUTEFILTER_H diff --git a/lib/livestatus/avgaggregator.cpp b/lib/livestatus/avgaggregator.cpp index 25836188d..35701f313 100644 --- a/lib/livestatus/avgaggregator.cpp +++ b/lib/livestatus/avgaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/avgaggregator.hpp" diff --git a/lib/livestatus/avgaggregator.hpp b/lib/livestatus/avgaggregator.hpp index 39b05df99..11bd9f380 100644 --- a/lib/livestatus/avgaggregator.hpp +++ b/lib/livestatus/avgaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef AVGAGGREGATOR_H #define AVGAGGREGATOR_H diff --git a/lib/livestatus/column.cpp b/lib/livestatus/column.cpp index 8c2ade4d6..c915b3df3 100644 --- a/lib/livestatus/column.cpp +++ b/lib/livestatus/column.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/column.hpp" diff --git a/lib/livestatus/column.hpp b/lib/livestatus/column.hpp index 1a473f18e..264cca746 100644 --- a/lib/livestatus/column.hpp +++ b/lib/livestatus/column.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COLUMN_H #define COLUMN_H diff --git a/lib/livestatus/combinerfilter.cpp b/lib/livestatus/combinerfilter.cpp index b82f06e9f..36a8328b7 100644 --- a/lib/livestatus/combinerfilter.cpp +++ b/lib/livestatus/combinerfilter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/combinerfilter.hpp" diff --git a/lib/livestatus/combinerfilter.hpp b/lib/livestatus/combinerfilter.hpp index 4a35c28b5..49b8b611d 100644 --- a/lib/livestatus/combinerfilter.hpp +++ b/lib/livestatus/combinerfilter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMBINERFILTER_H #define COMBINERFILTER_H diff --git a/lib/livestatus/commandstable.cpp b/lib/livestatus/commandstable.cpp index 1598c7af5..3a777d231 100644 --- a/lib/livestatus/commandstable.cpp +++ b/lib/livestatus/commandstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/commandstable.hpp" #include "icinga/icingaapplication.hpp" diff --git a/lib/livestatus/commandstable.hpp b/lib/livestatus/commandstable.hpp index 3f5177145..cd2d91521 100644 --- a/lib/livestatus/commandstable.hpp +++ b/lib/livestatus/commandstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMMANDSTABLE_H #define COMMANDSTABLE_H diff --git a/lib/livestatus/commentstable.cpp b/lib/livestatus/commentstable.cpp index 57775258c..1fe235936 100644 --- a/lib/livestatus/commentstable.cpp +++ b/lib/livestatus/commentstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/commentstable.hpp" #include "livestatus/hoststable.hpp" diff --git a/lib/livestatus/commentstable.hpp b/lib/livestatus/commentstable.hpp index 8b6f2ac4e..b46e155f3 100644 --- a/lib/livestatus/commentstable.hpp +++ b/lib/livestatus/commentstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COMMENTSTABLE_H #define COMMENTSTABLE_H diff --git a/lib/livestatus/contactgroupstable.cpp b/lib/livestatus/contactgroupstable.cpp index b074c7349..b4d6853d5 100644 --- a/lib/livestatus/contactgroupstable.cpp +++ b/lib/livestatus/contactgroupstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/contactgroupstable.hpp" #include "icinga/usergroup.hpp" diff --git a/lib/livestatus/contactgroupstable.hpp b/lib/livestatus/contactgroupstable.hpp index a94c19095..a57f5c3b3 100644 --- a/lib/livestatus/contactgroupstable.hpp +++ b/lib/livestatus/contactgroupstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONTACTGROUPSTABLE_H #define CONTACTGROUPSTABLE_H diff --git a/lib/livestatus/contactstable.cpp b/lib/livestatus/contactstable.cpp index 1d65c1b5a..2649b1706 100644 --- a/lib/livestatus/contactstable.cpp +++ b/lib/livestatus/contactstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/contactstable.hpp" #include "icinga/user.hpp" diff --git a/lib/livestatus/contactstable.hpp b/lib/livestatus/contactstable.hpp index 55d6f414f..0bd2679ed 100644 --- a/lib/livestatus/contactstable.hpp +++ b/lib/livestatus/contactstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONTACTSTABLE_H #define CONTACTSTABLE_H diff --git a/lib/livestatus/countaggregator.cpp b/lib/livestatus/countaggregator.cpp index 77858c986..b8a7238f3 100644 --- a/lib/livestatus/countaggregator.cpp +++ b/lib/livestatus/countaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/countaggregator.hpp" diff --git a/lib/livestatus/countaggregator.hpp b/lib/livestatus/countaggregator.hpp index 2de91ae85..22d498395 100644 --- a/lib/livestatus/countaggregator.hpp +++ b/lib/livestatus/countaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef COUNTAGGREGATOR_H #define COUNTAGGREGATOR_H diff --git a/lib/livestatus/downtimestable.cpp b/lib/livestatus/downtimestable.cpp index 9881e253c..709568a94 100644 --- a/lib/livestatus/downtimestable.cpp +++ b/lib/livestatus/downtimestable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/downtimestable.hpp" #include "livestatus/hoststable.hpp" diff --git a/lib/livestatus/downtimestable.hpp b/lib/livestatus/downtimestable.hpp index 63e0d54f4..4b5c909f1 100644 --- a/lib/livestatus/downtimestable.hpp +++ b/lib/livestatus/downtimestable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DOWNTIMESTABLE_H #define DOWNTIMESTABLE_H diff --git a/lib/livestatus/endpointstable.cpp b/lib/livestatus/endpointstable.cpp index ce31a4d5b..b5c5c3d2f 100644 --- a/lib/livestatus/endpointstable.cpp +++ b/lib/livestatus/endpointstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/endpointstable.hpp" #include "icinga/host.hpp" diff --git a/lib/livestatus/endpointstable.hpp b/lib/livestatus/endpointstable.hpp index 42bc424d0..7d011eff6 100644 --- a/lib/livestatus/endpointstable.hpp +++ b/lib/livestatus/endpointstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ENDPOINTSTABLE_H #define ENDPOINTSTABLE_H diff --git a/lib/livestatus/filter.hpp b/lib/livestatus/filter.hpp index 6bbf8c37d..b9a01c860 100644 --- a/lib/livestatus/filter.hpp +++ b/lib/livestatus/filter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FILTER_H #define FILTER_H diff --git a/lib/livestatus/historytable.hpp b/lib/livestatus/historytable.hpp index 4d10ed8d0..f1178573a 100644 --- a/lib/livestatus/historytable.hpp +++ b/lib/livestatus/historytable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HISTORYTABLE_H #define HISTORYTABLE_H diff --git a/lib/livestatus/hostgroupstable.cpp b/lib/livestatus/hostgroupstable.cpp index 07816df3f..984eddb08 100644 --- a/lib/livestatus/hostgroupstable.cpp +++ b/lib/livestatus/hostgroupstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/hostgroupstable.hpp" #include "icinga/hostgroup.hpp" diff --git a/lib/livestatus/hostgroupstable.hpp b/lib/livestatus/hostgroupstable.hpp index 468998f08..cc5039fac 100644 --- a/lib/livestatus/hostgroupstable.hpp +++ b/lib/livestatus/hostgroupstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOSTGROUPSTABLE_H #define HOSTGROUPSTABLE_H diff --git a/lib/livestatus/hoststable.cpp b/lib/livestatus/hoststable.cpp index 9b133fb35..7a051da28 100644 --- a/lib/livestatus/hoststable.cpp +++ b/lib/livestatus/hoststable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/hoststable.hpp" #include "livestatus/hostgroupstable.hpp" diff --git a/lib/livestatus/hoststable.hpp b/lib/livestatus/hoststable.hpp index c48aa4d32..9386183ce 100644 --- a/lib/livestatus/hoststable.hpp +++ b/lib/livestatus/hoststable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HOSTSTABLE_H #define HOSTSTABLE_H diff --git a/lib/livestatus/i2-livestatus.hpp b/lib/livestatus/i2-livestatus.hpp index f9e905edb..3375d9795 100644 --- a/lib/livestatus/i2-livestatus.hpp +++ b/lib/livestatus/i2-livestatus.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2LIVESTATUS_H #define I2LIVESTATUS_H diff --git a/lib/livestatus/invavgaggregator.cpp b/lib/livestatus/invavgaggregator.cpp index e144b2b1b..33cf85cd7 100644 --- a/lib/livestatus/invavgaggregator.cpp +++ b/lib/livestatus/invavgaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/invavgaggregator.hpp" diff --git a/lib/livestatus/invavgaggregator.hpp b/lib/livestatus/invavgaggregator.hpp index 99e7ddfc0..9282b37de 100644 --- a/lib/livestatus/invavgaggregator.hpp +++ b/lib/livestatus/invavgaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INVAVGAGGREGATOR_H #define INVAVGAGGREGATOR_H diff --git a/lib/livestatus/invsumaggregator.cpp b/lib/livestatus/invsumaggregator.cpp index aa5a94195..c955667fc 100644 --- a/lib/livestatus/invsumaggregator.cpp +++ b/lib/livestatus/invsumaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/invsumaggregator.hpp" diff --git a/lib/livestatus/invsumaggregator.hpp b/lib/livestatus/invsumaggregator.hpp index ae6a5f69e..f7de7be82 100644 --- a/lib/livestatus/invsumaggregator.hpp +++ b/lib/livestatus/invsumaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INVSUMAGGREGATOR_H #define INVSUMAGGREGATOR_H diff --git a/lib/livestatus/livestatuslistener.cpp b/lib/livestatus/livestatuslistener.cpp index a591d3ecc..8344a187e 100644 --- a/lib/livestatus/livestatuslistener.cpp +++ b/lib/livestatus/livestatuslistener.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/livestatuslistener.hpp" #include "livestatus/livestatuslistener-ti.cpp" diff --git a/lib/livestatus/livestatuslistener.hpp b/lib/livestatus/livestatuslistener.hpp index 0e1df4c4c..dc739f6f1 100644 --- a/lib/livestatus/livestatuslistener.hpp +++ b/lib/livestatus/livestatuslistener.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LIVESTATUSLISTENER_H #define LIVESTATUSLISTENER_H diff --git a/lib/livestatus/livestatuslistener.ti b/lib/livestatus/livestatuslistener.ti index 13e41fde0..31482cff1 100644 --- a/lib/livestatus/livestatuslistener.ti +++ b/lib/livestatus/livestatuslistener.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/livestatus/livestatuslogutility.cpp b/lib/livestatus/livestatuslogutility.cpp index edb3a8875..cbcbdabc9 100644 --- a/lib/livestatus/livestatuslogutility.cpp +++ b/lib/livestatus/livestatuslogutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/livestatuslogutility.hpp" #include "icinga/service.hpp" diff --git a/lib/livestatus/livestatuslogutility.hpp b/lib/livestatus/livestatuslogutility.hpp index 2056506bc..66d11548f 100644 --- a/lib/livestatus/livestatuslogutility.hpp +++ b/lib/livestatus/livestatuslogutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LIVESTATUSLOGUTILITY_H #define LIVESTATUSLOGUTILITY_H diff --git a/lib/livestatus/livestatusquery.cpp b/lib/livestatus/livestatusquery.cpp index 4e2fe2786..04d01f51f 100644 --- a/lib/livestatus/livestatusquery.cpp +++ b/lib/livestatus/livestatusquery.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/livestatusquery.hpp" #include "livestatus/countaggregator.hpp" diff --git a/lib/livestatus/livestatusquery.hpp b/lib/livestatus/livestatusquery.hpp index d232ef15e..910cc162e 100644 --- a/lib/livestatus/livestatusquery.hpp +++ b/lib/livestatus/livestatusquery.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LIVESTATUSQUERY_H #define LIVESTATUSQUERY_H diff --git a/lib/livestatus/logtable.cpp b/lib/livestatus/logtable.cpp index ea446d716..a44c714f0 100644 --- a/lib/livestatus/logtable.cpp +++ b/lib/livestatus/logtable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/logtable.hpp" #include "livestatus/livestatuslogutility.hpp" diff --git a/lib/livestatus/logtable.hpp b/lib/livestatus/logtable.hpp index 08a698e61..33c2e33e1 100644 --- a/lib/livestatus/logtable.hpp +++ b/lib/livestatus/logtable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef LOGTABLE_H #define LOGTABLE_H diff --git a/lib/livestatus/maxaggregator.cpp b/lib/livestatus/maxaggregator.cpp index 9251c6cc7..375d24b60 100644 --- a/lib/livestatus/maxaggregator.cpp +++ b/lib/livestatus/maxaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/maxaggregator.hpp" diff --git a/lib/livestatus/maxaggregator.hpp b/lib/livestatus/maxaggregator.hpp index 16d1a9145..5bff5f964 100644 --- a/lib/livestatus/maxaggregator.hpp +++ b/lib/livestatus/maxaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MAXAGGREGATOR_H #define MAXAGGREGATOR_H diff --git a/lib/livestatus/minaggregator.cpp b/lib/livestatus/minaggregator.cpp index 85625fc75..06cb76e22 100644 --- a/lib/livestatus/minaggregator.cpp +++ b/lib/livestatus/minaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/minaggregator.hpp" diff --git a/lib/livestatus/minaggregator.hpp b/lib/livestatus/minaggregator.hpp index ce473b4a1..71a9d89a0 100644 --- a/lib/livestatus/minaggregator.hpp +++ b/lib/livestatus/minaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MINAGGREGATOR_H #define MINAGGREGATOR_H diff --git a/lib/livestatus/negatefilter.cpp b/lib/livestatus/negatefilter.cpp index 12a111085..60202b4b1 100644 --- a/lib/livestatus/negatefilter.cpp +++ b/lib/livestatus/negatefilter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/negatefilter.hpp" diff --git a/lib/livestatus/negatefilter.hpp b/lib/livestatus/negatefilter.hpp index 55ce5292c..c08943ca8 100644 --- a/lib/livestatus/negatefilter.hpp +++ b/lib/livestatus/negatefilter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NEGATEFILTER_H #define NEGATEFILTER_H diff --git a/lib/livestatus/orfilter.cpp b/lib/livestatus/orfilter.cpp index 00813a55e..6cc446cae 100644 --- a/lib/livestatus/orfilter.cpp +++ b/lib/livestatus/orfilter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/orfilter.hpp" diff --git a/lib/livestatus/orfilter.hpp b/lib/livestatus/orfilter.hpp index 561424b4b..df855c1a9 100644 --- a/lib/livestatus/orfilter.hpp +++ b/lib/livestatus/orfilter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ORFILTER_H #define ORFILTER_H diff --git a/lib/livestatus/servicegroupstable.cpp b/lib/livestatus/servicegroupstable.cpp index 38b0db161..38d6d0502 100644 --- a/lib/livestatus/servicegroupstable.cpp +++ b/lib/livestatus/servicegroupstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/servicegroupstable.hpp" #include "icinga/servicegroup.hpp" diff --git a/lib/livestatus/servicegroupstable.hpp b/lib/livestatus/servicegroupstable.hpp index 3e34a0b73..b3c60c493 100644 --- a/lib/livestatus/servicegroupstable.hpp +++ b/lib/livestatus/servicegroupstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICEGROUPSTABLE_H #define SERVICEGROUPSTABLE_H diff --git a/lib/livestatus/servicestable.cpp b/lib/livestatus/servicestable.cpp index a6faba6a9..8b3e06535 100644 --- a/lib/livestatus/servicestable.cpp +++ b/lib/livestatus/servicestable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/servicestable.hpp" #include "livestatus/hoststable.hpp" diff --git a/lib/livestatus/servicestable.hpp b/lib/livestatus/servicestable.hpp index 5304d0362..56d5ae541 100644 --- a/lib/livestatus/servicestable.hpp +++ b/lib/livestatus/servicestable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SERVICESTABLE_H #define SERVICESTABLE_H diff --git a/lib/livestatus/statehisttable.cpp b/lib/livestatus/statehisttable.cpp index a4ab5eaea..699eb7b48 100644 --- a/lib/livestatus/statehisttable.cpp +++ b/lib/livestatus/statehisttable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/statehisttable.hpp" #include "livestatus/livestatuslogutility.hpp" diff --git a/lib/livestatus/statehisttable.hpp b/lib/livestatus/statehisttable.hpp index 544a87140..9233fd559 100644 --- a/lib/livestatus/statehisttable.hpp +++ b/lib/livestatus/statehisttable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STATEHISTTABLE_H #define STATEHISTTABLE_H diff --git a/lib/livestatus/statustable.cpp b/lib/livestatus/statustable.cpp index d532a3ec7..223fd5543 100644 --- a/lib/livestatus/statustable.cpp +++ b/lib/livestatus/statustable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/statustable.hpp" #include "livestatus/livestatuslistener.hpp" diff --git a/lib/livestatus/statustable.hpp b/lib/livestatus/statustable.hpp index 4b104c242..65e572a91 100644 --- a/lib/livestatus/statustable.hpp +++ b/lib/livestatus/statustable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STATUSTABLE_H #define STATUSTABLE_H diff --git a/lib/livestatus/stdaggregator.cpp b/lib/livestatus/stdaggregator.cpp index 080eb82e8..99c3a8e65 100644 --- a/lib/livestatus/stdaggregator.cpp +++ b/lib/livestatus/stdaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/stdaggregator.hpp" #include diff --git a/lib/livestatus/stdaggregator.hpp b/lib/livestatus/stdaggregator.hpp index 52f77368e..3680fe734 100644 --- a/lib/livestatus/stdaggregator.hpp +++ b/lib/livestatus/stdaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STDAGGREGATOR_H #define STDAGGREGATOR_H diff --git a/lib/livestatus/sumaggregator.cpp b/lib/livestatus/sumaggregator.cpp index 9166a4961..fc4b62e24 100644 --- a/lib/livestatus/sumaggregator.cpp +++ b/lib/livestatus/sumaggregator.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/sumaggregator.hpp" diff --git a/lib/livestatus/sumaggregator.hpp b/lib/livestatus/sumaggregator.hpp index c62f67bf9..23f22fb71 100644 --- a/lib/livestatus/sumaggregator.hpp +++ b/lib/livestatus/sumaggregator.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef SUMAGGREGATOR_H #define SUMAGGREGATOR_H diff --git a/lib/livestatus/table.cpp b/lib/livestatus/table.cpp index 6ff3761ce..f11fef589 100644 --- a/lib/livestatus/table.cpp +++ b/lib/livestatus/table.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/table.hpp" #include "livestatus/statustable.hpp" diff --git a/lib/livestatus/table.hpp b/lib/livestatus/table.hpp index f5286a51d..b5d829515 100644 --- a/lib/livestatus/table.hpp +++ b/lib/livestatus/table.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TABLE_H #define TABLE_H diff --git a/lib/livestatus/timeperiodstable.cpp b/lib/livestatus/timeperiodstable.cpp index d3cd44001..5797d93ee 100644 --- a/lib/livestatus/timeperiodstable.cpp +++ b/lib/livestatus/timeperiodstable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/timeperiodstable.hpp" #include "icinga/icingaapplication.hpp" diff --git a/lib/livestatus/timeperiodstable.hpp b/lib/livestatus/timeperiodstable.hpp index 69e4b1e40..31cef93dc 100644 --- a/lib/livestatus/timeperiodstable.hpp +++ b/lib/livestatus/timeperiodstable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TIMEPERIODSTABLE_H #define TIMEPERIODSTABLE_H diff --git a/lib/livestatus/zonestable.cpp b/lib/livestatus/zonestable.cpp index 12b489a23..d86cc7256 100644 --- a/lib/livestatus/zonestable.cpp +++ b/lib/livestatus/zonestable.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/zonestable.hpp" #include "remote/zone.hpp" diff --git a/lib/livestatus/zonestable.hpp b/lib/livestatus/zonestable.hpp index 614cabbd5..fb03488fb 100644 --- a/lib/livestatus/zonestable.hpp +++ b/lib/livestatus/zonestable.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ZONESTABLE_H #define ZONESTABLE_H diff --git a/lib/methods/clusterchecktask.cpp b/lib/methods/clusterchecktask.cpp index d33f9ae75..4a8c76d8d 100644 --- a/lib/methods/clusterchecktask.cpp +++ b/lib/methods/clusterchecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/clusterchecktask.hpp" #include "remote/apilistener.hpp" diff --git a/lib/methods/clusterchecktask.hpp b/lib/methods/clusterchecktask.hpp index c07815054..16ee8a53c 100644 --- a/lib/methods/clusterchecktask.hpp +++ b/lib/methods/clusterchecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CLUSTERCHECKTASK_H #define CLUSTERCHECKTASK_H diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 925e4c7e7..577fcdac7 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/clusterzonechecktask.hpp" #include "icinga/checkcommand.hpp" diff --git a/lib/methods/clusterzonechecktask.hpp b/lib/methods/clusterzonechecktask.hpp index c2d936088..2af442c4c 100644 --- a/lib/methods/clusterzonechecktask.hpp +++ b/lib/methods/clusterzonechecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CLUSTERZONECHECKTASK_H #define CLUSTERZONECHECKTASK_H diff --git a/lib/methods/dummychecktask.cpp b/lib/methods/dummychecktask.cpp index b045c09d8..570fdb681 100644 --- a/lib/methods/dummychecktask.cpp +++ b/lib/methods/dummychecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef _WIN32 # include diff --git a/lib/methods/dummychecktask.hpp b/lib/methods/dummychecktask.hpp index ebaa44121..621bbfb9f 100644 --- a/lib/methods/dummychecktask.hpp +++ b/lib/methods/dummychecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DUMMYCHECKTASK_H #define DUMMYCHECKTASK_H diff --git a/lib/methods/exceptionchecktask.cpp b/lib/methods/exceptionchecktask.cpp index 7fbd41d0b..5ce3a9262 100644 --- a/lib/methods/exceptionchecktask.cpp +++ b/lib/methods/exceptionchecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef _WIN32 # include diff --git a/lib/methods/exceptionchecktask.hpp b/lib/methods/exceptionchecktask.hpp index bace374a8..09db1045f 100644 --- a/lib/methods/exceptionchecktask.hpp +++ b/lib/methods/exceptionchecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXCEPTIONCHECKTASK_H #define EXCEPTIONCHECKTASK_H diff --git a/lib/methods/i2-methods.hpp b/lib/methods/i2-methods.hpp index 0bf5b4ae2..ffd800259 100644 --- a/lib/methods/i2-methods.hpp +++ b/lib/methods/i2-methods.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2METHODS_H #define I2METHODS_H diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index c5832aebe..52213889e 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/icingachecktask.hpp" #include "icinga/cib.hpp" diff --git a/lib/methods/icingachecktask.hpp b/lib/methods/icingachecktask.hpp index d1da5ab6d..93def628d 100644 --- a/lib/methods/icingachecktask.hpp +++ b/lib/methods/icingachecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ICINGACHECKTASK_H #define ICINGACHECKTASK_H diff --git a/lib/methods/methods-itl.conf b/lib/methods/methods-itl.conf index caa8f9cf8..0b47c6199 100644 --- a/lib/methods/methods-itl.conf +++ b/lib/methods/methods-itl.conf @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ System.assert(Internal.run_with_activation_context(function() { template CheckCommand "icinga-check-command" use (IcingaCheck = Internal.IcingaCheck) { diff --git a/lib/methods/nullchecktask.cpp b/lib/methods/nullchecktask.cpp index d1d57240b..b56087b2e 100644 --- a/lib/methods/nullchecktask.cpp +++ b/lib/methods/nullchecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef _WIN32 # include diff --git a/lib/methods/nullchecktask.hpp b/lib/methods/nullchecktask.hpp index 0d7029a7a..954cf8d61 100644 --- a/lib/methods/nullchecktask.hpp +++ b/lib/methods/nullchecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NULLCHECKTASK_H #define NULLCHECKTASK_H diff --git a/lib/methods/nulleventtask.cpp b/lib/methods/nulleventtask.cpp index dc2feb250..0755a4d01 100644 --- a/lib/methods/nulleventtask.cpp +++ b/lib/methods/nulleventtask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/nulleventtask.hpp" #include "base/function.hpp" diff --git a/lib/methods/nulleventtask.hpp b/lib/methods/nulleventtask.hpp index 171a34631..153470f3e 100644 --- a/lib/methods/nulleventtask.hpp +++ b/lib/methods/nulleventtask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NULLEVENTTASK_H #define NULLEVENTTASK_H diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index 9672d4de0..15a46e758 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/pluginchecktask.hpp" #include "icinga/pluginutility.hpp" diff --git a/lib/methods/pluginchecktask.hpp b/lib/methods/pluginchecktask.hpp index 8eab5f99c..a4fc3a385 100644 --- a/lib/methods/pluginchecktask.hpp +++ b/lib/methods/pluginchecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PLUGINCHECKTASK_H #define PLUGINCHECKTASK_H diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index 59f78df9c..b2bb466b8 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/plugineventtask.hpp" #include "icinga/eventcommand.hpp" diff --git a/lib/methods/plugineventtask.hpp b/lib/methods/plugineventtask.hpp index 2ddc2732f..8908a82d3 100644 --- a/lib/methods/plugineventtask.hpp +++ b/lib/methods/plugineventtask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PLUGINEVENTTASK_H #define PLUGINEVENTTASK_H diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index 5faf650b3..08ba4e2eb 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/pluginnotificationtask.hpp" #include "icinga/notification.hpp" diff --git a/lib/methods/pluginnotificationtask.hpp b/lib/methods/pluginnotificationtask.hpp index 98b69c064..66d653924 100644 --- a/lib/methods/pluginnotificationtask.hpp +++ b/lib/methods/pluginnotificationtask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PLUGINNOTIFICATIONTASK_H #define PLUGINNOTIFICATIONTASK_H diff --git a/lib/methods/randomchecktask.cpp b/lib/methods/randomchecktask.cpp index 615a848a3..3bb4b026c 100644 --- a/lib/methods/randomchecktask.cpp +++ b/lib/methods/randomchecktask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef _WIN32 # include diff --git a/lib/methods/randomchecktask.hpp b/lib/methods/randomchecktask.hpp index 05e2e78f5..00ce663dc 100644 --- a/lib/methods/randomchecktask.hpp +++ b/lib/methods/randomchecktask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef RANDOMCHECKTASK_H #define RANDOMCHECKTASK_H diff --git a/lib/methods/timeperiodtask.cpp b/lib/methods/timeperiodtask.cpp index cd76c80f3..bb3f1bb00 100644 --- a/lib/methods/timeperiodtask.cpp +++ b/lib/methods/timeperiodtask.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "methods/timeperiodtask.hpp" #include "base/function.hpp" diff --git a/lib/methods/timeperiodtask.hpp b/lib/methods/timeperiodtask.hpp index e44c14e24..0dff1c668 100644 --- a/lib/methods/timeperiodtask.hpp +++ b/lib/methods/timeperiodtask.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TIMEPERIODTASK_H #define TIMEPERIODTASK_H diff --git a/lib/mysql_shim/mysqlinterface.cpp b/lib/mysql_shim/mysqlinterface.cpp index 54188b6eb..5807639e2 100644 --- a/lib/mysql_shim/mysqlinterface.cpp +++ b/lib/mysql_shim/mysqlinterface.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "mysql_shim/mysqlinterface.hpp" diff --git a/lib/mysql_shim/mysqlinterface.hpp b/lib/mysql_shim/mysqlinterface.hpp index b70c5519f..2aac49d24 100644 --- a/lib/mysql_shim/mysqlinterface.hpp +++ b/lib/mysql_shim/mysqlinterface.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MYSQLINTERFACE_H #define MYSQLINTERFACE_H diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index 04b40274c..57ef3011d 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "notification/notificationcomponent.hpp" #include "notification/notificationcomponent-ti.cpp" diff --git a/lib/notification/notificationcomponent.hpp b/lib/notification/notificationcomponent.hpp index e03972cb2..09434e21a 100644 --- a/lib/notification/notificationcomponent.hpp +++ b/lib/notification/notificationcomponent.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef NOTIFICATIONCOMPONENT_H #define NOTIFICATIONCOMPONENT_H diff --git a/lib/notification/notificationcomponent.ti b/lib/notification/notificationcomponent.ti index 840667fb8..7c3ff13ff 100644 --- a/lib/notification/notificationcomponent.ti +++ b/lib/notification/notificationcomponent.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index ec89bed01..c794d38a3 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/elasticsearchwriter.hpp" #include "perfdata/elasticsearchwriter-ti.cpp" diff --git a/lib/perfdata/elasticsearchwriter.hpp b/lib/perfdata/elasticsearchwriter.hpp index 7220e8ea3..2f8e59eb0 100644 --- a/lib/perfdata/elasticsearchwriter.hpp +++ b/lib/perfdata/elasticsearchwriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ELASTICSEARCHWRITER_H #define ELASTICSEARCHWRITER_H diff --git a/lib/perfdata/gelfwriter.cpp b/lib/perfdata/gelfwriter.cpp index c4c0912d2..6299c279c 100644 --- a/lib/perfdata/gelfwriter.cpp +++ b/lib/perfdata/gelfwriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/gelfwriter.hpp" #include "perfdata/gelfwriter-ti.cpp" diff --git a/lib/perfdata/gelfwriter.hpp b/lib/perfdata/gelfwriter.hpp index 32e35da57..ce2c72a58 100644 --- a/lib/perfdata/gelfwriter.hpp +++ b/lib/perfdata/gelfwriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef GELFWRITER_H #define GELFWRITER_H diff --git a/lib/perfdata/gelfwriter.ti b/lib/perfdata/gelfwriter.ti index 92d4a2176..08994964c 100644 --- a/lib/perfdata/gelfwriter.ti +++ b/lib/perfdata/gelfwriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/perfdata/graphitewriter.cpp b/lib/perfdata/graphitewriter.cpp index 1b6461d51..fb3c49389 100644 --- a/lib/perfdata/graphitewriter.cpp +++ b/lib/perfdata/graphitewriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/graphitewriter.hpp" #include "perfdata/graphitewriter-ti.cpp" diff --git a/lib/perfdata/graphitewriter.hpp b/lib/perfdata/graphitewriter.hpp index ec4c5bbfe..808f4fb1b 100644 --- a/lib/perfdata/graphitewriter.hpp +++ b/lib/perfdata/graphitewriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef GRAPHITEWRITER_H #define GRAPHITEWRITER_H diff --git a/lib/perfdata/graphitewriter.ti b/lib/perfdata/graphitewriter.ti index 4475eb184..6f79e2559 100644 --- a/lib/perfdata/graphitewriter.ti +++ b/lib/perfdata/graphitewriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 80d050233..c9abbdd45 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/influxdbwriter.hpp" #include "perfdata/influxdbwriter-ti.cpp" diff --git a/lib/perfdata/influxdbwriter.hpp b/lib/perfdata/influxdbwriter.hpp index 370ca25c5..f2a8e1f7f 100644 --- a/lib/perfdata/influxdbwriter.hpp +++ b/lib/perfdata/influxdbwriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INFLUXDBWRITER_H #define INFLUXDBWRITER_H diff --git a/lib/perfdata/influxdbwriter.ti b/lib/perfdata/influxdbwriter.ti index a26af6d55..6057bd28a 100644 --- a/lib/perfdata/influxdbwriter.ti +++ b/lib/perfdata/influxdbwriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/perfdata/opentsdbwriter.cpp b/lib/perfdata/opentsdbwriter.cpp index 78feea8f2..ab66d213e 100644 --- a/lib/perfdata/opentsdbwriter.cpp +++ b/lib/perfdata/opentsdbwriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/opentsdbwriter.hpp" #include "perfdata/opentsdbwriter-ti.cpp" diff --git a/lib/perfdata/opentsdbwriter.hpp b/lib/perfdata/opentsdbwriter.hpp index 193d6b31a..e499e6037 100644 --- a/lib/perfdata/opentsdbwriter.hpp +++ b/lib/perfdata/opentsdbwriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OPENTSDBWRITER_H #define OPENTSDBWRITER_H diff --git a/lib/perfdata/opentsdbwriter.ti b/lib/perfdata/opentsdbwriter.ti index 09d5f3ede..82bf4e193 100644 --- a/lib/perfdata/opentsdbwriter.ti +++ b/lib/perfdata/opentsdbwriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/perfdata/perfdatawriter.cpp b/lib/perfdata/perfdatawriter.cpp index c560ef256..1f1ce7536 100644 --- a/lib/perfdata/perfdatawriter.cpp +++ b/lib/perfdata/perfdatawriter.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "perfdata/perfdatawriter.hpp" #include "perfdata/perfdatawriter-ti.cpp" diff --git a/lib/perfdata/perfdatawriter.hpp b/lib/perfdata/perfdatawriter.hpp index 56d01d382..4f5f1b1ec 100644 --- a/lib/perfdata/perfdatawriter.hpp +++ b/lib/perfdata/perfdatawriter.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PERFDATAWRITER_H #define PERFDATAWRITER_H diff --git a/lib/perfdata/perfdatawriter.ti b/lib/perfdata/perfdatawriter.ti index dbd303c75..9b4835a80 100644 --- a/lib/perfdata/perfdatawriter.ti +++ b/lib/perfdata/perfdatawriter.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/application.hpp" diff --git a/lib/pgsql_shim/pgsqlinterface.cpp b/lib/pgsql_shim/pgsqlinterface.cpp index 659ec9019..95b6e7d02 100644 --- a/lib/pgsql_shim/pgsqlinterface.cpp +++ b/lib/pgsql_shim/pgsqlinterface.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "pgsql_shim/pgsqlinterface.hpp" diff --git a/lib/pgsql_shim/pgsqlinterface.hpp b/lib/pgsql_shim/pgsqlinterface.hpp index 78fee5fb9..2fe33033c 100644 --- a/lib/pgsql_shim/pgsqlinterface.hpp +++ b/lib/pgsql_shim/pgsqlinterface.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PGSQLINTERFACE_H #define PGSQLINTERFACE_H diff --git a/lib/remote/actionshandler.cpp b/lib/remote/actionshandler.cpp index bff0826cc..cc1cba8de 100644 --- a/lib/remote/actionshandler.cpp +++ b/lib/remote/actionshandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/actionshandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/actionshandler.hpp b/lib/remote/actionshandler.hpp index ad210c8c0..7affb0814 100644 --- a/lib/remote/actionshandler.hpp +++ b/lib/remote/actionshandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ACTIONSHANDLER_H #define ACTIONSHANDLER_H diff --git a/lib/remote/apiaction.cpp b/lib/remote/apiaction.cpp index d3f643724..4da91f0d5 100644 --- a/lib/remote/apiaction.cpp +++ b/lib/remote/apiaction.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apiaction.hpp" #include "base/singleton.hpp" diff --git a/lib/remote/apiaction.hpp b/lib/remote/apiaction.hpp index d3c9fbbec..6492449bd 100644 --- a/lib/remote/apiaction.hpp +++ b/lib/remote/apiaction.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APIACTION_H #define APIACTION_H diff --git a/lib/remote/apiclient.cpp b/lib/remote/apiclient.cpp index 8846de922..59d53d04c 100644 --- a/lib/remote/apiclient.cpp +++ b/lib/remote/apiclient.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apiclient.hpp" #include "base/base64.hpp" diff --git a/lib/remote/apiclient.hpp b/lib/remote/apiclient.hpp index c058142b1..001f4947b 100644 --- a/lib/remote/apiclient.hpp +++ b/lib/remote/apiclient.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APICLIENT_H #define APICLIENT_H diff --git a/lib/remote/apifunction.cpp b/lib/remote/apifunction.cpp index 057cef3ff..5b855cc43 100644 --- a/lib/remote/apifunction.cpp +++ b/lib/remote/apifunction.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apifunction.hpp" #include "base/singleton.hpp" diff --git a/lib/remote/apifunction.hpp b/lib/remote/apifunction.hpp index 08a6b432c..048b83c58 100644 --- a/lib/remote/apifunction.hpp +++ b/lib/remote/apifunction.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APIFUNCTION_H #define APIFUNCTION_H diff --git a/lib/remote/apilistener-configsync.cpp b/lib/remote/apilistener-configsync.cpp index 2612e67fc..d4caff91a 100644 --- a/lib/remote/apilistener-configsync.cpp +++ b/lib/remote/apilistener-configsync.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apilistener.hpp" #include "remote/apifunction.hpp" diff --git a/lib/remote/apilistener-filesync.cpp b/lib/remote/apilistener-filesync.cpp index efb2a59e6..9e73c9bb8 100644 --- a/lib/remote/apilistener-filesync.cpp +++ b/lib/remote/apilistener-filesync.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apilistener.hpp" #include "remote/apifunction.hpp" diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 118882e35..16acdeddf 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apilistener.hpp" #include "remote/apilistener-ti.cpp" diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 60c2ab016..54b96dee5 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APILISTENER_H #define APILISTENER_H diff --git a/lib/remote/apilistener.ti b/lib/remote/apilistener.ti index f10014fb7..779dde0d1 100644 --- a/lib/remote/apilistener.ti +++ b/lib/remote/apilistener.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/i2-remote.hpp" #include "base/configobject.hpp" diff --git a/lib/remote/apiuser.cpp b/lib/remote/apiuser.cpp index 320935a07..2959d895c 100644 --- a/lib/remote/apiuser.cpp +++ b/lib/remote/apiuser.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/apiuser.hpp" #include "remote/apiuser-ti.cpp" diff --git a/lib/remote/apiuser.hpp b/lib/remote/apiuser.hpp index 7f01dba48..fc132eee8 100644 --- a/lib/remote/apiuser.hpp +++ b/lib/remote/apiuser.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef APIUSER_H #define APIUSER_H diff --git a/lib/remote/apiuser.ti b/lib/remote/apiuser.ti index 16fa2402d..85fc764f6 100644 --- a/lib/remote/apiuser.ti +++ b/lib/remote/apiuser.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" #include "base/function.hpp" diff --git a/lib/remote/authority.cpp b/lib/remote/authority.cpp index 1c4ffe38f..c532b97ad 100644 --- a/lib/remote/authority.cpp +++ b/lib/remote/authority.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/zone.hpp" #include "remote/apilistener.hpp" diff --git a/lib/remote/configfileshandler.cpp b/lib/remote/configfileshandler.cpp index 2ad6c1f0a..abd972825 100644 --- a/lib/remote/configfileshandler.cpp +++ b/lib/remote/configfileshandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/configfileshandler.hpp" #include "remote/configpackageutility.hpp" diff --git a/lib/remote/configfileshandler.hpp b/lib/remote/configfileshandler.hpp index 01a18cc4d..17f03e0dd 100644 --- a/lib/remote/configfileshandler.hpp +++ b/lib/remote/configfileshandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGFILESHANDLER_H #define CONFIGFILESHANDLER_H diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index 5575cba00..d16f887a7 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/configobjectutility.hpp" #include "remote/configpackageutility.hpp" diff --git a/lib/remote/configobjectutility.hpp b/lib/remote/configobjectutility.hpp index fc17ec8f4..5de16d2c9 100644 --- a/lib/remote/configobjectutility.hpp +++ b/lib/remote/configobjectutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGOBJECTUTILITY_H #define CONFIGOBJECTUTILITY_H diff --git a/lib/remote/configpackageshandler.cpp b/lib/remote/configpackageshandler.cpp index c474d633e..b590e24fb 100644 --- a/lib/remote/configpackageshandler.cpp +++ b/lib/remote/configpackageshandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/configpackageshandler.hpp" #include "remote/configpackageutility.hpp" diff --git a/lib/remote/configpackageshandler.hpp b/lib/remote/configpackageshandler.hpp index 9ed2d2016..12c081afe 100644 --- a/lib/remote/configpackageshandler.hpp +++ b/lib/remote/configpackageshandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGMODULESHANDLER_H #define CONFIGMODULESHANDLER_H diff --git a/lib/remote/configpackageutility.cpp b/lib/remote/configpackageutility.cpp index 3b15724d3..373aa4846 100644 --- a/lib/remote/configpackageutility.cpp +++ b/lib/remote/configpackageutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/configpackageutility.hpp" #include "base/application.hpp" diff --git a/lib/remote/configpackageutility.hpp b/lib/remote/configpackageutility.hpp index 71cbdbea3..db475c8f2 100644 --- a/lib/remote/configpackageutility.hpp +++ b/lib/remote/configpackageutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGMODULEUTILITY_H #define CONFIGMODULEUTILITY_H diff --git a/lib/remote/configstageshandler.cpp b/lib/remote/configstageshandler.cpp index ead546c0c..fa0078c39 100644 --- a/lib/remote/configstageshandler.cpp +++ b/lib/remote/configstageshandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/configstageshandler.hpp" #include "remote/configpackageutility.hpp" diff --git a/lib/remote/configstageshandler.hpp b/lib/remote/configstageshandler.hpp index 124af87e2..a5ac21605 100644 --- a/lib/remote/configstageshandler.hpp +++ b/lib/remote/configstageshandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONFIGSTAGESHANDLER_H #define CONFIGSTAGESHANDLER_H diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index b834b2d52..67a4988d9 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/consolehandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/consolehandler.hpp b/lib/remote/consolehandler.hpp index b5e838f50..5ef22ca1a 100644 --- a/lib/remote/consolehandler.hpp +++ b/lib/remote/consolehandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CONSOLEHANDLER_H #define CONSOLEHANDLER_H diff --git a/lib/remote/createobjecthandler.cpp b/lib/remote/createobjecthandler.cpp index 174b6dd88..30eb0bac7 100644 --- a/lib/remote/createobjecthandler.cpp +++ b/lib/remote/createobjecthandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/createobjecthandler.hpp" #include "remote/configobjectutility.hpp" diff --git a/lib/remote/createobjecthandler.hpp b/lib/remote/createobjecthandler.hpp index 9926e10bf..e9da35abf 100644 --- a/lib/remote/createobjecthandler.hpp +++ b/lib/remote/createobjecthandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CREATEOBJECTHANDLER_H #define CREATEOBJECTHANDLER_H diff --git a/lib/remote/deleteobjecthandler.cpp b/lib/remote/deleteobjecthandler.cpp index 684c180ba..3c2f7c1a8 100644 --- a/lib/remote/deleteobjecthandler.cpp +++ b/lib/remote/deleteobjecthandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/deleteobjecthandler.hpp" #include "remote/configobjectutility.hpp" diff --git a/lib/remote/deleteobjecthandler.hpp b/lib/remote/deleteobjecthandler.hpp index 665cf1ba8..61cfa8bf7 100644 --- a/lib/remote/deleteobjecthandler.hpp +++ b/lib/remote/deleteobjecthandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef DELETEOBJECTHANDLER_H #define DELETEOBJECTHANDLER_H diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp index 1d5cf2943..155532d5a 100644 --- a/lib/remote/endpoint.cpp +++ b/lib/remote/endpoint.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/endpoint.hpp" #include "remote/endpoint-ti.cpp" diff --git a/lib/remote/endpoint.hpp b/lib/remote/endpoint.hpp index 79c7b493f..7c490514d 100644 --- a/lib/remote/endpoint.hpp +++ b/lib/remote/endpoint.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ENDPOINT_H #define ENDPOINT_H diff --git a/lib/remote/endpoint.ti b/lib/remote/endpoint.ti index 035866fc7..1c3b654d1 100644 --- a/lib/remote/endpoint.ti +++ b/lib/remote/endpoint.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/lib/remote/eventqueue.cpp b/lib/remote/eventqueue.cpp index d72451771..0d251f1d9 100644 --- a/lib/remote/eventqueue.cpp +++ b/lib/remote/eventqueue.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/eventqueue.hpp" #include "remote/filterutility.hpp" diff --git a/lib/remote/eventqueue.hpp b/lib/remote/eventqueue.hpp index aaec04ec7..45d23af23 100644 --- a/lib/remote/eventqueue.hpp +++ b/lib/remote/eventqueue.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EVENTQUEUE_H #define EVENTQUEUE_H diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index a076bc458..7208e3d6b 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/eventshandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/eventshandler.hpp b/lib/remote/eventshandler.hpp index 2d00ff530..78f8d03d0 100644 --- a/lib/remote/eventshandler.hpp +++ b/lib/remote/eventshandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EVENTSHANDLER_H #define EVENTSHANDLER_H diff --git a/lib/remote/filterutility.cpp b/lib/remote/filterutility.cpp index cf6cb9ed4..c74af5be3 100644 --- a/lib/remote/filterutility.cpp +++ b/lib/remote/filterutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/filterutility.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/filterutility.hpp b/lib/remote/filterutility.hpp index d9ccb3ba6..70e5b7e6f 100644 --- a/lib/remote/filterutility.hpp +++ b/lib/remote/filterutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef FILTERUTILITY_H #define FILTERUTILITY_H diff --git a/lib/remote/httpchunkedencoding.cpp b/lib/remote/httpchunkedencoding.cpp index 6ae9e3852..2b52636aa 100644 --- a/lib/remote/httpchunkedencoding.cpp +++ b/lib/remote/httpchunkedencoding.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httpchunkedencoding.hpp" #include diff --git a/lib/remote/httpchunkedencoding.hpp b/lib/remote/httpchunkedencoding.hpp index fd22fbfe4..70cd58ca4 100644 --- a/lib/remote/httpchunkedencoding.hpp +++ b/lib/remote/httpchunkedencoding.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPCHUNKEDENCODING_H #define HTTPCHUNKEDENCODING_H diff --git a/lib/remote/httpclientconnection.cpp b/lib/remote/httpclientconnection.cpp index 3fde14abf..2124b19ee 100644 --- a/lib/remote/httpclientconnection.cpp +++ b/lib/remote/httpclientconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httpclientconnection.hpp" #include "base/configtype.hpp" diff --git a/lib/remote/httpclientconnection.hpp b/lib/remote/httpclientconnection.hpp index dd6a2b5ec..bff0f51d6 100644 --- a/lib/remote/httpclientconnection.hpp +++ b/lib/remote/httpclientconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPCLIENTCONNECTION_H #define HTTPCLIENTCONNECTION_H diff --git a/lib/remote/httphandler.cpp b/lib/remote/httphandler.cpp index 2d30c402f..bf8bed37d 100644 --- a/lib/remote/httphandler.cpp +++ b/lib/remote/httphandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httphandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/httphandler.hpp b/lib/remote/httphandler.hpp index e88fee700..95ddd0b49 100644 --- a/lib/remote/httphandler.hpp +++ b/lib/remote/httphandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPHANDLER_H #define HTTPHANDLER_H diff --git a/lib/remote/httprequest.cpp b/lib/remote/httprequest.cpp index f422a44a8..6c64dd609 100644 --- a/lib/remote/httprequest.cpp +++ b/lib/remote/httprequest.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httprequest.hpp" #include "base/logger.hpp" diff --git a/lib/remote/httprequest.hpp b/lib/remote/httprequest.hpp index ffdcb1c7e..1f1a9734b 100644 --- a/lib/remote/httprequest.hpp +++ b/lib/remote/httprequest.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPREQUEST_H #define HTTPREQUEST_H diff --git a/lib/remote/httpresponse.cpp b/lib/remote/httpresponse.cpp index de029b701..d6e5d3f66 100644 --- a/lib/remote/httpresponse.cpp +++ b/lib/remote/httpresponse.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httpresponse.hpp" #include "remote/httpchunkedencoding.hpp" diff --git a/lib/remote/httpresponse.hpp b/lib/remote/httpresponse.hpp index 5bd29a2f0..90b25764f 100644 --- a/lib/remote/httpresponse.hpp +++ b/lib/remote/httpresponse.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPRESPONSE_H #define HTTPRESPONSE_H diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 4f1a50cae..8192dfaca 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httpserverconnection.hpp" #include "remote/httphandler.hpp" diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index 9e6c7edb3..e27ba839c 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPSERVERCONNECTION_H #define HTTPSERVERCONNECTION_H diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 243209b4a..043f3cf9e 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/httputility.hpp" #include "base/json.hpp" diff --git a/lib/remote/httputility.hpp b/lib/remote/httputility.hpp index a797f8907..0a0418161 100644 --- a/lib/remote/httputility.hpp +++ b/lib/remote/httputility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef HTTPUTILITY_H #define HTTPUTILITY_H diff --git a/lib/remote/i2-remote.hpp b/lib/remote/i2-remote.hpp index 4e76bee72..5755befdb 100644 --- a/lib/remote/i2-remote.hpp +++ b/lib/remote/i2-remote.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef I2REMOTE_H #define I2REMOTE_H diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp index 0d0020d84..6925a668f 100644 --- a/lib/remote/infohandler.cpp +++ b/lib/remote/infohandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/infohandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/infohandler.hpp b/lib/remote/infohandler.hpp index 7a5eae0e7..38c88af11 100644 --- a/lib/remote/infohandler.hpp +++ b/lib/remote/infohandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef INFOHANDLER_H #define INFOHANDLER_H diff --git a/lib/remote/jsonrpc.cpp b/lib/remote/jsonrpc.cpp index f446cbc31..1c429ea7c 100644 --- a/lib/remote/jsonrpc.cpp +++ b/lib/remote/jsonrpc.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/jsonrpc.hpp" #include "base/netstring.hpp" diff --git a/lib/remote/jsonrpc.hpp b/lib/remote/jsonrpc.hpp index 81bd77449..44e8a9360 100644 --- a/lib/remote/jsonrpc.hpp +++ b/lib/remote/jsonrpc.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef JSONRPC_H #define JSONRPC_H diff --git a/lib/remote/jsonrpcconnection-heartbeat.cpp b/lib/remote/jsonrpcconnection-heartbeat.cpp index f93884d59..5b466830c 100644 --- a/lib/remote/jsonrpcconnection-heartbeat.cpp +++ b/lib/remote/jsonrpcconnection-heartbeat.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/jsonrpcconnection.hpp" #include "remote/messageorigin.hpp" diff --git a/lib/remote/jsonrpcconnection-pki.cpp b/lib/remote/jsonrpcconnection-pki.cpp index 0c48b3d04..8eb82ed40 100644 --- a/lib/remote/jsonrpcconnection-pki.cpp +++ b/lib/remote/jsonrpcconnection-pki.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/jsonrpcconnection.hpp" #include "remote/apilistener.hpp" diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index b9a9ceee2..99d0d7feb 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/jsonrpcconnection.hpp" #include "remote/apilistener.hpp" diff --git a/lib/remote/jsonrpcconnection.hpp b/lib/remote/jsonrpcconnection.hpp index 48c1dcef1..40df9af13 100644 --- a/lib/remote/jsonrpcconnection.hpp +++ b/lib/remote/jsonrpcconnection.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef JSONRPCCONNECTION_H #define JSONRPCCONNECTION_H diff --git a/lib/remote/messageorigin.cpp b/lib/remote/messageorigin.cpp index 04b7ee072..7de0ca7a4 100644 --- a/lib/remote/messageorigin.cpp +++ b/lib/remote/messageorigin.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/messageorigin.hpp" diff --git a/lib/remote/messageorigin.hpp b/lib/remote/messageorigin.hpp index 61fd4c264..8a91ecc46 100644 --- a/lib/remote/messageorigin.hpp +++ b/lib/remote/messageorigin.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MESSAGEORIGIN_H #define MESSAGEORIGIN_H diff --git a/lib/remote/modifyobjecthandler.cpp b/lib/remote/modifyobjecthandler.cpp index f787b354b..8e93f7423 100644 --- a/lib/remote/modifyobjecthandler.cpp +++ b/lib/remote/modifyobjecthandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/modifyobjecthandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/modifyobjecthandler.hpp b/lib/remote/modifyobjecthandler.hpp index cbfc55a59..2df23656c 100644 --- a/lib/remote/modifyobjecthandler.hpp +++ b/lib/remote/modifyobjecthandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef MODIFYOBJECTHANDLER_H #define MODIFYOBJECTHANDLER_H diff --git a/lib/remote/objectqueryhandler.cpp b/lib/remote/objectqueryhandler.cpp index 6e87afa2a..132e2bddd 100644 --- a/lib/remote/objectqueryhandler.cpp +++ b/lib/remote/objectqueryhandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/objectqueryhandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/objectqueryhandler.hpp b/lib/remote/objectqueryhandler.hpp index 52e669640..634775c64 100644 --- a/lib/remote/objectqueryhandler.hpp +++ b/lib/remote/objectqueryhandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef OBJECTQUERYHANDLER_H #define OBJECTQUERYHANDLER_H diff --git a/lib/remote/pkiutility.cpp b/lib/remote/pkiutility.cpp index 3e514cc4a..56a7ed257 100644 --- a/lib/remote/pkiutility.cpp +++ b/lib/remote/pkiutility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/pkiutility.hpp" #include "remote/apilistener.hpp" diff --git a/lib/remote/pkiutility.hpp b/lib/remote/pkiutility.hpp index 6fb6119fd..cc5e67061 100644 --- a/lib/remote/pkiutility.hpp +++ b/lib/remote/pkiutility.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef PKIUTILITY_H #define PKIUTILITY_H diff --git a/lib/remote/statushandler.cpp b/lib/remote/statushandler.cpp index 173425ced..e40a7ae03 100644 --- a/lib/remote/statushandler.cpp +++ b/lib/remote/statushandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/statushandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/statushandler.hpp b/lib/remote/statushandler.hpp index ef991864a..a4ec52875 100644 --- a/lib/remote/statushandler.hpp +++ b/lib/remote/statushandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef STATUSHANDLER_H #define STATUSHANDLER_H diff --git a/lib/remote/templatequeryhandler.cpp b/lib/remote/templatequeryhandler.cpp index 75cf907a1..ea24fd20f 100644 --- a/lib/remote/templatequeryhandler.cpp +++ b/lib/remote/templatequeryhandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/templatequeryhandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/templatequeryhandler.hpp b/lib/remote/templatequeryhandler.hpp index 114f5879f..4e137e943 100644 --- a/lib/remote/templatequeryhandler.hpp +++ b/lib/remote/templatequeryhandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TEMPLATEQUERYHANDLER_H #define TEMPLATEQUERYHANDLER_H diff --git a/lib/remote/typequeryhandler.cpp b/lib/remote/typequeryhandler.cpp index 4b293f38b..e3972616a 100644 --- a/lib/remote/typequeryhandler.cpp +++ b/lib/remote/typequeryhandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/typequeryhandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/typequeryhandler.hpp b/lib/remote/typequeryhandler.hpp index 6019432ad..4ca3fcf4e 100644 --- a/lib/remote/typequeryhandler.hpp +++ b/lib/remote/typequeryhandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef TYPEQUERYHANDLER_H #define TYPEQUERYHANDLER_H diff --git a/lib/remote/url-characters.hpp b/lib/remote/url-characters.hpp index 5f799926b..3cc492198 100644 --- a/lib/remote/url-characters.hpp +++ b/lib/remote/url-characters.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef URL_CHARACTERS_H #define URL_CHARACTERS_H diff --git a/lib/remote/url.cpp b/lib/remote/url.cpp index cc88bf35f..e87628eed 100644 --- a/lib/remote/url.cpp +++ b/lib/remote/url.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/array.hpp" #include "base/utility.hpp" diff --git a/lib/remote/url.hpp b/lib/remote/url.hpp index 1f74097b6..6012b2f3e 100644 --- a/lib/remote/url.hpp +++ b/lib/remote/url.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef URL_H #define URL_H diff --git a/lib/remote/variablequeryhandler.cpp b/lib/remote/variablequeryhandler.cpp index f9c66247c..04d014784 100644 --- a/lib/remote/variablequeryhandler.cpp +++ b/lib/remote/variablequeryhandler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/variablequeryhandler.hpp" #include "remote/httputility.hpp" diff --git a/lib/remote/variablequeryhandler.hpp b/lib/remote/variablequeryhandler.hpp index a9ccc1a1b..85a006a4b 100644 --- a/lib/remote/variablequeryhandler.hpp +++ b/lib/remote/variablequeryhandler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef VARIABLEQUERYHANDLER_H #define VARIABLEQUERYHANDLER_H diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index 55503aa71..5ae1468c1 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "remote/zone.hpp" #include "remote/zone-ti.cpp" diff --git a/lib/remote/zone.hpp b/lib/remote/zone.hpp index 0b041d85d..897b18e96 100644 --- a/lib/remote/zone.hpp +++ b/lib/remote/zone.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ZONE_H #define ZONE_H diff --git a/lib/remote/zone.ti b/lib/remote/zone.ti index 5d6172cf3..53fd4e609 100644 --- a/lib/remote/zone.ti +++ b/lib/remote/zone.ti @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/configobject.hpp" diff --git a/plugins/check_disk.cpp b/plugins/check_disk.cpp index 91c40d0c2..ac475b560 100644 --- a/plugins/check_disk.cpp +++ b/plugins/check_disk.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_load.cpp b/plugins/check_load.cpp index 83c8cc9e2..563c34788 100644 --- a/plugins/check_load.cpp +++ b/plugins/check_load.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_memory.cpp b/plugins/check_memory.cpp index 4b71517a4..146144532 100644 --- a/plugins/check_memory.cpp +++ b/plugins/check_memory.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_network.cpp b/plugins/check_network.cpp index db0bb1970..d3f02b075 100644 --- a/plugins/check_network.cpp +++ b/plugins/check_network.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #define WIN32_LEAN_AND_MEAN diff --git a/plugins/check_nscp_api.cpp b/plugins/check_nscp_api.cpp index f48c63ab8..6619b960e 100644 --- a/plugins/check_nscp_api.cpp +++ b/plugins/check_nscp_api.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #define VERSION "1.0.1" diff --git a/plugins/check_perfmon.cpp b/plugins/check_perfmon.cpp index bfe883b2d..c0a42f92f 100644 --- a/plugins/check_perfmon.cpp +++ b/plugins/check_perfmon.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_ping.cpp b/plugins/check_ping.cpp index 872ea1638..e341c0beb 100644 --- a/plugins/check_ping.cpp +++ b/plugins/check_ping.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN //else winsock will be included with windows.h and conflict with winsock2 diff --git a/plugins/check_procs.cpp b/plugins/check_procs.cpp index 0fa38e44c..44e2483ef 100644 --- a/plugins/check_procs.cpp +++ b/plugins/check_procs.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_service.cpp b/plugins/check_service.cpp index 0543518ce..3697e35b8 100644 --- a/plugins/check_service.cpp +++ b/plugins/check_service.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_swap.cpp b/plugins/check_swap.cpp index 7579073b7..a095bbbc3 100644 --- a/plugins/check_swap.cpp +++ b/plugins/check_swap.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_update.cpp b/plugins/check_update.cpp index c403a0167..161b2d692 100644 --- a/plugins/check_update.cpp +++ b/plugins/check_update.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_uptime.cpp b/plugins/check_uptime.cpp index 8f47214be..d26431b0a 100644 --- a/plugins/check_uptime.cpp +++ b/plugins/check_uptime.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/check_users.cpp b/plugins/check_users.cpp index 5fb0a74f0..9193551db 100644 --- a/plugins/check_users.cpp +++ b/plugins/check_users.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/thresholds.cpp b/plugins/thresholds.cpp index acc2bcafb..bdd67ee95 100644 --- a/plugins/thresholds.cpp +++ b/plugins/thresholds.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "plugins/thresholds.hpp" #include diff --git a/plugins/thresholds.hpp b/plugins/thresholds.hpp index e7d77f745..4c47ddb7d 100644 --- a/plugins/thresholds.hpp +++ b/plugins/thresholds.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef THRESHOLDS_H #define THRESHOLDS_H diff --git a/test/base-array.cpp b/test/base-array.cpp index 258693d37..33e54e8f1 100644 --- a/test/base-array.cpp +++ b/test/base-array.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/array.hpp" #include "base/objectlock.hpp" diff --git a/test/base-base64.cpp b/test/base-base64.cpp index ef988c618..f9e6aece7 100644 --- a/test/base-base64.cpp +++ b/test/base-base64.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/base64.hpp" #include diff --git a/test/base-convert.cpp b/test/base-convert.cpp index 48499b1cb..17805ea5c 100644 --- a/test/base-convert.cpp +++ b/test/base-convert.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/convert.hpp" #include "base/object.hpp" diff --git a/test/base-dictionary.cpp b/test/base-dictionary.cpp index 79d736f0a..cd074e1a9 100644 --- a/test/base-dictionary.cpp +++ b/test/base-dictionary.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/objectlock.hpp" diff --git a/test/base-fifo.cpp b/test/base-fifo.cpp index 63ad15883..5ecf1ac7d 100644 --- a/test/base-fifo.cpp +++ b/test/base-fifo.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/fifo.hpp" #include "base/objectlock.hpp" diff --git a/test/base-json.cpp b/test/base-json.cpp index 5d22f2901..7cb799af0 100644 --- a/test/base-json.cpp +++ b/test/base-json.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/dictionary.hpp" #include "base/objectlock.hpp" diff --git a/test/base-match.cpp b/test/base-match.cpp index 87df138e2..7fad3cba8 100644 --- a/test/base-match.cpp +++ b/test/base-match.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/utility.hpp" #include diff --git a/test/base-netstring.cpp b/test/base-netstring.cpp index a4ad1a1af..faa7eb56f 100644 --- a/test/base-netstring.cpp +++ b/test/base-netstring.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/netstring.hpp" #include "base/fifo.hpp" diff --git a/test/base-object-packer.cpp b/test/base-object-packer.cpp index 8eae53382..b84705d14 100644 --- a/test/base-object-packer.cpp +++ b/test/base-object-packer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object-packer.hpp" #include "base/value.hpp" diff --git a/test/base-object.cpp b/test/base-object.cpp index 6d17cc4de..fb3c2b3d6 100644 --- a/test/base-object.cpp +++ b/test/base-object.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/object.hpp" #include "base/value.hpp" diff --git a/test/base-serialize.cpp b/test/base-serialize.cpp index 6733fdf8f..3293f86ab 100644 --- a/test/base-serialize.cpp +++ b/test/base-serialize.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/perfdatavalue.hpp" #include "base/dictionary.hpp" diff --git a/test/base-shellescape.cpp b/test/base-shellescape.cpp index d2e9a21f2..1eb0eaef5 100644 --- a/test/base-shellescape.cpp +++ b/test/base-shellescape.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/utility.hpp" #include diff --git a/test/base-stacktrace.cpp b/test/base-stacktrace.cpp index 085f1650d..349c2364a 100644 --- a/test/base-stacktrace.cpp +++ b/test/base-stacktrace.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stacktrace.hpp" #include diff --git a/test/base-stream.cpp b/test/base-stream.cpp index 2d495e063..34a93a2bf 100644 --- a/test/base-stream.cpp +++ b/test/base-stream.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/stdiostream.hpp" #include "base/string.hpp" diff --git a/test/base-string.cpp b/test/base-string.cpp index c84496731..835b1a643 100644 --- a/test/base-string.cpp +++ b/test/base-string.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/string.hpp" #include diff --git a/test/base-timer.cpp b/test/base-timer.cpp index a9500a203..db6922ebc 100644 --- a/test/base-timer.cpp +++ b/test/base-timer.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/timer.hpp" #include "base/utility.hpp" diff --git a/test/base-type.cpp b/test/base-type.cpp index 301ed5c29..21bcf439d 100644 --- a/test/base-type.cpp +++ b/test/base-type.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/perfdatavalue.hpp" #include "base/dictionary.hpp" diff --git a/test/base-utility.cpp b/test/base-utility.cpp index fdc1a17d2..a4e9eafe4 100644 --- a/test/base-utility.cpp +++ b/test/base-utility.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/utility.hpp" #include diff --git a/test/base-value.cpp b/test/base-value.cpp index 1692797fd..950290e12 100644 --- a/test/base-value.cpp +++ b/test/base-value.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/value.hpp" #include diff --git a/test/config-ops.cpp b/test/config-ops.cpp index c4adaf414..dfbef2530 100644 --- a/test/config-ops.cpp +++ b/test/config-ops.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configcompiler.hpp" #include "base/exception.hpp" diff --git a/test/icinga-checkable-fixture.cpp b/test/icinga-checkable-fixture.cpp index 9ba2841ff..67fab1be2 100644 --- a/test/icinga-checkable-fixture.cpp +++ b/test/icinga-checkable-fixture.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "cli/daemonutility.hpp" #include "base/application.hpp" diff --git a/test/icinga-checkable-flapping.cpp b/test/icinga-checkable-flapping.cpp index be6ac0744..bc3056425 100644 --- a/test/icinga-checkable-flapping.cpp +++ b/test/icinga-checkable-flapping.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/host.hpp" #include diff --git a/test/icinga-checkresult.cpp b/test/icinga-checkresult.cpp index 0e85e6643..7db7fffb3 100644 --- a/test/icinga-checkresult.cpp +++ b/test/icinga-checkresult.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/host.hpp" #include diff --git a/test/icinga-legacytimeperiod.cpp b/test/icinga-legacytimeperiod.cpp index b40d19f61..695a2a1cc 100644 --- a/test/icinga-legacytimeperiod.cpp +++ b/test/icinga-legacytimeperiod.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 diff --git a/test/icinga-macros.cpp b/test/icinga-macros.cpp index 0c4391ebc..e7c789c40 100644 --- a/test/icinga-macros.cpp +++ b/test/icinga-macros.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/macroprocessor.hpp" #include diff --git a/test/icinga-notification.cpp b/test/icinga-notification.cpp index 4beafd20e..13e105fd1 100644 --- a/test/icinga-notification.cpp +++ b/test/icinga-notification.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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/notification.hpp" #include diff --git a/test/icinga-perfdata.cpp b/test/icinga-perfdata.cpp index ae859d48a..b0fa1ee98 100644 --- a/test/icinga-perfdata.cpp +++ b/test/icinga-perfdata.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/perfdatavalue.hpp" #include "icinga/pluginutility.hpp" diff --git a/test/icingaapplication-fixture.cpp b/test/icingaapplication-fixture.cpp index a4893d521..80fa4bfd8 100644 --- a/test/icingaapplication-fixture.cpp +++ b/test/icingaapplication-fixture.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** -* Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://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 "icingaapplication-fixture.hpp" diff --git a/test/icingaapplication-fixture.hpp b/test/icingaapplication-fixture.hpp index ac6c63134..23f4c9c81 100644 --- a/test/icingaapplication-fixture.hpp +++ b/test/icingaapplication-fixture.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** -* Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef ICINGAAPPLICATION_FIXTURE_H #define ICINGAAPPLICATION_FIXTURE_H diff --git a/test/livestatus-fixture.cpp b/test/livestatus-fixture.cpp index c9fc74db7..aaa0e073a 100644 --- a/test/livestatus-fixture.cpp +++ b/test/livestatus-fixture.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configcompiler.hpp" #include "config/configitem.hpp" diff --git a/test/livestatus.cpp b/test/livestatus.cpp index da3b7fc38..6aafa3be3 100644 --- a/test/livestatus.cpp +++ b/test/livestatus.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "livestatus/livestatusquery.hpp" #include "base/application.hpp" diff --git a/test/remote-url.cpp b/test/remote-url.cpp index 6675a56dd..36b79894e 100644 --- a/test/remote-url.cpp +++ b/test/remote-url.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/array.hpp" #include "remote/url.hpp" diff --git a/test/test-runner.cpp b/test/test-runner.cpp index 461001c33..1a7c6dd57 100644 --- a/test/test-runner.cpp +++ b/test/test-runner.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** -* Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #define BOOST_TEST_MAIN diff --git a/third-party/execvpe/execvpe.h b/third-party/execvpe/execvpe.h index 5a0e269af..5e32d66b6 100644 --- a/third-party/execvpe/execvpe.h +++ b/third-party/execvpe/execvpe.h @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef EXECVPE_H #define EXECVPE_H diff --git a/tools/mkclass/class_lexer.ll b/tools/mkclass/class_lexer.ll index bb4407586..56f219a76 100644 --- a/tools/mkclass/class_lexer.ll +++ b/tools/mkclass/class_lexer.ll @@ -1,22 +1,5 @@ %{ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "classcompiler.hpp" diff --git a/tools/mkclass/class_parser.yy b/tools/mkclass/class_parser.yy index 01af32ead..0524b2d1c 100644 --- a/tools/mkclass/class_parser.yy +++ b/tools/mkclass/class_parser.yy @@ -1,22 +1,5 @@ %{ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "classcompiler.hpp" #include diff --git a/tools/mkclass/classcompiler.cpp b/tools/mkclass/classcompiler.cpp index ce9a2f1ca..fd30df8e1 100644 --- a/tools/mkclass/classcompiler.cpp +++ b/tools/mkclass/classcompiler.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "classcompiler.hpp" #include diff --git a/tools/mkclass/classcompiler.hpp b/tools/mkclass/classcompiler.hpp index 5aa2ebc71..c05de11a7 100644 --- a/tools/mkclass/classcompiler.hpp +++ b/tools/mkclass/classcompiler.hpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ */ #ifndef CLASSCOMPILER_H #define CLASSCOMPILER_H diff --git a/tools/mkclass/mkclass.cpp b/tools/mkclass/mkclass.cpp index 869a67366..eb0d8f8ee 100644 --- a/tools/mkclass/mkclass.cpp +++ b/tools/mkclass/mkclass.cpp @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "classcompiler.hpp" #include diff --git a/tools/mkembedconfig/mkembedconfig.c b/tools/mkembedconfig/mkembedconfig.c index 9618ccb8a..ae2308719 100644 --- a/tools/mkembedconfig/mkembedconfig.c +++ b/tools/mkembedconfig/mkembedconfig.c @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 #include diff --git a/tools/mkunity/mkunity.c b/tools/mkunity/mkunity.c index 9f3069c04..cf36f605b 100644 --- a/tools/mkunity/mkunity.c +++ b/tools/mkunity/mkunity.c @@ -1,21 +1,4 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 #include From 458f997a1847a5f4080aa6820c0e7b55cfedea0d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 15:09:36 +0100 Subject: [PATCH 0511/1162] Replace Copyright header with a short version, part II --- CMakeLists.txt | 17 +---------------- agent/CMakeLists.txt | 17 +---------------- choco/CMakeLists.txt | 17 +---------------- contrib/discover-api.py | 17 +---------------- contrib/discover.py | 17 +---------------- doc/CMakeLists.txt | 17 +---------------- etc/CMakeLists.txt | 17 +---------------- etc/initsystem/CMakeLists.txt | 17 +---------------- icinga-app/CMakeLists.txt | 17 +---------------- icinga-installer/CMakeLists.txt | 17 +---------------- itl/CMakeLists.txt | 17 +---------------- itl/plugins-contrib.d/CMakeLists.txt | 17 +---------------- lib/CMakeLists.txt | 17 +---------------- lib/base/CMakeLists.txt | 17 +---------------- lib/checker/CMakeLists.txt | 17 +---------------- lib/cli/CMakeLists.txt | 17 +---------------- lib/compat/CMakeLists.txt | 17 +---------------- lib/config/CMakeLists.txt | 17 +---------------- lib/db_ido/CMakeLists.txt | 17 +---------------- lib/db_ido_mysql/CMakeLists.txt | 17 +---------------- lib/db_ido_pgsql/CMakeLists.txt | 17 +---------------- lib/icinga/CMakeLists.txt | 17 +---------------- lib/livestatus/CMakeLists.txt | 17 +---------------- lib/methods/CMakeLists.txt | 17 +---------------- lib/mysql_shim/CMakeLists.txt | 17 +---------------- lib/notification/CMakeLists.txt | 17 +---------------- lib/perfdata/CMakeLists.txt | 17 +---------------- lib/pgsql_shim/CMakeLists.txt | 17 +---------------- lib/remote/CMakeLists.txt | 17 +---------------- plugins/CMakeLists.txt | 17 +---------------- test/CMakeLists.txt | 17 +---------------- third-party/CMakeLists.txt | 17 +---------------- third-party/execvpe/CMakeLists.txt | 17 +---------------- third-party/mmatch/CMakeLists.txt | 17 +---------------- third-party/socketpair/CMakeLists.txt | 17 +---------------- tools/CMakeLists.txt | 17 +---------------- tools/mkclass/CMakeLists.txt | 17 +---------------- tools/mkembedconfig/CMakeLists.txt | 17 +---------------- tools/mkunity/CMakeLists.txt | 17 +---------------- 39 files changed, 39 insertions(+), 624 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 672dee337..be16dae79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ cmake_minimum_required(VERSION 2.8.8) set(BOOST_MIN_VERSION "1.53.0") diff --git a/agent/CMakeLists.txt b/agent/CMakeLists.txt index d59d31d2d..ffee2820f 100644 --- a/agent/CMakeLists.txt +++ b/agent/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ if(MSVC) include_external_msproject( diff --git a/choco/CMakeLists.txt b/choco/CMakeLists.txt index 7460dddee..650c41cf1 100644 --- a/choco/CMakeLists.txt +++ b/choco/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ if(WIN32) find_program(CHOCO_BINARY choco) diff --git a/contrib/discover-api.py b/contrib/discover-api.py index 27f06e6c7..48be827d7 100755 --- a/contrib/discover-api.py +++ b/contrib/discover-api.py @@ -1,20 +1,5 @@ #!/usr/bin/env python -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ import sys import subprocess diff --git a/contrib/discover.py b/contrib/discover.py index 2a8618a78..8a7d0fe3e 100755 --- a/contrib/discover.py +++ b/contrib/discover.py @@ -1,20 +1,5 @@ #!/usr/bin/env python -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ import sys import subprocess diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index ac07bfcb6..3be5b582e 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ file(GLOB DOCSRCS "*.md") diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt index 08e5bcec8..f693bbcd4 100644 --- a/etc/CMakeLists.txt +++ b/etc/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ if(NOT WIN32) configure_file(icinga2/constants.conf.cmake ${CMAKE_CURRENT_BINARY_DIR}/icinga2/constants.conf @ONLY) diff --git a/etc/initsystem/CMakeLists.txt b/etc/initsystem/CMakeLists.txt index e702c839a..eb0f9f2da 100644 --- a/etc/initsystem/CMakeLists.txt +++ b/etc/initsystem/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ if(NOT WIN32) diff --git a/icinga-app/CMakeLists.txt b/icinga-app/CMakeLists.txt index 87993df4c..d3ecfe8ab 100644 --- a/icinga-app/CMakeLists.txt +++ b/icinga-app/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ if(MSVC) set(WindowsSources icinga.rc) diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt index 06aa843ab..6ac5e1f04 100644 --- a/icinga-installer/CMakeLists.txt +++ b/icinga-installer/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE diff --git a/itl/CMakeLists.txt b/itl/CMakeLists.txt index a67ff65d8..b302aa3eb 100644 --- a/itl/CMakeLists.txt +++ b/itl/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ add_subdirectory(plugins-contrib.d) diff --git a/itl/plugins-contrib.d/CMakeLists.txt b/itl/plugins-contrib.d/CMakeLists.txt index cda1c7999..6f94404b9 100644 --- a/itl/plugins-contrib.d/CMakeLists.txt +++ b/itl/plugins-contrib.d/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ install( FILES big-data.conf databases.conf hardware.conf icingacli.conf ipmi.conf logmanagement.conf metrics.conf network-components.conf network-services.conf operating-system.conf raid-controller.conf smart-attributes.conf storage.conf virtualization.conf vmware.conf web.conf diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 8c0fe2cfb..004fc154c 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ add_subdirectory(base) add_subdirectory(cli) diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index e1cbd6669..6d7661080 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(application.ti application-ti.cpp application-ti.hpp) mkclass_target(configobject.ti configobject-ti.cpp configobject-ti.hpp) diff --git a/lib/checker/CMakeLists.txt b/lib/checker/CMakeLists.txt index c983b2b17..5a8334c7f 100644 --- a/lib/checker/CMakeLists.txt +++ b/lib/checker/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(checkercomponent.ti checkercomponent-ti.cpp checkercomponent-ti.hpp) diff --git a/lib/cli/CMakeLists.txt b/lib/cli/CMakeLists.txt index 1fac5a474..c9cf84888 100644 --- a/lib/cli/CMakeLists.txt +++ b/lib/cli/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ set(cli_SOURCES i2-cli.hpp diff --git a/lib/compat/CMakeLists.txt b/lib/compat/CMakeLists.txt index 1438626d4..84225c4f8 100644 --- a/lib/compat/CMakeLists.txt +++ b/lib/compat/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(checkresultreader.ti checkresultreader-ti.cpp checkresultreader-ti.hpp) mkclass_target(compatlogger.ti compatlogger-ti.cpp compatlogger-ti.hpp) diff --git a/lib/config/CMakeLists.txt b/lib/config/CMakeLists.txt index fa136479c..042668dc3 100644 --- a/lib/config/CMakeLists.txt +++ b/lib/config/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ find_package(BISON 2.3.0 REQUIRED) find_package(FLEX 2.5.31 REQUIRED) diff --git a/lib/db_ido/CMakeLists.txt b/lib/db_ido/CMakeLists.txt index 2a63f3e0a..7a97d276e 100644 --- a/lib/db_ido/CMakeLists.txt +++ b/lib/db_ido/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(dbconnection.ti dbconnection-ti.cpp dbconnection-ti.hpp) diff --git a/lib/db_ido_mysql/CMakeLists.txt b/lib/db_ido_mysql/CMakeLists.txt index 5ac948649..70cb90db1 100644 --- a/lib/db_ido_mysql/CMakeLists.txt +++ b/lib/db_ido_mysql/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(idomysqlconnection.ti idomysqlconnection-ti.cpp idomysqlconnection-ti.hpp) diff --git a/lib/db_ido_pgsql/CMakeLists.txt b/lib/db_ido_pgsql/CMakeLists.txt index 1e61786be..e081a6278 100644 --- a/lib/db_ido_pgsql/CMakeLists.txt +++ b/lib/db_ido_pgsql/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(idopgsqlconnection.ti idopgsqlconnection-ti.cpp idopgsqlconnection-ti.hpp) diff --git a/lib/icinga/CMakeLists.txt b/lib/icinga/CMakeLists.txt index 5eef7e0d3..7079d84e5 100644 --- a/lib/icinga/CMakeLists.txt +++ b/lib/icinga/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(checkable.ti checkable-ti.cpp checkable-ti.hpp) mkclass_target(checkcommand.ti checkcommand-ti.cpp checkcommand-ti.hpp) diff --git a/lib/livestatus/CMakeLists.txt b/lib/livestatus/CMakeLists.txt index 14267272e..d49f9f5e1 100644 --- a/lib/livestatus/CMakeLists.txt +++ b/lib/livestatus/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(livestatuslistener.ti livestatuslistener-ti.cpp livestatuslistener-ti.hpp) diff --git a/lib/methods/CMakeLists.txt b/lib/methods/CMakeLists.txt index b7e1f5fe9..f1cad8176 100644 --- a/lib/methods/CMakeLists.txt +++ b/lib/methods/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkembedconfig_target(methods-itl.conf methods-itl.cpp) diff --git a/lib/mysql_shim/CMakeLists.txt b/lib/mysql_shim/CMakeLists.txt index c6d99d52f..fc7dbeec3 100644 --- a/lib/mysql_shim/CMakeLists.txt +++ b/lib/mysql_shim/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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_directories(${MYSQL_INCLUDE_DIR}) diff --git a/lib/notification/CMakeLists.txt b/lib/notification/CMakeLists.txt index 2a30d9205..783b4fae9 100644 --- a/lib/notification/CMakeLists.txt +++ b/lib/notification/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(notificationcomponent.ti notificationcomponent-ti.cpp notificationcomponent-ti.hpp) diff --git a/lib/perfdata/CMakeLists.txt b/lib/perfdata/CMakeLists.txt index ab963f7dc..c7fba5851 100644 --- a/lib/perfdata/CMakeLists.txt +++ b/lib/perfdata/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(gelfwriter.ti gelfwriter-ti.cpp gelfwriter-ti.hpp) mkclass_target(graphitewriter.ti graphitewriter-ti.cpp graphitewriter-ti.hpp) diff --git a/lib/pgsql_shim/CMakeLists.txt b/lib/pgsql_shim/CMakeLists.txt index 0f4b22e6c..327b64a9d 100644 --- a/lib/pgsql_shim/CMakeLists.txt +++ b/lib/pgsql_shim/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ link_directories(${PostgreSQL_LIBRARY_DIRS}) include_directories(${PostgreSQL_INCLUDE_DIRS}) diff --git a/lib/remote/CMakeLists.txt b/lib/remote/CMakeLists.txt index 65113d231..e43780160 100644 --- a/lib/remote/CMakeLists.txt +++ b/lib/remote/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ mkclass_target(apilistener.ti apilistener-ti.cpp apilistener-ti.hpp) mkclass_target(apiuser.ti apiuser-ti.cpp apiuser-ti.hpp) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 4e4fe6bb9..ebf0c77df 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ add_executable(check_nscp_api check_nscp_api.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 714d6a768..8dc05b645 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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(BoostTestTargets) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 3873dde7a..1206a9152 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ add_subdirectory(mmatch) diff --git a/third-party/execvpe/CMakeLists.txt b/third-party/execvpe/CMakeLists.txt index 318072ec9..4dda40a93 100644 --- a/third-party/execvpe/CMakeLists.txt +++ b/third-party/execvpe/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ set(execvpe_SOURCES execvpe.c execvpe.h diff --git a/third-party/mmatch/CMakeLists.txt b/third-party/mmatch/CMakeLists.txt index 75d85eda0..f48e0739f 100644 --- a/third-party/mmatch/CMakeLists.txt +++ b/third-party/mmatch/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ set(mmatch_SOURCES mmatch.c mmatch.h diff --git a/third-party/socketpair/CMakeLists.txt b/third-party/socketpair/CMakeLists.txt index a5e51cf8f..89a38f703 100644 --- a/third-party/socketpair/CMakeLists.txt +++ b/third-party/socketpair/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ set(socketpair_SOURCES socketpair.c socketpair.h diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 60cbfb608..e3a822edb 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ add_subdirectory(mkclass) add_subdirectory(mkembedconfig) diff --git a/tools/mkclass/CMakeLists.txt b/tools/mkclass/CMakeLists.txt index 682d94002..1b97bdab9 100644 --- a/tools/mkclass/CMakeLists.txt +++ b/tools/mkclass/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ find_package(BISON 2.3.0 REQUIRED) find_package(FLEX 2.5.31 REQUIRED) diff --git a/tools/mkembedconfig/CMakeLists.txt b/tools/mkembedconfig/CMakeLists.txt index 5ff942b2a..90fe0ce71 100644 --- a/tools/mkembedconfig/CMakeLists.txt +++ b/tools/mkembedconfig/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ set(mkembedconfig_SOURCES mkembedconfig.c diff --git a/tools/mkunity/CMakeLists.txt b/tools/mkunity/CMakeLists.txt index 6356c2ce0..8fa0f20ac 100644 --- a/tools/mkunity/CMakeLists.txt +++ b/tools/mkunity/CMakeLists.txt @@ -1,19 +1,4 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ define_property( SOURCE From 37b715baf12f397498bb50cc7cccd0ee6929bd1e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 16:30:40 +0100 Subject: [PATCH 0512/1162] Replace a few more copyright strings --- CMakeLists.txt | 2 +- .../Properties/AssemblyInfo.cs | 4 +- choco/icinga2.nuspec.cmake | 4 +- cmake/InstallConfig.cmake | 18 +------ cmake/SetFullDir.cmake | 17 +------ contrib/GPLHeader | 20 +------- doc/icinga2.8 | 2 +- doc/update-links.py | 17 +------ etc/icinga2/scripts/mail-host-notification.sh | 5 +- .../scripts/mail-service-notification.sh | 3 +- icinga-app/icinga.rc | 6 +-- icinga-installer/icinga-installer.cpp | 1 + lib/cli/troubleshootcommand.cpp | 19 +------ lib/config/config_lexer.ll | 19 +------ lib/config/config_parser.yy | 21 +------- lib/db_ido_mysql/schema/mysql.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.0.2.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.1.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.2.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.3.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.4.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.5.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.6.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.8.0.sql | 2 +- lib/db_ido_mysql/schema/upgrade/2.8.1.sql | 2 +- lib/db_ido_pgsql/schema/pgsql.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.0.2.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.1.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.2.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.3.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.4.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.5.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.6.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.8.0.sql | 2 +- lib/db_ido_pgsql/schema/upgrade/2.8.1.sql | 2 +- plugins/README.md | 51 ------------------- tools/debug/natvis/extension.vsixmanifest | 2 +- 37 files changed, 43 insertions(+), 208 deletions(-) delete mode 100644 plugins/README.md diff --git a/CMakeLists.txt b/CMakeLists.txt index be16dae79..3556d3a96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -381,7 +381,7 @@ if(ICINGA2_WITH_TESTS) endif() set(CPACK_PACKAGE_NAME "Icinga 2") -set(CPACK_PACKAGE_VENDOR "Icinga Development Team") +set(CPACK_PACKAGE_VENDOR "Icinga GmbH") set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION}) set(CPACK_PACKAGE_INSTALL_DIRECTORY "ICINGA2") set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") diff --git a/agent/windows-setup-agent/Properties/AssemblyInfo.cs b/agent/windows-setup-agent/Properties/AssemblyInfo.cs index 34d61840c..d390a87ec 100644 --- a/agent/windows-setup-agent/Properties/AssemblyInfo.cs +++ b/agent/windows-setup-agent/Properties/AssemblyInfo.cs @@ -8,9 +8,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("Icinga 2 Agent Wizard")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Icinga Development Team")] +[assembly: AssemblyCompany("Icinga GmbH")] [assembly: AssemblyProduct("Icinga 2")] -[assembly: AssemblyCopyright("Copyright © 2014-2018 Icinga Development Team")] +[assembly: AssemblyCopyright("Copyright © 2014 Icinga GmbH")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/choco/icinga2.nuspec.cmake b/choco/icinga2.nuspec.cmake index 59af944f4..1b1465df6 100755 --- a/choco/icinga2.nuspec.cmake +++ b/choco/icinga2.nuspec.cmake @@ -7,8 +7,8 @@ icinga2 Icinga 2 ${SPEC_VERSION} - The Icinga Project - Icinga Development Team + Icinga GmbH + Icinga GmbH

      icinga2 - Monitoring Agent for Windows Icinga 2 is an open source monitoring platform which notifies users about host and service outages. https://icinga.com/ diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index 3f24b39d0..70eae91e6 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -1,20 +1,5 @@ -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com) +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ # -# 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. - # Install $src into directory $dest - usually only used for config files # # * similar to install() a non absolute path is prefixed with CMAKE_INSTALL_PREFIX on runtime @@ -22,6 +7,7 @@ # * DESTDIR is prefixed as well # # also see https://cmake.org/cmake/help/latest/command/install.html + function(install_if_not_exists src dest) if(NOT IS_ABSOLUTE "${src}") set(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}") diff --git a/cmake/SetFullDir.cmake b/cmake/SetFullDir.cmake index 3e9e2236a..8dce669af 100644 --- a/cmake/SetFullDir.cmake +++ b/cmake/SetFullDir.cmake @@ -1,20 +1,5 @@ -# Icinga 2 -# Copyright (C) 2018 Icinga Development Team (https://icinga.com) +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ # -# 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. - # Ensures a directory is absolute by prefixing CMAKE_INSTALL_PREFIX if it is not # similar to CMAKE_INSTALL_FULL_... https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html function(set_full_dir var path) diff --git a/contrib/GPLHeader b/contrib/GPLHeader index 3fd58b106..9b2cfd1a2 100644 --- a/contrib/GPLHeader +++ b/contrib/GPLHeader @@ -1,19 +1 @@ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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+ diff --git a/doc/icinga2.8 b/doc/icinga2.8 index ca177eefd..e229f3f72 100644 --- a/doc/icinga2.8 +++ b/doc/icinga2.8 @@ -92,7 +92,7 @@ Report bugs at .br Icinga home page: .SH COPYRIGHT -Copyright \(co 2012\-2014 Icinga Development Team (https://icinga.com) +Copyright \(co 2012 Icinga GmbH License GPLv2+: GNU GPL version 2 or later .br This is free software: you are free to change and redistribute it. diff --git a/doc/update-links.py b/doc/update-links.py index e569b0d84..765d4a04f 100755 --- a/doc/update-links.py +++ b/doc/update-links.py @@ -1,20 +1,5 @@ #!/usr/bin/env python -# Icinga 2 -# Copyright (C) 2012-2018 Icinga Development Team (https://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+ import os import sys diff --git a/etc/icinga2/scripts/mail-host-notification.sh b/etc/icinga2/scripts/mail-host-notification.sh index 958e2d639..9755bd169 100755 --- a/etc/icinga2/scripts/mail-host-notification.sh +++ b/etc/icinga2/scripts/mail-host-notification.sh @@ -1,7 +1,6 @@ #!/bin/sh -# -# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) -# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ +# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license PROG="`basename $0`" ICINGA2HOST="`hostname`" diff --git a/etc/icinga2/scripts/mail-service-notification.sh b/etc/icinga2/scripts/mail-service-notification.sh index 55edf4876..8e113103d 100755 --- a/etc/icinga2/scripts/mail-service-notification.sh +++ b/etc/icinga2/scripts/mail-service-notification.sh @@ -1,6 +1,5 @@ #!/bin/sh -# -# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license PROG="`basename $0`" diff --git a/icinga-app/icinga.rc b/icinga-app/icinga.rc index 9294f989b..dbd317be6 100644 --- a/icinga-app/icinga.rc +++ b/icinga-app/icinga.rc @@ -16,11 +16,11 @@ BEGIN BEGIN BLOCK "040904E4" BEGIN - VALUE "CompanyName", "Icinga Development Team" + VALUE "CompanyName", "Icinga GmbH" VALUE "FileDescription", "Icinga 2" VALUE "FileVersion", VERSION VALUE "InternalName", "icinga2.exe" - VALUE "LegalCopyright", " Icinga Development Team" + VALUE "LegalCopyright", " Icinga GmbH" VALUE "OriginalFilename", "icinga2.exe" VALUE "ProductName", "Icinga 2" VALUE "ProductVersion", VERSION @@ -31,4 +31,4 @@ BEGIN BEGIN VALUE "Translation", 0x409, 0x04E4 END -END \ No newline at end of file +END diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 268bb9b95..233f90cab 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -111,6 +111,7 @@ static void MkDirP(const std::string& path) static std::string GetNSISInstallPath(void) { HKEY hKey; + //TODO: Change hardcoded key if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Icinga Development Team\\ICINGA2", 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &hKey) == ERROR_SUCCESS) { BYTE pvData[MAX_PATH]; diff --git a/lib/cli/troubleshootcommand.cpp b/lib/cli/troubleshootcommand.cpp index 934678688..0c462558d 100644 --- a/lib/cli/troubleshootcommand.cpp +++ b/lib/cli/troubleshootcommand.cpp @@ -1,21 +1,4 @@ -/***************************************************************************** -* Icinga 2 * -* Copyright (C) 2012-2018 Icinga Development Team (https://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 "base/application.hpp" #include "base/console.hpp" diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index 5fae7aabc..71f1b96c7 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -1,22 +1,5 @@ %{ -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/configcompiler.hpp" #include "config/expression.hpp" diff --git a/lib/config/config_parser.yy b/lib/config/config_parser.yy index bad5796bd..4e0d536cc 100644 --- a/lib/config/config_parser.yy +++ b/lib/config/config_parser.yy @@ -1,24 +1,7 @@ %{ #define YYDEBUG 1 - -/****************************************************************************** - * Icinga 2 * - * Copyright (C) 2012-2018 Icinga Development Team (https://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 "config/i2-config.hpp" #include "config/configcompiler.hpp" diff --git a/lib/db_ido_mysql/schema/mysql.sql b/lib/db_ido_mysql/schema/mysql.sql index 6fec218c5..bf0461fba 100644 --- a/lib/db_ido_mysql/schema/mysql.sql +++ b/lib/db_ido_mysql/schema/mysql.sql @@ -2,7 +2,7 @@ -- mysql.sql -- DB definition for IDO MySQL -- --- Copyright (c) 2009-2018 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- -- -------------------------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.0.2.sql b/lib/db_ido_mysql/schema/upgrade/2.0.2.sql index 968e1d694..c622ae9a6 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.0.2.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.0.2.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.0.2 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.1.0.sql b/lib/db_ido_mysql/schema/upgrade/2.1.0.sql index e386da421..7bbed721b 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.1.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.1.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.1.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.2.0.sql b/lib/db_ido_mysql/schema/upgrade/2.2.0.sql index c0462e866..22a611531 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.2.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.2.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.2.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.3.0.sql b/lib/db_ido_mysql/schema/upgrade/2.3.0.sql index 27d37ff04..f2fe463b1 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.3.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.3.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.3.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.4.0.sql b/lib/db_ido_mysql/schema/upgrade/2.4.0.sql index 28e8ad27d..f6803f715 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.4.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.4.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.4.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.5.0.sql b/lib/db_ido_mysql/schema/upgrade/2.5.0.sql index cd7aabb48..d5714a0cb 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.5.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.5.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.5.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.6.0.sql b/lib/db_ido_mysql/schema/upgrade/2.6.0.sql index 672f8c9b8..33dd780b3 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.6.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.6.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.6.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.8.0.sql b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql index 680f1b5c4..8d511a757 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.8.0.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.8.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.0 -- -- ----------------------------------------- --- Copyright (c) 2017 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_mysql/schema/upgrade/2.8.1.sql b/lib/db_ido_mysql/schema/upgrade/2.8.1.sql index 0c558f77d..98f851143 100644 --- a/lib/db_ido_mysql/schema/upgrade/2.8.1.sql +++ b/lib/db_ido_mysql/schema/upgrade/2.8.1.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.1 (fix for fresh 2.8.0 installation only) -- -- ----------------------------------------- --- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/pgsql.sql b/lib/db_ido_pgsql/schema/pgsql.sql index 46697ee8c..242b6db5c 100644 --- a/lib/db_ido_pgsql/schema/pgsql.sql +++ b/lib/db_ido_pgsql/schema/pgsql.sql @@ -2,7 +2,7 @@ -- pgsql.sql -- DB definition for IDO Postgresql -- --- Copyright (c) 2009-2018 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- -------------------------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql b/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql index 6c6fd2126..60710efd3 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.0.2.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.0.2 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql index 6c5acfdce..a32ecea51 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.1.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.1.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql index e3af07a3b..d105a34be 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.2.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.2.0 -- -- ----------------------------------------- --- Copyright (c) 2014 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql index aa693f273..91764de64 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.3.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.3.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql index e4b3e16c8..4a6e45eb9 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.4.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.4.0 -- -- ----------------------------------------- --- Copyright (c) 2015 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql index db7cc246b..063a812d6 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.5.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.5.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql index f7c3a709e..aa538a62d 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.6.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.6.0 -- -- ----------------------------------------- --- Copyright (c) 2016 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql index e11ba03ce..31ab3246b 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.8.0.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.0 -- -- ----------------------------------------- --- Copyright (c) 2017 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql b/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql index ebff8fc9c..05202c03d 100644 --- a/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql +++ b/lib/db_ido_pgsql/schema/upgrade/2.8.1.sql @@ -2,7 +2,7 @@ -- upgrade path for Icinga 2.8.1 (fix for fresh 2.8.0 installation only) -- -- ----------------------------------------- --- Copyright (c) 2018 Icinga Development Team (https://icinga.com/) +-- Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ -- -- Please check https://docs.icinga.com for upgrading information! -- ----------------------------------------- diff --git a/plugins/README.md b/plugins/README.md deleted file mode 100644 index 0a34bffd8..000000000 --- a/plugins/README.md +++ /dev/null @@ -1,51 +0,0 @@ -## Icinga 2 plugins for Windows - -This collection of plugins is intended to provide basic functionality checks on windows machines. -They (mostly) conform to the [nagios developer guidelines](https://nagios-plugins.org/doc/guidelines.html), -returning adequate exit codes and printing a pertinent string with performance data. - - -### Intallation - -The plugins are installed as part of Icinga 2. - - -### Requirements - -- Boost 1.41.0 -- Windows Vista, Windows Server 2008 or newer - - -### Usage - -Call a plugin with the "--help" option to receive information about its usage. -Most of them don't need any parameters to but all of them have a -w (warning) and -c (critical) option. -Those accept, if not otherwise specified, value or percentage based thresholds or threshold ranges. - -A few examples: -*./check_command.exe -w 12 -c !60%* -Adds a warning threshold of 12 and an inversed critical threshold of 60% - -*./check_command.exe -w ![20%-80%] -c [0%-40%]* -The warning threshold is outside of 20% to 80% and the critical threshold is the range from 0% to 40%. -A critical state always overwrites a warning state, meaning the check would be critical with a value of 30%. - - -### License - -Icinga 2 -Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/) - -This program is free software; you can redistribute it and/or -modify it under the tems 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. diff --git a/tools/debug/natvis/extension.vsixmanifest b/tools/debug/natvis/extension.vsixmanifest index 4b8c6fcea..d870e89b1 100644 --- a/tools/debug/natvis/extension.vsixmanifest +++ b/tools/debug/natvis/extension.vsixmanifest @@ -1,6 +1,6 @@ - + Icinga 2 Debugger Visualizers for Visual Studio Icinga 2 Debugger Visualizers From 47c969eadc21de59afd2101d26676e15ccca200b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 7 Jan 2019 15:59:24 +0100 Subject: [PATCH 0513/1162] Dynamically print current copyright year in `--version` output (cherry picked from commit c1fedab7aea73f6aa9c9357c54c409665239d698) --- icinga-app/icinga.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index b97e79e83..1f8f635cc 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -543,7 +543,8 @@ static int Main() } if (vm.count("version")) { - std::cout << "Copyright (c) 2012-2018 Icinga Development Team (https://icinga.com/)" << std::endl + std::cout << "Copyright (c) 2012-" << Utility::FormatDateTime("%Y", Utility::GetTime()) + << " Icinga GmbH (https://icinga.com/)" << std::endl << "License GPLv2+: GNU GPL version 2 or later " << std::endl << "This is free software: you are free to change and redistribute it." << std::endl << "There is NO WARRANTY, to the extent permitted by law."; From 101783d7efe3050d68d2370db7b14a088bc1f413 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 16:53:13 +0100 Subject: [PATCH 0514/1162] Release version 2.10.3 --- CHANGELOG.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ VERSION | 2 +- changelog.py | 3 +- 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca748fde..8ba579778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,95 @@ # Icinga 2.x CHANGELOG +## 2.10.3 (2019-02-26) + +### Notes + +Bugfixes: + +- Stalled TLS connections on reload/Director deployments (#6816 #6898 ref/NC/588119) +- 'Connection: close' header leading to unstable instance, affects Ruby clients (#6799) +- Server time in the future breaks check result processing (#6797 ref/NC/595861) +- ScheduledDowntimes: Generate downtime objects only on one HA endpoint (#2844 ref/IC/9673 ref/NC/590167 ref/NC/591721) +- Improve activation & syncing for downtime objects generated from ScheduledDowntimes (#6826 ref/IC/9673 ref/NC/585559) +- Generate a runtime downtime object from already running ScheduledDowntime objects (#6704) +- DB IDO: Don't enqueue queries when the feature is paused in HA zones (#5876) +- Crashes with localtime_r errors (#6887) + +Documentation updates: + +- Ephemeral port range blocking on Windows agents (ref/NC/597307) +- Technical concepts for the check scheduler (#6775) +- DB IDO cleanup (#6791) +- Unified development docs (#6819) + +### Bug + +* [#6971](https://github.com/icinga/icinga2/issues/6971) (Notifications, PR): Activate downtimes before any checkable object +* [#6968](https://github.com/icinga/icinga2/issues/6968) (API, PR): Secure ApiUser::GetByAuthHeader\(\) against timing attacks +* [#6940](https://github.com/icinga/icinga2/issues/6940) (Plugins, Windows, PR): Fix check\_swap percentage calculation +* [#6925](https://github.com/icinga/icinga2/issues/6925) (Plugins, Windows, PR): Fix check\_swap formatting +* [#6924](https://github.com/icinga/icinga2/issues/6924) (PR): Fix double to long conversions +* [#6922](https://github.com/icinga/icinga2/issues/6922) (API, DB IDO): IDO MySQL fails on start if check\_interval is a float \(Icinga 2.9.2\) +* [#6920](https://github.com/icinga/icinga2/issues/6920) (PR): Downtime::AddDowntime\(\): place Downtimes in the same zone as the origin ScheduledDowntimes +* [#6917](https://github.com/icinga/icinga2/issues/6917) (Cluster, Log, PR): Cluster: Delete object message should log that +* [#6916](https://github.com/icinga/icinga2/issues/6916) (PR): Don't allow retry\_interval \<= 0 +* [#6914](https://github.com/icinga/icinga2/issues/6914) (Cluster, PR): ClusterEvents::AcknowledgementSet event should forward 'persistent' attribute +* [#6913](https://github.com/icinga/icinga2/issues/6913) (Plugins, Windows): check\_swap return value wrong when no swap file configured +* [#6901](https://github.com/icinga/icinga2/issues/6901) (API, PR): TcpSocket\#Bind\(\): also set SO\_REUSEPORT +* [#6899](https://github.com/icinga/icinga2/issues/6899) (PR): Log: Ensure not to pass negative values to localtime\(\) +* [#6898](https://github.com/icinga/icinga2/issues/6898) (API): API action restart-process fails on FreeBSD +* [#6894](https://github.com/icinga/icinga2/issues/6894) (Check Execution, PR): Fix checkresults from the future breaking checks +* [#6887](https://github.com/icinga/icinga2/issues/6887) (Check Execution, Windows): Icinga2 Windows Service does not start critical/checker: Exception occurred while checking 'hostname.tld' +* [#6883](https://github.com/icinga/icinga2/issues/6883) (Check Execution, PR): Allow Checkable\#retry\_interval to be 0 +* [#6871](https://github.com/icinga/icinga2/issues/6871): Icinga2 crashes after localtime\_r call +* [#6857](https://github.com/icinga/icinga2/issues/6857) (Plugins, Windows, PR): Url\#m\_Query: preserve order +* [#6826](https://github.com/icinga/icinga2/issues/6826) (Configuration, PR): Downtime\#HasValidConfigOwner\(\): wait for ScheduledDowntimes +* [#6821](https://github.com/icinga/icinga2/issues/6821) (Cluster, Configuration, PR): Don't delete downtimes in satellite zones +* [#6820](https://github.com/icinga/icinga2/issues/6820) (Cluster, PR): Only create downtimes from non-paused ScheduledDowntime objects in HA enabled cluster zones +* [#6817](https://github.com/icinga/icinga2/issues/6817) (API, PR): HttpServerConnection\#DataAvailableHandler\(\): be aware of being called multiple times concurrently +* [#6816](https://github.com/icinga/icinga2/issues/6816) (API, Cluster): Stalled TLS connections and lock waits in SocketEventEngine +* [#6814](https://github.com/icinga/icinga2/issues/6814) (API, PR): Restore 'Connection: close' behaviour in HTTP responses +* [#6811](https://github.com/icinga/icinga2/issues/6811) (Plugins, Windows, PR): Fix state conditions in check\_memory and check\_swap +* [#6810](https://github.com/icinga/icinga2/issues/6810) (Plugins, Windows): Windows check\_memory never gets critical +* [#6808](https://github.com/icinga/icinga2/issues/6808) (API, PR): Remove redundand check for object existence on creation via API +* [#6807](https://github.com/icinga/icinga2/issues/6807) (API): \[2.10.2\] Director deploy crashes the Icinga service \[FreeBSD\] +* [#6799](https://github.com/icinga/icinga2/issues/6799) (API): "Connection: close" header leads to unstable instance +* [#6797](https://github.com/icinga/icinga2/issues/6797) (Check Execution): Servertime in the future breaks check results processing +* [#6750](https://github.com/icinga/icinga2/issues/6750) (Configuration, PR): \#6749 Wrong operator on stride variable causing incorrect behaviour +* [#6749](https://github.com/icinga/icinga2/issues/6749) (Configuration): Stride is misinterpreted in multi-date legacydatetime +* [#6748](https://github.com/icinga/icinga2/issues/6748) (CLI, PR): Fix api setup to automatically create the conf.d directory +* [#6718](https://github.com/icinga/icinga2/issues/6718) (API, Cluster, PR): Call SSL\_shutdown\(\) at least twice +* [#6704](https://github.com/icinga/icinga2/issues/6704) (Notifications, PR): Put newly configured already running ScheduledDowntime immediately in effect +* [#6542](https://github.com/icinga/icinga2/issues/6542) (Configuration, Log): /var/log/icinga2/icinga2.log is growing very fast on satellites +* [#6536](https://github.com/icinga/icinga2/issues/6536) (Windows, help wanted): check\_nscp\_api: Query arguments are sorted on Url::Format\(\) +* [#4790](https://github.com/icinga/icinga2/issues/4790) (Notifications): Newly configured already running ScheduledDowntime not put into effect +* [#3937](https://github.com/icinga/icinga2/issues/3937) (API): Icinga2 API: PUT request fails at 0-byte file +* [#2844](https://github.com/icinga/icinga2/issues/2844) (Cluster): Duplicated scheduled downtimes created in cluster HA zone + +### Documentation + +* [#6956](https://github.com/icinga/icinga2/issues/6956) (Documentation, PR): Escape pipe symbol in api documentation +* [#6944](https://github.com/icinga/icinga2/issues/6944) (Documentation, PR): Troubleshooting: Add notes on ephemeral port range blocking on Windows agents +* [#6928](https://github.com/icinga/icinga2/issues/6928) (Documentation, PR): Doc: Add .NET 3.5 to the windows build stack +* [#6825](https://github.com/icinga/icinga2/issues/6825) (Documentation, PR): Document that retry\_interval is only used after an active check result +* [#6819](https://github.com/icinga/icinga2/issues/6819) (Documentation, PR): Enhance and unify development docs for debug, develop, package +* [#6791](https://github.com/icinga/icinga2/issues/6791) (Documentation, PR): Docs: Add a section for DB IDO Cleanup +* [#6776](https://github.com/icinga/icinga2/issues/6776) (Documentation, PR): Doc fix: update apache section +* [#6775](https://github.com/icinga/icinga2/issues/6775) (Documentation, PR): Add technical docs for the check scheduler \(general, initial check, offsets\) +* [#6751](https://github.com/icinga/icinga2/issues/6751) (Documentation, PR): Doc fix: documentation link for apt +* [#6743](https://github.com/icinga/icinga2/issues/6743) (Documentation, PR): Doc fix: error in example path. +* [#5341](https://github.com/icinga/icinga2/issues/5341) (Documentation): Enhance development documentation + +### Support + +* [#6972](https://github.com/icinga/icinga2/issues/6972) (PR): Fix formatting in development docs +* [#6958](https://github.com/icinga/icinga2/issues/6958) (code-quality, PR): Debug: Log calls to ConfigObject::Deactivate\(\) +* [#6897](https://github.com/icinga/icinga2/issues/6897) (PR): Validate Zone::GetLocalZone\(\) before using +* [#6872](https://github.com/icinga/icinga2/issues/6872) (Windows): 2.10 is unstable \(Windows Agent\) +* [#6843](https://github.com/icinga/icinga2/issues/6843) (Tests, Windows, PR): Improve AppVeyor builds +* [#6479](https://github.com/icinga/icinga2/issues/6479) (code-quality, PR): SocketEvents: inherit from Stream +* [#6477](https://github.com/icinga/icinga2/issues/6477) (code-quality): SocketEvents: inherit from Object + ## 2.10.2 (2018-11-14) ### Bug diff --git a/VERSION b/VERSION index 4320bb9a9..723a7afee 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.10.2 +Version: 2.10.3 Revision: 1 diff --git a/changelog.py b/changelog.py index a6bf2afbc..79bdb0c8b 100755 --- a/changelog.py +++ b/changelog.py @@ -198,8 +198,7 @@ for milestone in sorted(milestones.values(), key=lambda ms: (ms["due_on"], ms["t continue if milestone["due_on"] == None: - print "Milestone", milestone["title"], "does not have a due date." - sys.exit(1) + print "Warning: Milestone", milestone["title"], "does not have a due date." ms_due_on = datetime.strptime(milestone["due_on"], "%Y-%m-%dT%H:%M:%SZ") From 8d3c8fd107f5c6e0da5551992208213fd4b8a867 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Tue, 26 Feb 2019 08:49:36 +0100 Subject: [PATCH 0515/1162] Fix nested hostgroup example In Icinga 1.x the list of members was set on the group object, in Icinga 2 the list of groups is set on the member objects. --- doc/23-migrating-from-icinga-1x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/23-migrating-from-icinga-1x.md b/doc/23-migrating-from-icinga-1x.md index 4dd6e8397..4583b1606 100644 --- a/doc/23-migrating-from-icinga-1x.md +++ b/doc/23-migrating-from-icinga-1x.md @@ -116,11 +116,11 @@ This can be migrated to Icinga 2 and [using group assign](17-language-reference. object HostGroup "hg1" { + groups = [ "hg2" ] assign where host.name in [ "host1", "host2" ] } object HostGroup "hg2" { - groups = [ "hg1" ] assign where host.name == "host3" } From a7ea886f8fbfdc254a6e2b8959ceced0a46d9118 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 25 Feb 2019 16:53:13 +0100 Subject: [PATCH 0516/1162] Release version 2.10.3 --- CHANGELOG.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++ VERSION | 2 +- changelog.py | 3 +- 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca748fde..8ba579778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,95 @@ # Icinga 2.x CHANGELOG +## 2.10.3 (2019-02-26) + +### Notes + +Bugfixes: + +- Stalled TLS connections on reload/Director deployments (#6816 #6898 ref/NC/588119) +- 'Connection: close' header leading to unstable instance, affects Ruby clients (#6799) +- Server time in the future breaks check result processing (#6797 ref/NC/595861) +- ScheduledDowntimes: Generate downtime objects only on one HA endpoint (#2844 ref/IC/9673 ref/NC/590167 ref/NC/591721) +- Improve activation & syncing for downtime objects generated from ScheduledDowntimes (#6826 ref/IC/9673 ref/NC/585559) +- Generate a runtime downtime object from already running ScheduledDowntime objects (#6704) +- DB IDO: Don't enqueue queries when the feature is paused in HA zones (#5876) +- Crashes with localtime_r errors (#6887) + +Documentation updates: + +- Ephemeral port range blocking on Windows agents (ref/NC/597307) +- Technical concepts for the check scheduler (#6775) +- DB IDO cleanup (#6791) +- Unified development docs (#6819) + +### Bug + +* [#6971](https://github.com/icinga/icinga2/issues/6971) (Notifications, PR): Activate downtimes before any checkable object +* [#6968](https://github.com/icinga/icinga2/issues/6968) (API, PR): Secure ApiUser::GetByAuthHeader\(\) against timing attacks +* [#6940](https://github.com/icinga/icinga2/issues/6940) (Plugins, Windows, PR): Fix check\_swap percentage calculation +* [#6925](https://github.com/icinga/icinga2/issues/6925) (Plugins, Windows, PR): Fix check\_swap formatting +* [#6924](https://github.com/icinga/icinga2/issues/6924) (PR): Fix double to long conversions +* [#6922](https://github.com/icinga/icinga2/issues/6922) (API, DB IDO): IDO MySQL fails on start if check\_interval is a float \(Icinga 2.9.2\) +* [#6920](https://github.com/icinga/icinga2/issues/6920) (PR): Downtime::AddDowntime\(\): place Downtimes in the same zone as the origin ScheduledDowntimes +* [#6917](https://github.com/icinga/icinga2/issues/6917) (Cluster, Log, PR): Cluster: Delete object message should log that +* [#6916](https://github.com/icinga/icinga2/issues/6916) (PR): Don't allow retry\_interval \<= 0 +* [#6914](https://github.com/icinga/icinga2/issues/6914) (Cluster, PR): ClusterEvents::AcknowledgementSet event should forward 'persistent' attribute +* [#6913](https://github.com/icinga/icinga2/issues/6913) (Plugins, Windows): check\_swap return value wrong when no swap file configured +* [#6901](https://github.com/icinga/icinga2/issues/6901) (API, PR): TcpSocket\#Bind\(\): also set SO\_REUSEPORT +* [#6899](https://github.com/icinga/icinga2/issues/6899) (PR): Log: Ensure not to pass negative values to localtime\(\) +* [#6898](https://github.com/icinga/icinga2/issues/6898) (API): API action restart-process fails on FreeBSD +* [#6894](https://github.com/icinga/icinga2/issues/6894) (Check Execution, PR): Fix checkresults from the future breaking checks +* [#6887](https://github.com/icinga/icinga2/issues/6887) (Check Execution, Windows): Icinga2 Windows Service does not start critical/checker: Exception occurred while checking 'hostname.tld' +* [#6883](https://github.com/icinga/icinga2/issues/6883) (Check Execution, PR): Allow Checkable\#retry\_interval to be 0 +* [#6871](https://github.com/icinga/icinga2/issues/6871): Icinga2 crashes after localtime\_r call +* [#6857](https://github.com/icinga/icinga2/issues/6857) (Plugins, Windows, PR): Url\#m\_Query: preserve order +* [#6826](https://github.com/icinga/icinga2/issues/6826) (Configuration, PR): Downtime\#HasValidConfigOwner\(\): wait for ScheduledDowntimes +* [#6821](https://github.com/icinga/icinga2/issues/6821) (Cluster, Configuration, PR): Don't delete downtimes in satellite zones +* [#6820](https://github.com/icinga/icinga2/issues/6820) (Cluster, PR): Only create downtimes from non-paused ScheduledDowntime objects in HA enabled cluster zones +* [#6817](https://github.com/icinga/icinga2/issues/6817) (API, PR): HttpServerConnection\#DataAvailableHandler\(\): be aware of being called multiple times concurrently +* [#6816](https://github.com/icinga/icinga2/issues/6816) (API, Cluster): Stalled TLS connections and lock waits in SocketEventEngine +* [#6814](https://github.com/icinga/icinga2/issues/6814) (API, PR): Restore 'Connection: close' behaviour in HTTP responses +* [#6811](https://github.com/icinga/icinga2/issues/6811) (Plugins, Windows, PR): Fix state conditions in check\_memory and check\_swap +* [#6810](https://github.com/icinga/icinga2/issues/6810) (Plugins, Windows): Windows check\_memory never gets critical +* [#6808](https://github.com/icinga/icinga2/issues/6808) (API, PR): Remove redundand check for object existence on creation via API +* [#6807](https://github.com/icinga/icinga2/issues/6807) (API): \[2.10.2\] Director deploy crashes the Icinga service \[FreeBSD\] +* [#6799](https://github.com/icinga/icinga2/issues/6799) (API): "Connection: close" header leads to unstable instance +* [#6797](https://github.com/icinga/icinga2/issues/6797) (Check Execution): Servertime in the future breaks check results processing +* [#6750](https://github.com/icinga/icinga2/issues/6750) (Configuration, PR): \#6749 Wrong operator on stride variable causing incorrect behaviour +* [#6749](https://github.com/icinga/icinga2/issues/6749) (Configuration): Stride is misinterpreted in multi-date legacydatetime +* [#6748](https://github.com/icinga/icinga2/issues/6748) (CLI, PR): Fix api setup to automatically create the conf.d directory +* [#6718](https://github.com/icinga/icinga2/issues/6718) (API, Cluster, PR): Call SSL\_shutdown\(\) at least twice +* [#6704](https://github.com/icinga/icinga2/issues/6704) (Notifications, PR): Put newly configured already running ScheduledDowntime immediately in effect +* [#6542](https://github.com/icinga/icinga2/issues/6542) (Configuration, Log): /var/log/icinga2/icinga2.log is growing very fast on satellites +* [#6536](https://github.com/icinga/icinga2/issues/6536) (Windows, help wanted): check\_nscp\_api: Query arguments are sorted on Url::Format\(\) +* [#4790](https://github.com/icinga/icinga2/issues/4790) (Notifications): Newly configured already running ScheduledDowntime not put into effect +* [#3937](https://github.com/icinga/icinga2/issues/3937) (API): Icinga2 API: PUT request fails at 0-byte file +* [#2844](https://github.com/icinga/icinga2/issues/2844) (Cluster): Duplicated scheduled downtimes created in cluster HA zone + +### Documentation + +* [#6956](https://github.com/icinga/icinga2/issues/6956) (Documentation, PR): Escape pipe symbol in api documentation +* [#6944](https://github.com/icinga/icinga2/issues/6944) (Documentation, PR): Troubleshooting: Add notes on ephemeral port range blocking on Windows agents +* [#6928](https://github.com/icinga/icinga2/issues/6928) (Documentation, PR): Doc: Add .NET 3.5 to the windows build stack +* [#6825](https://github.com/icinga/icinga2/issues/6825) (Documentation, PR): Document that retry\_interval is only used after an active check result +* [#6819](https://github.com/icinga/icinga2/issues/6819) (Documentation, PR): Enhance and unify development docs for debug, develop, package +* [#6791](https://github.com/icinga/icinga2/issues/6791) (Documentation, PR): Docs: Add a section for DB IDO Cleanup +* [#6776](https://github.com/icinga/icinga2/issues/6776) (Documentation, PR): Doc fix: update apache section +* [#6775](https://github.com/icinga/icinga2/issues/6775) (Documentation, PR): Add technical docs for the check scheduler \(general, initial check, offsets\) +* [#6751](https://github.com/icinga/icinga2/issues/6751) (Documentation, PR): Doc fix: documentation link for apt +* [#6743](https://github.com/icinga/icinga2/issues/6743) (Documentation, PR): Doc fix: error in example path. +* [#5341](https://github.com/icinga/icinga2/issues/5341) (Documentation): Enhance development documentation + +### Support + +* [#6972](https://github.com/icinga/icinga2/issues/6972) (PR): Fix formatting in development docs +* [#6958](https://github.com/icinga/icinga2/issues/6958) (code-quality, PR): Debug: Log calls to ConfigObject::Deactivate\(\) +* [#6897](https://github.com/icinga/icinga2/issues/6897) (PR): Validate Zone::GetLocalZone\(\) before using +* [#6872](https://github.com/icinga/icinga2/issues/6872) (Windows): 2.10 is unstable \(Windows Agent\) +* [#6843](https://github.com/icinga/icinga2/issues/6843) (Tests, Windows, PR): Improve AppVeyor builds +* [#6479](https://github.com/icinga/icinga2/issues/6479) (code-quality, PR): SocketEvents: inherit from Stream +* [#6477](https://github.com/icinga/icinga2/issues/6477) (code-quality): SocketEvents: inherit from Object + ## 2.10.2 (2018-11-14) ### Bug diff --git a/VERSION b/VERSION index 4320bb9a9..723a7afee 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -Version: 2.10.2 +Version: 2.10.3 Revision: 1 diff --git a/changelog.py b/changelog.py index a6bf2afbc..79bdb0c8b 100755 --- a/changelog.py +++ b/changelog.py @@ -198,8 +198,7 @@ for milestone in sorted(milestones.values(), key=lambda ms: (ms["due_on"], ms["t continue if milestone["due_on"] == None: - print "Milestone", milestone["title"], "does not have a due date." - sys.exit(1) + print "Warning: Milestone", milestone["title"], "does not have a due date." ms_due_on = datetime.strptime(milestone["due_on"], "%Y-%m-%dT%H:%M:%SZ") From bf0c68757f99f88b43d7696f98d8361f39b83b82 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 11:25:44 +0100 Subject: [PATCH 0517/1162] Don't require OS headers to provide SO_REUSEPORT --- lib/base/tcpsocket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index a06b21106..a9390e5a7 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -74,9 +74,9 @@ void TcpSocket::Bind(const String& node, const String& service, int family) const int optTrue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&optTrue), sizeof(optTrue)); -#ifndef _WIN32 +#ifdef SO_REUSEPORT setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&optTrue), sizeof(optTrue)); -#endif /* _WIN32 */ +#endif /* SO_REUSEPORT */ int rc = bind(fd, info->ai_addr, info->ai_addrlen); From 646feb76e06155f908a4dcee51144db8f05a114f Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 11:45:03 +0100 Subject: [PATCH 0518/1162] Ignore failure of unit test base_utility/comparepasswords_issafe ... as volatile system load may cause false negatives --- test/base-utility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/base-utility.cpp b/test/base-utility.cpp index a4e9eafe4..91c83262b 100644 --- a/test/base-utility.cpp +++ b/test/base-utility.cpp @@ -47,7 +47,7 @@ BOOST_AUTO_TEST_CASE(comparepasswords_issafe) auto duration2 (steady_clock::now() - start2); double diff = (double)duration_cast(duration1).count() / (double)duration_cast(duration2).count(); - BOOST_CHECK(0.9 <= diff && diff <= 1.1); + BOOST_WARN(0.9 <= diff && diff <= 1.1); } BOOST_AUTO_TEST_SUITE_END() From 74cb9f3a32c5af49514d7afd02008dd9d545d007 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 14:29:03 +0100 Subject: [PATCH 0519/1162] Doc: SLES 11 requires a newer boost version, too --- doc/21-development.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/21-development.md b/doc/21-development.md index b36d61c41..3d2114b2e 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1130,7 +1130,7 @@ Icinga application using a dist tarball (including notes for distributions): **FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package) -**RHEL6**: Requires a newer boost version which is available on packages.icinga.com +**RHEL6** and **SLES11**: Requires a newer boost version which is available on packages.icinga.com with a version suffixed name. ### Runtime user environment From e7f2370ada3129881e989a40eb40636f8c6dd131 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 14:46:22 +0100 Subject: [PATCH 0520/1162] Doc: write systemd lower-case See spelling chapter in https://freedesktop.org/wiki/Software/systemd/ --- doc/02-getting-started.md | 12 ++++++------ doc/15-troubleshooting.md | 16 ++++++++-------- doc/16-upgrading-icinga-2.md | 4 ++-- doc/21-development.md | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/02-getting-started.md b/doc/02-getting-started.md index cffa3a2b4..e23bf293f 100644 --- a/doc/02-getting-started.md +++ b/doc/02-getting-started.md @@ -216,8 +216,8 @@ By default Icinga 2 uses the following files and directories: Path | Description ----------------------------------------------|------------------------------------ /etc/icinga2 | Contains Icinga 2 configuration files. - /usr/lib/systemd/system/icinga2.service | The Icinga 2 Systemd service file on systems using Systemd. - /etc/systemd/system/icinga2.service.d/limits.conf | On distributions with Systemd >227, additional service limits are required. + /usr/lib/systemd/system/icinga2.service | The Icinga 2 systemd service file on systems using systemd. + /etc/systemd/system/icinga2.service.d/limits.conf | On distributions with systemd >227, additional service limits are required. /etc/init.d/icinga2 | The Icinga 2 init script on systems using SysVinit or OpenRC. /usr/sbin/icinga2 | Shell wrapper for the Icinga 2 binary. /usr/lib\*/icinga2 | Libraries and the Icinga 2 binary (use `find /usr -type f -name icinga2` to locate the binary path). @@ -336,10 +336,10 @@ to determine where to find the plugin binaries. ### Systemd Service -Some distributions (e.g. Fedora, openSUSE and RHEL/CentOS 7) use Systemd. The -Icinga 2 packages automatically install the necessary Systemd unit files. +Some distributions (e.g. Fedora, openSUSE and RHEL/CentOS 7) use systemd. The +Icinga 2 packages automatically install the necessary systemd unit files. -The Icinga 2 Systemd service can be (re-)started, reloaded, stopped and also +The Icinga 2 systemd service can be (re-)started, reloaded, stopped and also queried for its current status. ``` @@ -388,7 +388,7 @@ If you're stuck with configuration errors, you can manually invoke the > **Tip** > -> If you are running into fork errors with Systemd enabled distributions, +> If you are running into fork errors with systemd enabled distributions, > please check the [troubleshooting chapter](15-troubleshooting.md#check-fork-errors). ### Init Script diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index eb44ac995..42afa28ab 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -498,7 +498,7 @@ Solution: ### Check Fork Errors -Newer versions of Systemd on Linux limit spawned processes for +Newer versions of systemd on Linux limit spawned processes for services. * v227 introduces the `TasksMax` setting to units which allows to specify the spawned process limit. @@ -506,7 +506,7 @@ services. * v231 changes the default value to 15% This can cause problems with Icinga 2 in large environments with many -commands executed in parallel starting with Systemd v228. Some distributions +commands executed in parallel starting with systemd v228. Some distributions also may have changed the defaults. The error message could look like this: @@ -534,16 +534,16 @@ An example is available inside the GitHub repository in [etc/initsystem](https:/ External Resources: * [Fork limit for cgroups](https://lwn.net/Articles/663873/) -* [Systemd changelog](https://github.com/systemd/systemd/blob/master/NEWS) +* [systemd changelog](https://github.com/systemd/systemd/blob/master/NEWS) * [Icinga 2 upstream issue](https://github.com/Icinga/icinga2/issues/5611) -* [Systemd upstream discussion](https://github.com/systemd/systemd/issues/3211) +* [systemd upstream discussion](https://github.com/systemd/systemd/issues/3211) ### Systemd Watchdog Usually Icinga 2 is a mission critical part of infrastructure and should be online at all times. In case of a recoverable crash (e.g. OOM) you may want to -restart Icinga 2 automatically. With Systemd it is as easy as overriding some -settings of the Icinga 2 Systemd service by creating +restart Icinga 2 automatically. With systemd it is as easy as overriding some +settings of the Icinga 2 systemd service by creating `/etc/systemd/system/icinga2.service.d/override.conf` with the following content: @@ -557,12 +557,12 @@ Using the watchdog can also help with monitoring Icinga 2, to activate and use i WatchdogSec=30s -This way Systemd will kill Icinga 2 if does not notify for over 30 seconds, a timout of less than 10 seconds is not +This way systemd will kill Icinga 2 if does not notify for over 30 seconds, a timout of less than 10 seconds is not recommended. When the watchdog is activated, `Restart=` can be set to `watchdog` to restart Icinga 2 in the case of a watchdog timeout. Run `systemctl daemon-reload && systemctl restart icinga2` to apply the changes. -Now Systemd will always try to restart Icinga 2 (except if you run +Now systemd will always try to restart Icinga 2 (except if you run `systemctl stop icinga2`). After three failures in ten seconds it will stop trying because you probably have a problem that requires manual intervention. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index d5a03233f..06d701bde 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -165,7 +165,7 @@ sane compile-time defaults. > your changes. There is a bug with existing sysconfig files where path variables are not expanded -because Systemd [does not support](https://github.com/systemd/systemd/issues/2123) +because systemd [does not support](https://github.com/systemd/systemd/issues/2123) shell variable expansion. This worked with SysVInit though. Edit the sysconfig file and either remove everything, or edit this line @@ -187,7 +187,7 @@ vim /etc/sysconfig/icinga2 ICINGA2_RLIMIT_FILES=50000 ``` -Restart Icinga 2 afterwards, the Systemd service file automatically puts the +Restart Icinga 2 afterwards, the systemd service file automatically puts the value into the application's environment where this is read on startup. ### Setup Wizard Changes diff --git a/doc/21-development.md b/doc/21-development.md index b36d61c41..4b1930e94 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1099,8 +1099,8 @@ Icinga application using a dist tarball (including notes for distributions): - Alpine: boost-dev * GNU bison (bison) * GNU flex (flex) >= 2.5.35 -* Systemd headers - - Only required when using Systemd +* systemd headers + - Only required when using systemd - Debian/Ubuntu: libsystemd-dev - RHEL/Fedora: systemd-devel @@ -1441,13 +1441,13 @@ Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} #### Systemd -If your distribution uses Systemd: +If your distribution uses systemd: ``` systemctl {start|stop|reload|status|enable|disable} icinga2 ``` -In case the distribution is running Systemd >227, you'll also +In case the distribution is running systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. From a9841a9197e79461a3ed3a0efc79fca7d78f1a22 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 1 Mar 2019 14:29:35 +0100 Subject: [PATCH 0521/1162] Defer: ensure not to throw any exceptions out of a destructor refs #6989 --- lib/base/defer.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/base/defer.hpp b/lib/base/defer.hpp index 33cc197db..9290c92b9 100644 --- a/lib/base/defer.hpp +++ b/lib/base/defer.hpp @@ -30,7 +30,11 @@ public: inline ~Defer() { - m_Func(); + try { + m_Func(); + } catch (...) { + // https://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor + } } private: From 2a6b122413dfc8762a7839bbe41c125455a17b5c Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 1 Mar 2019 14:30:49 +0100 Subject: [PATCH 0522/1162] InfluxdbWriter: don't leak sockets refs #6989 --- lib/perfdata/influxdbwriter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 773f21a2a..b75cd7a3f 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -9,6 +9,7 @@ #include "icinga/macroprocessor.hpp" #include "icinga/icingaapplication.hpp" #include "icinga/checkcommand.hpp" +#include "base/defer.hpp" #include "base/tcpsocket.hpp" #include "base/configtype.hpp" #include "base/objectlock.hpp" @@ -447,6 +448,8 @@ void InfluxdbWriter::Flush() if (!stream) return; + Defer close ([&stream]() { stream->Close(); }); + Url::Ptr url = new Url(); url->SetScheme(GetSslEnable() ? "https" : "http"); url->SetHost(GetHost()); From 37b044ecdad796c8ba1309de764525c15b8b115d Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 1 Mar 2019 14:37:45 +0100 Subject: [PATCH 0523/1162] PkiUtility::NewCa(): just warn if the CA files already exist --- lib/remote/pkiutility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/remote/pkiutility.cpp b/lib/remote/pkiutility.cpp index 56a7ed257..e1e785288 100644 --- a/lib/remote/pkiutility.cpp +++ b/lib/remote/pkiutility.cpp @@ -24,7 +24,7 @@ int PkiUtility::NewCa() String caKeyFile = caDir + "/ca.key"; if (Utility::PathExists(caCertFile) && Utility::PathExists(caKeyFile)) { - Log(LogCritical, "cli") + Log(LogWarning, "cli") << "CA files '" << caCertFile << "' and '" << caKeyFile << "' already exist."; return 1; } From 0a582905c5624056beca58cfcba44d954a20a91b Mon Sep 17 00:00:00 2001 From: Lee Garrett Date: Tue, 5 Mar 2019 17:40:14 +0100 Subject: [PATCH 0524/1162] Typo and link fix --- doc/08-advanced-topics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index de87c40da..858323f03 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -437,12 +437,12 @@ Icinga 2 supports optional detection of hosts and services that are "flapping". Flapping occurs when a service or host changes state too frequently, which would result in a storm of problem and recovery notifications. With flapping detection enabled a flapping notification will be sent while other notifications are -suppresed until it calms down after receiving the same status from checks a few times. Flapping detection can help detect +suppressed until it calms down after receiving the same status from checks a few times. Flapping detection can help detect configuration problems (wrong thresholds), troublesome services or network problems. Flapping detection can be enabled or disabled using the `enable_flapping` attribute. The `flapping_threshold_high` and `flapping_threshold_low` attributes allows to specify the thresholds that control -when a [host](09-object-types.md#objecttype-host) or [service](objecttype-service) is considered to be flapping. +when a [host](09-object-types.md#objecttype-host) or [service](09-object-types.md#objecttype-service) is considered to be flapping. The default thresholds are 30% for high and 25% for low. If the computed flapping value exceeds the high threshold a host or service is considered flapping until it drops below the low flapping threshold. From bf92e32496c9922b32ec8d868b83c6e622daf751 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Mar 2019 14:07:29 +0100 Subject: [PATCH 0525/1162] Suppress or fix compiler warnings --- icinga-app/icinga.cpp | 2 ++ lib/base/application.cpp | 6 +++--- lib/base/netstring.cpp | 2 +- lib/base/process.cpp | 7 +++++-- lib/base/scriptframe.cpp | 4 ++++ lib/cli/consolecommand.cpp | 8 ++++---- lib/cli/nodesetupcommand.cpp | 4 ++-- lib/icinga/legacytimeperiod.cpp | 2 +- lib/icinga/scheduleddowntime.cpp | 4 ++-- lib/remote/apilistener.cpp | 2 +- lib/remote/eventqueue.cpp | 4 ++++ 11 files changed, 29 insertions(+), 16 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index e8d3f5bf3..3490b49e9 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -940,6 +940,8 @@ int main(int argc, char **argv) #ifdef I2_DEBUG if (rc >= 0) std::cerr << "Closed FD " << i << " which we inherited from our parent process." << std::endl; +#else /* I2_DEBUG */ + (void)rc; #endif /* I2_DEBUG */ } } diff --git a/lib/base/application.cpp b/lib/base/application.cpp index df93710b7..1effde617 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -171,7 +171,7 @@ void Application::SetResourceLimits() rlim_t fileLimit = Configuration::RLimitFiles; if (fileLimit != 0) { - if (fileLimit < GetDefaultRLimitFiles()) { + if (fileLimit < (rlim_t)GetDefaultRLimitFiles()) { Log(LogWarning, "Application") << "The user-specified value for RLimitFiles cannot be smaller than the default value (" << GetDefaultRLimitFiles() << "). Using the default value instead."; fileLimit = GetDefaultRLimitFiles(); @@ -192,7 +192,7 @@ void Application::SetResourceLimits() rlim_t processLimit = Configuration::RLimitProcesses; if (processLimit != 0) { - if (processLimit < GetDefaultRLimitProcesses()) { + if (processLimit < (rlim_t)GetDefaultRLimitProcesses()) { Log(LogWarning, "Application") << "The user-specified value for RLimitProcesses cannot be smaller than the default value (" << GetDefaultRLimitProcesses() << "). Using the default value instead."; processLimit = GetDefaultRLimitProcesses(); @@ -231,7 +231,7 @@ void Application::SetResourceLimits() stackLimit = Configuration::RLimitStack; if (stackLimit != 0) { - if (stackLimit < GetDefaultRLimitStack()) { + if (stackLimit < (rlim_t)GetDefaultRLimitStack()) { Log(LogWarning, "Application") << "The user-specified value for RLimitStack cannot be smaller than the default value (" << GetDefaultRLimitStack() << "). Using the default value instead."; stackLimit = GetDefaultRLimitStack(); diff --git a/lib/base/netstring.cpp b/lib/base/netstring.cpp index 5bc026167..17789b2d5 100644 --- a/lib/base/netstring.cpp +++ b/lib/base/netstring.cpp @@ -85,7 +85,7 @@ StreamReadStatus NetString::ReadStringFromStream(const Stream::Ptr& stream, Stri /* read the whole message */ size_t data_length = len + 1; - if (maxMessageLength >= 0 && data_length > maxMessageLength) { + if (maxMessageLength >= 0 && data_length > (size_t)maxMessageLength) { std::stringstream errorMessage; errorMessage << "Max data length exceeded: " << (maxMessageLength / 1024) << " KB"; diff --git a/lib/base/process.cpp b/lib/base/process.cpp index 71454b5ac..852acc818 100644 --- a/lib/base/process.cpp +++ b/lib/base/process.cpp @@ -164,8 +164,11 @@ static Value ProcessSpawnImpl(struct msghdr *msgh, const Dictionary::Ptr& reques (void)close(fds[2]); #ifdef HAVE_NICE - if (adjustPriority) - (void)nice(5); + if (adjustPriority) { + // Cheating the compiler on "warning: ignoring return value of 'int nice(int)', declared with attribute warn_unused_result [-Wunused-result]". + auto x (nice(5)); + (void)x; + } #endif /* HAVE_NICE */ sigset_t mask; diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index ebb6399b3..be37416ee 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -90,6 +90,10 @@ ScriptFrame::~ScriptFrame() { ScriptFrame *frame = PopFrame(); ASSERT(frame == this); + +#ifndef I2_DEBUG + (void)frame; +#endif /* I2_DEBUG */ } void ScriptFrame::IncreaseStackDepth() diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index 86019022a..92cf9a4c2 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -476,15 +476,15 @@ incomplete: std::vector ulines = text.Split("\n"); - for (int i = 1; i <= ulines.size(); i++) { + for (decltype(ulines.size()) i = 1; i <= ulines.size(); i++) { int start, len; - if (i == di.FirstLine) + if (i == (decltype(i))di.FirstLine) start = di.FirstColumn; else start = 0; - if (i == di.LastLine) + if (i == (decltype(i))di.LastLine) len = di.LastColumn - di.FirstColumn + 1; else len = ulines[i - 1].GetLength(); @@ -497,7 +497,7 @@ incomplete: } else offset = 4; - if (i >= di.FirstLine && i <= di.LastLine) { + if (i >= (decltype(i))di.FirstLine && i <= (decltype(i))di.LastLine) { std::cout << String(di.Path.GetLength() + offset, ' '); std::cout << String(start, ' ') << String(len, '^') << "\n"; } diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index 166c8425b..f772a0f37 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -170,7 +170,7 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v if (vm.count("global_zones")) setupGlobalZones = vm["global_zones"].as >(); - for (int i = 0; i < setupGlobalZones.size(); i++) { + for (decltype(setupGlobalZones.size()) i = 0; i < setupGlobalZones.size(); i++) { if (std::find(globalZones.begin(), globalZones.end(), setupGlobalZones[i]) != globalZones.end()) { Log(LogCritical, "cli") << "The global zone '" << setupGlobalZones[i] << "' is already specified."; @@ -522,7 +522,7 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm, if (vm.count("global_zones")) setupGlobalZones = vm["global_zones"].as >(); - for (int i = 0; i < setupGlobalZones.size(); i++) { + for (decltype(setupGlobalZones.size()) i = 0; i < setupGlobalZones.size(); i++) { if (std::find(globalZones.begin(), globalZones.end(), setupGlobalZones[i]) != globalZones.end()) { Log(LogCritical, "cli") << "The global zone '" << setupGlobalZones[i] << "' is already specified."; diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 6433d0d6c..8ac54e4e8 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -408,7 +408,7 @@ Dictionary::Ptr LegacyTimePeriod::FindRunningSegment(const String& daydef, const ProcessTimeRanges(timeranges, &iter, segments); Dictionary::Ptr bestSegment; - double bestEnd; + double bestEnd = 0.0; ObjectLock olock(segments); for (const Dictionary::Ptr& segment : segments) { diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index 37c3693bd..9e6c1b552 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -136,7 +136,7 @@ std::pair ScheduledDowntime::FindRunningSegment(double minEnd) Array::Ptr segments = new Array(); Dictionary::Ptr bestSegment; - double bestBegin, bestEnd; + double bestBegin = 0.0, bestEnd = 0.0; double now = Utility::GetTime(); ObjectLock olock(ranges); @@ -196,7 +196,7 @@ std::pair ScheduledDowntime::FindNextSegment() Array::Ptr segments = new Array(); Dictionary::Ptr bestSegment; - double bestBegin, bestEnd; + double bestBegin = 0.0, bestEnd = 0.0; double now = Utility::GetTime(); ObjectLock olock(ranges); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index 9596b76ac..a391bf430 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -1424,7 +1424,7 @@ bool ApiListener::AddAnonymousClient(const JsonRpcConnection::Ptr& aclient) { boost::mutex::scoped_lock lock(m_AnonymousClientsLock); - if (GetMaxAnonymousClients() >= 0 && m_AnonymousClients.size() + 1 > GetMaxAnonymousClients()) + if (GetMaxAnonymousClients() >= 0 && (long)m_AnonymousClients.size() + 1 > (long)GetMaxAnonymousClients()) return false; m_AnonymousClients.insert(aclient); diff --git a/lib/remote/eventqueue.cpp b/lib/remote/eventqueue.cpp index d72451771..df26701a6 100644 --- a/lib/remote/eventqueue.cpp +++ b/lib/remote/eventqueue.cpp @@ -65,6 +65,10 @@ void EventQueue::AddClient(void *client) auto result = m_Events.insert(std::make_pair(client, std::deque())); ASSERT(result.second); + +#ifndef I2_DEBUG + (void)result; +#endif /* I2_DEBUG */ } void EventQueue::RemoveClient(void *client) From ac354f9e80fc6fcf97f03daabab28225bed021b8 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Mar 2019 14:59:01 +0100 Subject: [PATCH 0526/1162] Don't abuse goto for building simple loops --- lib/base/application.cpp | 64 +++++++++++++++++++--------------------- lib/base/process.cpp | 33 ++++++++++----------- 2 files changed, 45 insertions(+), 52 deletions(-) diff --git a/lib/base/application.cpp b/lib/base/application.cpp index df93710b7..e706932e8 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -309,52 +309,48 @@ void Application::RunEventLoop() double lastLoop = Utility::GetTime(); -mainloop: - while (!m_ShuttingDown && !m_RequestRestart) { - /* Watches for changes to the system time. Adjusts timers if necessary. */ - Utility::Sleep(2.5); - - if (m_RequestReopenLogs) { - Log(LogNotice, "Application", "Reopening log files"); - m_RequestReopenLogs = false; - OnReopenLogs(); - } - - double now = Utility::GetTime(); - double timeDiff = lastLoop - now; + while (!m_ShuttingDown) { + if (m_RequestRestart) { + m_RequestRestart = false; // we are now handling the request, once is enough #ifdef HAVE_SYSTEMD - sd_notify(0, "WATCHDOG=1"); + sd_notify(0, "RELOADING=1"); #endif /* HAVE_SYSTEMD */ - if (std::fabs(timeDiff) > 15) { - /* We made a significant jump in time. */ - Log(LogInformation, "Application") - << "We jumped " - << (timeDiff < 0 ? "forward" : "backward") - << " in time: " << std::fabs(timeDiff) << " seconds"; + // are we already restarting? ignore request if we already are + if (!l_Restarting) { + l_Restarting = true; + m_ReloadProcess = StartReloadProcess(); + } + } else { + /* Watches for changes to the system time. Adjusts timers if necessary. */ + Utility::Sleep(2.5); - Timer::AdjustTimers(-timeDiff); - } + if (m_RequestReopenLogs) { + Log(LogNotice, "Application", "Reopening log files"); + m_RequestReopenLogs = false; + OnReopenLogs(); + } - lastLoop = now; - } - - if (m_RequestRestart) { - m_RequestRestart = false; // we are now handling the request, once is enough + double now = Utility::GetTime(); + double timeDiff = lastLoop - now; #ifdef HAVE_SYSTEMD - sd_notify(0, "RELOADING=1"); + sd_notify(0, "WATCHDOG=1"); #endif /* HAVE_SYSTEMD */ - // are we already restarting? ignore request if we already are - if (l_Restarting) - goto mainloop; + if (std::fabs(timeDiff) > 15) { + /* We made a significant jump in time. */ + Log(LogInformation, "Application") + << "We jumped " + << (timeDiff < 0 ? "forward" : "backward") + << " in time: " << std::fabs(timeDiff) << " seconds"; - l_Restarting = true; - m_ReloadProcess = StartReloadProcess(); + Timer::AdjustTimers(-timeDiff); + } - goto mainloop; + lastLoop = now; + } } #ifdef HAVE_SYSTEMD diff --git a/lib/base/process.cpp b/lib/base/process.cpp index 71454b5ac..50c99f60a 100644 --- a/lib/base/process.cpp +++ b/lib/base/process.cpp @@ -413,12 +413,11 @@ static pid_t ProcessSpawn(const std::vector& arguments, const Dictionary msg.msg_controllen = cmsg->cmsg_len; -send_message: - while (sendmsg(l_ProcessControlFD, &msg, 0) < 0) - StartSpawnProcessHelper(); - - if (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0) - goto send_message; + do { + while (sendmsg(l_ProcessControlFD, &msg, 0) < 0) { + StartSpawnProcessHelper(); + } + } while (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0); char buf[4096]; @@ -450,12 +449,11 @@ static int ProcessKill(pid_t pid, int signum) boost::mutex::scoped_lock lock(l_ProcessControlMutex); -send_message: - while (send(l_ProcessControlFD, &length, sizeof(length), 0) < 0) - StartSpawnProcessHelper(); - - if (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0) - goto send_message; + do { + while (send(l_ProcessControlFD, &length, sizeof(length), 0) < 0) { + StartSpawnProcessHelper(); + } + } while (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0); char buf[4096]; @@ -482,12 +480,11 @@ static int ProcessWaitPID(pid_t pid, int *status) boost::mutex::scoped_lock lock(l_ProcessControlMutex); -send_message: - while (send(l_ProcessControlFD, &length, sizeof(length), 0) < 0) - StartSpawnProcessHelper(); - - if (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0) - goto send_message; + do { + while (send(l_ProcessControlFD, &length, sizeof(length), 0) < 0) { + StartSpawnProcessHelper(); + } + } while (send(l_ProcessControlFD, jrequest.CStr(), jrequest.GetLength(), 0) < 0); char buf[4096]; From 5e08e033ad6ddaba59734b49a5775fd0965f2b5f Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Mar 2019 16:39:23 +0100 Subject: [PATCH 0527/1162] Assignment operators doc: tell what the { } are for refs #5430 --- doc/17-language-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 039e3ad31..eff67a0fb 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -252,7 +252,7 @@ A list of available functions is available in the [Library Reference](18-library In addition to the `=` operator shown above a number of other operators to manipulate attributes are supported. Here's a list of all -available operators: +available operators (the outermost `{` `}` stand for a local variable scope): ### Operator = From 9f26569bcc203d98498466cc1ffa6549a9b81998 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Mar 2019 16:55:06 +0100 Subject: [PATCH 0528/1162] check_network -h: drop non-existent feature refs #6155 --- plugins/check_network.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/plugins/check_network.cpp b/plugins/check_network.cpp index db0bb1970..96b8698c0 100644 --- a/plugins/check_network.cpp +++ b/plugins/check_network.cpp @@ -120,11 +120,6 @@ static int parseArguments(int ac, WCHAR **av, po::variables_map& vm, printInfoSt L"warn is VALUE is inside the range spanned by THR1 and THR2\n\n" L"-w ![THR1-THR2]\n" L"warn if VALUE is outside the range spanned by THR1 and THR2\n\n" - L"-w THRESHOLD%%\n" - L"if the plugin accepts percentage based thresholds those will be used.\n" - L"Does nothing if the plugin does not accept percentages, or only uses\n" - L"percentage thresholds. Ranges can be used with \"%%\", but both range values need\n" - L"to end with a percentage sign.\n\n" L"All of these options work with the critical threshold \"-c\" too." , progName); std::cout << '\n'; From 1436b7dc1c2140fc75e538926c25deaf1cf70d4e Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 11:25:44 +0100 Subject: [PATCH 0529/1162] Don't require OS headers to provide SO_REUSEPORT (cherry picked from commit bf0c68757f99f88b43d7696f98d8361f39b83b82) --- lib/base/tcpsocket.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index 2c3f6c7c3..a56100e1b 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -91,9 +91,9 @@ void TcpSocket::Bind(const String& node, const String& service, int family) const int optTrue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&optTrue), sizeof(optTrue)); -#ifndef _WIN32 +#ifdef SO_REUSEPORT setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, reinterpret_cast(&optTrue), sizeof(optTrue)); -#endif /* _WIN32 */ +#endif /* SO_REUSEPORT */ int rc = bind(fd, info->ai_addr, info->ai_addrlen); From 58c2ea8a7627d66967a5201ed6eb591f913e7fb9 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 11:45:03 +0100 Subject: [PATCH 0530/1162] Ignore failure of unit test base_utility/comparepasswords_issafe ... as volatile system load may cause false negatives (cherry picked from commit 646feb76e06155f908a4dcee51144db8f05a114f) --- test/base-utility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/base-utility.cpp b/test/base-utility.cpp index fdc1a17d2..3f3ed57ea 100644 --- a/test/base-utility.cpp +++ b/test/base-utility.cpp @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(comparepasswords_issafe) auto duration2 (steady_clock::now() - start2); double diff = (double)duration_cast(duration1).count() / (double)duration_cast(duration2).count(); - BOOST_CHECK(0.9 <= diff && diff <= 1.1); + BOOST_WARN(0.9 <= diff && diff <= 1.1); } BOOST_AUTO_TEST_SUITE_END() From d4646acdbf8d02e91a7ef4491f129b002e6dc752 Mon Sep 17 00:00:00 2001 From: Lee Garrett Date: Tue, 5 Mar 2019 17:40:14 +0100 Subject: [PATCH 0531/1162] Typo and link fix (cherry picked from commit 0a582905c5624056beca58cfcba44d954a20a91b) --- doc/08-advanced-topics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/08-advanced-topics.md b/doc/08-advanced-topics.md index de87c40da..858323f03 100644 --- a/doc/08-advanced-topics.md +++ b/doc/08-advanced-topics.md @@ -437,12 +437,12 @@ Icinga 2 supports optional detection of hosts and services that are "flapping". Flapping occurs when a service or host changes state too frequently, which would result in a storm of problem and recovery notifications. With flapping detection enabled a flapping notification will be sent while other notifications are -suppresed until it calms down after receiving the same status from checks a few times. Flapping detection can help detect +suppressed until it calms down after receiving the same status from checks a few times. Flapping detection can help detect configuration problems (wrong thresholds), troublesome services or network problems. Flapping detection can be enabled or disabled using the `enable_flapping` attribute. The `flapping_threshold_high` and `flapping_threshold_low` attributes allows to specify the thresholds that control -when a [host](09-object-types.md#objecttype-host) or [service](objecttype-service) is considered to be flapping. +when a [host](09-object-types.md#objecttype-host) or [service](09-object-types.md#objecttype-service) is considered to be flapping. The default thresholds are 30% for high and 25% for low. If the computed flapping value exceeds the high threshold a host or service is considered flapping until it drops below the low flapping threshold. From c64f974f3cd636d2992ccbc50b8bd1227821750a Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 26 Feb 2019 14:46:22 +0100 Subject: [PATCH 0532/1162] Doc: write systemd lower-case See spelling chapter in https://freedesktop.org/wiki/Software/systemd/ (cherry picked from commit e7f2370ada3129881e989a40eb40636f8c6dd131) --- doc/02-getting-started.md | 12 ++++++------ doc/15-troubleshooting.md | 16 ++++++++-------- doc/16-upgrading-icinga-2.md | 4 ++-- doc/21-development.md | 8 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/02-getting-started.md b/doc/02-getting-started.md index 285544e70..2373c7e61 100644 --- a/doc/02-getting-started.md +++ b/doc/02-getting-started.md @@ -215,8 +215,8 @@ By default Icinga 2 uses the following files and directories: Path | Description ----------------------------------------------|------------------------------------ /etc/icinga2 | Contains Icinga 2 configuration files. - /usr/lib/systemd/system/icinga2.service | The Icinga 2 Systemd service file on systems using Systemd. - /etc/systemd/system/icinga2.service.d/limits.conf | On distributions with Systemd >227, additional service limits are required. + /usr/lib/systemd/system/icinga2.service | The Icinga 2 systemd service file on systems using systemd. + /etc/systemd/system/icinga2.service.d/limits.conf | On distributions with systemd >227, additional service limits are required. /etc/init.d/icinga2 | The Icinga 2 init script on systems using SysVinit or OpenRC. /usr/sbin/icinga2 | Shell wrapper for the Icinga 2 binary. /usr/lib\*/icinga2 | Libraries and the Icinga 2 binary (use `find /usr -type f -name icinga2` to locate the binary path). @@ -335,10 +335,10 @@ to determine where to find the plugin binaries. ### Systemd Service -Some distributions (e.g. Fedora, openSUSE and RHEL/CentOS 7) use Systemd. The -Icinga 2 packages automatically install the necessary Systemd unit files. +Some distributions (e.g. Fedora, openSUSE and RHEL/CentOS 7) use systemd. The +Icinga 2 packages automatically install the necessary systemd unit files. -The Icinga 2 Systemd service can be (re-)started, reloaded, stopped and also +The Icinga 2 systemd service can be (re-)started, reloaded, stopped and also queried for its current status. ``` @@ -387,7 +387,7 @@ If you're stuck with configuration errors, you can manually invoke the > **Tip** > -> If you are running into fork errors with Systemd enabled distributions, +> If you are running into fork errors with systemd enabled distributions, > please check the [troubleshooting chapter](15-troubleshooting.md#check-fork-errors). ### Init Script diff --git a/doc/15-troubleshooting.md b/doc/15-troubleshooting.md index eb44ac995..42afa28ab 100644 --- a/doc/15-troubleshooting.md +++ b/doc/15-troubleshooting.md @@ -498,7 +498,7 @@ Solution: ### Check Fork Errors -Newer versions of Systemd on Linux limit spawned processes for +Newer versions of systemd on Linux limit spawned processes for services. * v227 introduces the `TasksMax` setting to units which allows to specify the spawned process limit. @@ -506,7 +506,7 @@ services. * v231 changes the default value to 15% This can cause problems with Icinga 2 in large environments with many -commands executed in parallel starting with Systemd v228. Some distributions +commands executed in parallel starting with systemd v228. Some distributions also may have changed the defaults. The error message could look like this: @@ -534,16 +534,16 @@ An example is available inside the GitHub repository in [etc/initsystem](https:/ External Resources: * [Fork limit for cgroups](https://lwn.net/Articles/663873/) -* [Systemd changelog](https://github.com/systemd/systemd/blob/master/NEWS) +* [systemd changelog](https://github.com/systemd/systemd/blob/master/NEWS) * [Icinga 2 upstream issue](https://github.com/Icinga/icinga2/issues/5611) -* [Systemd upstream discussion](https://github.com/systemd/systemd/issues/3211) +* [systemd upstream discussion](https://github.com/systemd/systemd/issues/3211) ### Systemd Watchdog Usually Icinga 2 is a mission critical part of infrastructure and should be online at all times. In case of a recoverable crash (e.g. OOM) you may want to -restart Icinga 2 automatically. With Systemd it is as easy as overriding some -settings of the Icinga 2 Systemd service by creating +restart Icinga 2 automatically. With systemd it is as easy as overriding some +settings of the Icinga 2 systemd service by creating `/etc/systemd/system/icinga2.service.d/override.conf` with the following content: @@ -557,12 +557,12 @@ Using the watchdog can also help with monitoring Icinga 2, to activate and use i WatchdogSec=30s -This way Systemd will kill Icinga 2 if does not notify for over 30 seconds, a timout of less than 10 seconds is not +This way systemd will kill Icinga 2 if does not notify for over 30 seconds, a timout of less than 10 seconds is not recommended. When the watchdog is activated, `Restart=` can be set to `watchdog` to restart Icinga 2 in the case of a watchdog timeout. Run `systemctl daemon-reload && systemctl restart icinga2` to apply the changes. -Now Systemd will always try to restart Icinga 2 (except if you run +Now systemd will always try to restart Icinga 2 (except if you run `systemctl stop icinga2`). After three failures in ten seconds it will stop trying because you probably have a problem that requires manual intervention. diff --git a/doc/16-upgrading-icinga-2.md b/doc/16-upgrading-icinga-2.md index 3c46c9f86..bede671a8 100644 --- a/doc/16-upgrading-icinga-2.md +++ b/doc/16-upgrading-icinga-2.md @@ -145,7 +145,7 @@ sane compile-time defaults. > your changes. There is a bug with existing sysconfig files where path variables are not expanded -because Systemd [does not support](https://github.com/systemd/systemd/issues/2123) +because systemd [does not support](https://github.com/systemd/systemd/issues/2123) shell variable expansion. This worked with SysVInit though. Edit the sysconfig file and either remove everything, or edit this line @@ -167,7 +167,7 @@ vim /etc/sysconfig/icinga2 ICINGA2_RLIMIT_FILES=50000 ``` -Restart Icinga 2 afterwards, the Systemd service file automatically puts the +Restart Icinga 2 afterwards, the systemd service file automatically puts the value into the application's environment where this is read on startup. ### Setup Wizard Changes diff --git a/doc/21-development.md b/doc/21-development.md index e95307207..29e3e3d1b 100644 --- a/doc/21-development.md +++ b/doc/21-development.md @@ -1099,8 +1099,8 @@ Icinga application using a dist tarball (including notes for distributions): - Alpine: boost-dev * GNU bison (bison) * GNU flex (flex) >= 2.5.35 -* Systemd headers - - Only required when using Systemd +* systemd headers + - Only required when using systemd - Debian/Ubuntu: libsystemd-dev - RHEL/Fedora: systemd-devel @@ -1441,13 +1441,13 @@ Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status} #### Systemd -If your distribution uses Systemd: +If your distribution uses systemd: ``` systemctl {start|stop|reload|status|enable|disable} icinga2 ``` -In case the distribution is running Systemd >227, you'll also +In case the distribution is running systemd >227, you'll also need to package and install the `etc/initsystem/icinga2.service.limits.conf` file into `/etc/systemd/system/icinga2.service.d`. From 188ff9b25a6d2171afb1acfc0917fc68e52010ec Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 8 Mar 2019 16:39:23 +0100 Subject: [PATCH 0533/1162] Assignment operators doc: tell what the { } are for refs #5430 (cherry picked from commit 5e08e033ad6ddaba59734b49a5775fd0965f2b5f) --- doc/17-language-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/17-language-reference.md b/doc/17-language-reference.md index 039e3ad31..eff67a0fb 100644 --- a/doc/17-language-reference.md +++ b/doc/17-language-reference.md @@ -252,7 +252,7 @@ A list of available functions is available in the [Library Reference](18-library In addition to the `=` operator shown above a number of other operators to manipulate attributes are supported. Here's a list of all -available operators: +available operators (the outermost `{` `}` stand for a local variable scope): ### Operator = From ef7bf0f783b3b9dbdf1e15094e3fbff77d7c3177 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Fri, 15 Mar 2019 10:11:42 +0100 Subject: [PATCH 0534/1162] Show license more prominently --- LICENSE | 23 +++++++++++++++++++++++ README.md | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..36b7cd93c --- /dev/null +++ b/LICENSE @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index d4369e85d..09996abc8 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Many C++ developers miss an easy and portable way of handling Unicode encoded strings. The original C++ Standard (known as C++98 or C++03) is Unicode agnostic. C++11 provides some support for Unicode on core language and library level: u8, u, and U character and string literals, char16_t and char32_t character types, u16string and u32string library classes, and codecvt support for conversions between Unicode encoding forms. In the meantime, developers use third party libraries like ICU, OS specific capabilities, or simply roll out their own solutions. -In order to easily handle UTF-8 encoded Unicode strings, I came up with a small, C++98 compatible generic library. For anybody used to work with STL algorithms and iterators, it should be easy and natural to use. The code is freely available for any purpose - check out the license at the beginning of the utf8.h file. The library has been used a lot in the past ten years both in commercial and open-source projects and is considered feature-complete now. If you run into bugs or performance issues, please let me know and I'll do my best to address them. +In order to easily handle UTF-8 encoded Unicode strings, I came up with a small, C++98 compatible generic library. For anybody used to work with STL algorithms and iterators, it should be easy and natural to use. The code is freely available for any purpose - check out the [license](./LICENSE). The library has been used a lot in the past ten years both in commercial and open-source projects and is considered feature-complete now. If you run into bugs or performance issues, please let me know and I'll do my best to address them. The purpose of this article is not to offer an introduction to Unicode in general, and UTF-8 in particular. If you are not familiar with Unicode, be sure to check out [Unicode Home Page](http://www.unicode.org/) or some other source of information for Unicode. Also, it is not my aim to advocate the use of UTF-8 encoded strings in C++ programs; if you want to handle UTF-8 encoded strings from C++, I am sure you have good reasons for it. From 85c0d2c2cc0e651b47c1eef0a4b7bd37233e2560 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 14 Mar 2019 09:32:09 +0100 Subject: [PATCH 0535/1162] Integrate UTF8-CPP into CMake --- CMakeLists.txt | 4 ++++ cmake/FindUTF8CPP.cmake | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 cmake/FindUTF8CPP.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3556d3a96..20455cf81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,6 +153,10 @@ else() list(APPEND base_DEPS ${YAJL_LIBRARIES}) endif() +# UTF8CPP +find_package(UTF8CPP) +include_directories(${UTF8CPP_INCLUDE}) + find_package(Editline) set(HAVE_EDITLINE "${EDITLINE_FOUND}") diff --git a/cmake/FindUTF8CPP.cmake b/cmake/FindUTF8CPP.cmake new file mode 100644 index 000000000..b00035357 --- /dev/null +++ b/cmake/FindUTF8CPP.cmake @@ -0,0 +1,7 @@ +FIND_PATH (UTF8CPP_INCLUDE utf8.h HINTS "${PROJECT_SOURCE_DIR}/third-party/utf8cpp/source") + +if (UTF8CPP_INCLUDE) + message(STATUS "Found UTF8CPP: ${UTF8CPP_INCLUDE}" ) +else () + message(FATAL_ERROR "Unable to include utf8.h") +endif () From a72f4db5c94638c93475c2b6ae214a689f91d860 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 14 Mar 2019 09:34:51 +0100 Subject: [PATCH 0536/1162] Utility::ValidateUTF8(): use UTF8-CPP --- lib/base/utility.cpp | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 3609ca495..331af3832 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -20,8 +20,11 @@ #include #include #include +#include #include #include +#include +#include #ifdef __FreeBSD__ # include @@ -1701,40 +1704,20 @@ String Utility::GetPlatformArchitecture() #endif /* _WIN32 */ } +const char l_Utf8Replacement[] = "\xEF\xBF\xBD"; + String Utility::ValidateUTF8(const String& input) { - String output; - size_t length = input.GetLength(); + std::vector output; + output.reserve(input.GetLength() * 3u); - for (size_t i = 0; i < length; i++) { - if ((input[i] & 0x80) == 0) { - output += input[i]; - continue; - } - - if ((input[i] & 0xE0) == 0xC0 && length > i + 1 && - (input[i + 1] & 0xC0) == 0x80) { - output += input[i]; - output += input[i + 1]; - i++; - continue; - } - - if ((input[i] & 0xF0) == 0xE0 && length > i + 2 && - (input[i + 1] & 0xC0) == 0x80 && (input[i + 2] & 0xC0) == 0x80) { - output += input[i]; - output += input[i + 1]; - output += input[i + 2]; - i += 2; - continue; - } - - output += '\xEF'; - output += '\xBF'; - output += '\xBD'; + try { + utf8::replace_invalid(input.Begin(), input.End(), std::back_inserter(output)); + } catch (const utf8::not_enough_room&) { + output.insert(output.end(), (const char*)l_Utf8Replacement, (const char*)l_Utf8Replacement + 3); } - return output; + return String(output.begin(), output.end()); } String Utility::CreateTempFile(const String& path, int mode, std::fstream& fp) From 60ec11de73d3384903b5bd5718420cf70037d9a5 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 13 Mar 2019 18:12:58 +0100 Subject: [PATCH 0537/1162] Test Utility::ValidateUTF8() --- test/CMakeLists.txt | 1 + test/base-utility.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8dc05b645..517197e7b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -108,6 +108,7 @@ add_boost_test(base base_type/instantiate base_utility/comparepasswords_works base_utility/comparepasswords_issafe + base_utility/validateutf8 base_value/scalar base_value/convert base_value/format diff --git a/test/base-utility.cpp b/test/base-utility.cpp index a4e9eafe4..ed0c92d1c 100644 --- a/test/base-utility.cpp +++ b/test/base-utility.cpp @@ -50,4 +50,12 @@ BOOST_AUTO_TEST_CASE(comparepasswords_issafe) BOOST_CHECK(0.9 <= diff && diff <= 1.1); } +BOOST_AUTO_TEST_CASE(validateutf8) +{ + BOOST_CHECK(Utility::ValidateUTF8("") == ""); + BOOST_CHECK(Utility::ValidateUTF8("a") == "a"); + BOOST_CHECK(Utility::ValidateUTF8("\xC3") == "\xEF\xBF\xBD"); + BOOST_CHECK(Utility::ValidateUTF8("\xC3\xA4") == "\xC3\xA4"); +} + BOOST_AUTO_TEST_SUITE_END() From e5cb90ec6551da44ba36b978808079874ea1f55c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 18 Mar 2019 11:05:39 +0100 Subject: [PATCH 0538/1162] Update .gitignore --- .gitignore | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 0e2ed3ffd..b300b597d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,14 @@ -## Editors -.idea/ -*.komodoproject -.*.sw[op] -*~ +# Exclude all hidden files +.* -## C++ and Tools -*.patch -*.playground -.vagrant +# Except those related to git and vagrant +!.git* +!.puppet* +!.travis.yml +!.mailmap + +## Tools +*~ tickets.pickle ## Build artifacts From 89b371813f77d90ed03482b59b0f6977e68305f9 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 18 Mar 2019 15:05:32 +0100 Subject: [PATCH 0539/1162] Import "JSON for Modern C++" --- third-party/nlohmann_json/LICENSE | 21 + third-party/nlohmann_json/json.hpp | 20406 +++++++++++++++++++++++++++ 2 files changed, 20427 insertions(+) create mode 100644 third-party/nlohmann_json/LICENSE create mode 100644 third-party/nlohmann_json/json.hpp diff --git a/third-party/nlohmann_json/LICENSE b/third-party/nlohmann_json/LICENSE new file mode 100644 index 000000000..8b0f7002e --- /dev/null +++ b/third-party/nlohmann_json/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013-2018 Niels Lohmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third-party/nlohmann_json/json.hpp b/third-party/nlohmann_json/json.hpp new file mode 100644 index 000000000..c9af0bed3 --- /dev/null +++ b/third-party/nlohmann_json/json.hpp @@ -0,0 +1,20406 @@ +/* + __ _____ _____ _____ + __| | __| | | | JSON for Modern C++ +| | |__ | | | | | | version 3.5.0 +|_____|_____|_____|_|___| https://github.com/nlohmann/json + +Licensed under the MIT License . +SPDX-License-Identifier: MIT +Copyright (c) 2013-2018 Niels Lohmann . + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef NLOHMANN_JSON_HPP +#define NLOHMANN_JSON_HPP + +#define NLOHMANN_JSON_VERSION_MAJOR 3 +#define NLOHMANN_JSON_VERSION_MINOR 5 +#define NLOHMANN_JSON_VERSION_PATCH 0 + +#include // all_of, find, for_each +#include // assert +#include // and, not, or +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#include // istream, ostream +#include // random_access_iterator_tag +#include // accumulate +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap + +// #include +#ifndef NLOHMANN_JSON_FWD_HPP +#define NLOHMANN_JSON_FWD_HPP + +#include // int64_t, uint64_t +#include // map +#include // allocator +#include // string +#include // vector + +/*! +@brief namespace for Niels Lohmann +@see https://github.com/nlohmann +@since version 1.0.0 +*/ +namespace nlohmann +{ +/*! +@brief default JSONSerializer template argument + +This serializer ignores the template arguments and uses ADL +([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) +for serialization. +*/ +template +struct adl_serializer; + +template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer> +class basic_json; + +/*! +@brief JSON Pointer + +A JSON pointer defines a string syntax for identifying a specific value +within a JSON document. It can be used with functions `at` and +`operator[]`. Furthermore, JSON pointers are the base for JSON patches. + +@sa [RFC 6901](https://tools.ietf.org/html/rfc6901) + +@since version 2.0.0 +*/ +template +class json_pointer; + +/*! +@brief default JSON class + +This type is the default specialization of the @ref basic_json class which +uses the standard template types. + +@since version 1.0.0 +*/ +using json = basic_json<>; +} // namespace nlohmann + +#endif + +// #include + + +// This file contains all internal macro definitions +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// disable float-equal warnings on GCC/clang +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdocumentation" +#endif + +// allow for portable deprecation warnings +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) + #define JSON_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) + #define JSON_DEPRECATED __declspec(deprecated) +#else + #define JSON_DEPRECATED +#endif + +// allow to disable exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// manual branch prediction +#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) + #define JSON_LIKELY(x) __builtin_expect(!!(x), 1) + #define JSON_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else + #define JSON_LIKELY(x) x + #define JSON_UNLIKELY(x) x +#endif + +// C++ language standard detection +#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 +#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// #include + + +#include // not +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type + +namespace nlohmann +{ +namespace detail +{ +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +template +using uncvref_t = typename std::remove_cv::type>::type; + +// implementation of C++14 index_sequence and affiliates +// source: https://stackoverflow.com/a/32223343 +template +struct index_sequence +{ + using type = index_sequence; + using value_type = std::size_t; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +template +struct merge_and_renumber; + +template +struct merge_and_renumber, index_sequence> + : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; + +template +struct make_index_sequence + : merge_and_renumber < typename make_index_sequence < N / 2 >::type, + typename make_index_sequence < N - N / 2 >::type > {}; + +template<> struct make_index_sequence<0> : index_sequence<> {}; +template<> struct make_index_sequence<1> : index_sequence<0> {}; + +template +using index_sequence_for = make_index_sequence; + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static constexpr T value{}; +}; + +template +constexpr T static_const::value; +} // namespace detail +} // namespace nlohmann + +// #include + + +#include // not +#include // numeric_limits +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval + +// #include + +// #include + + +#include // random_access_iterator_tag + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; +} // namespace detail +} // namespace nlohmann + +// #include + + +namespace nlohmann +{ +namespace detail +{ +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; +} +} + +// #include + +// #include + + +#include + +// #include + + +// http://en.cppreference.com/w/cpp/experimental/is_detected +namespace nlohmann +{ +namespace detail +{ +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + void operator=(nonesuch const&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template

      UZ1_8b7#Op<^2cBZYN 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�|QkyGdCs#FiQAXdy@XkL}o43I)jlaAt%{l9lOWvIq zDAf%)NAt}u&}yX~i7Hcu_JoHHIh@0jvQ#)(1##bs-b-Te?2WdZbMK#umGJ&Z)N59B z_f-$fs}ywY1m0_!D=HD+T8u9&z)rp3*Q>CAmgZL~qkqwwTS&so!poLMtj?)gGui3m zmiG+eMD@1R^|6L5uJ~^=p>8eFjpbeMjkiDk!c_sp+@x|=x+|zQfE4Wab_A9c8LBdb zXmU~Ne7iMp`r5L;n#hh?WG?Kry>l+s7cGnqQeB^38eH)c3+*2}6t+31(070ID?Oc@ z44WLM+@Q9TRC@&qqqNp6|Lq*7Y*^`6&(!Np2bGxg@9(WKr7cGEIggxiK_*N#$F@5A z^5h55{YN?@dGiY@=fFH&!HV+;~%P?hVm{3vJ7soe2a#*Y!O>=CuEUW&8a&}B} zu!M&4weYo?E1O%VrN^!0?nu&N6$w*NVsWwlj!K$9jZ{%_?QkbFyc$-Goj`3_b6{c5 zcYv{y1l*rTiNYrRaI$*4t>6dVE#d{E;C@u)x zj-0vve-H1$TCW1O8n-%uv*z*n#)#2^wcsjYZu}OWYM()w5){(1JlIes72{b;p2@p-YnFM zedya?3Oe`JiS4{o$)=c_30z4_2cA-w00Z^bh_o!AZ*}=B%^bZNurOx9ywrGDQJ-0T zm9M6NTT+(XZs7Dk*NV8^j^BG2|Cbu4zj1i?DDEgIs;7*;K23Hbp=EU>qn_>>vuYvg*dJQS343g<)Qk zrXL1iunQl^8j+KJ|2^V#aa42);PcR)>038WRVC0?nd9Lm9MEwC=OB(jOx7p?g1H z_%{Jfv?nt4WNja@CiZiaTIpn*nf=@Xb(bm z;oRt2ZVPhQa%f9_C;epUC;uCi(`awRXc5Oh=%n1o=f1J-b(!k=KF1xy{5*vc#><`YO#`ky1AQRY3T+czAqs@YYstg0DL1|X^UR~>! zd#9YjPQ|||+>5VU4N12X>FvAVigxq*C%)Fv$fdJ3Qj)1d?*PmnpYb4>&vT-f`TRXoV#rngI&C!Ab#jd2-HqVAjN^Hwi9mK*i5p?QZ#x*qIbWGMs z`WGTom%g&k`)mieMmIK7vEb#N*_v-@xJk&%Fex=P+0yAdFlDrvD7Smc?R%ixy5yju zF$v|-|HG#Y^z9yWErg~NJ0clB$g?0{l~}#K%xkvA08r~&`3Do5DKA$-P4axOdVy8( zUp(udz=$E+v@rs+jzW=>v>olU7O7sr7Pm-iW^5}(e08EeQKj}3Skrk zuy)gy^G27~raA&p(dC~=tkvJC1+ zlA<2fCKZD1AtalkBgxRG-79M@2JX1>)p69OY>E4RgukP*6W{P*iA5VkdFI6B-iFNh z%E~$warNq=*#4YHJ*Ru|FxuBKeHbgRIY~Ild{}!_#jk+_nD9`IqME?2zX*l)Eb};b z#ig#axD++sPbY$&-)i}r+|hq#VU znv5_2NK{&-F?O8v4)bU35i~MGq(IYS;^OTKh3VlD-+;antvehx){S)fb`WOrd-|F| z2Ak@!q$V>ZwqLM7IJguwPZ>0c+5c}BU_Wj(CfeC_Wrl%{x81~9V{2g)s{qTuA?pf7+J<3T3(2@~GIlPyd4n3E|o;|SQ9{5t17T}qFF{0@y>kN(v zd+860oTk{Bh~xt=z<8b8idXYXVo&|#cj(&*SA$(4w|BMf5W=j-}=W5K|b&yeDbhEL~%lv>~hPM#!WNyU% z0*Jw=O+di56cn&f=2?|jKV1Oo=O$k|ZYDJz6z4A-{HLKNcf=s*#wlEFv|&Mz3HDHM zmuw7$ME_NE@bPrhp&nI`t=eg+`vbc|y#wg2)@wwaM_-ybFx#cifeVJY?*mq zVLtys0^5=VLGvc*AE?K5TwMN$(0$lm-cnv3wV47?b`dLPiTsV53XqVsWmvHlcKvDm z87V%St*mR3X+CLb$;a5qa;dbd#;_Un#ZLTO!TLeysdT2?+4CZuNRaMZYFF`v-j@ZO z6$eT+jk0OSiTSwDWKnG7g##<)`n#N`Hw%izm9QT>-!IGKnM4sXT?la@jyjU5rPLvWy>oEf4pFpFher7K|{f1t@d^N{G(_G zF*pwWnSL9?0qtm#V!K_ui@JR4l5mIiWFlO6|9t~{N~+oxcXv-cIWF-+4eBAq-`FKC zxncVFW}gtOfpKuX>`4Rbs=RYGCl-iyWl6N~gSn?>C8^_UxfGK;G-79-x>cP)XH?ua zDPI7sR^&g?7j6D1j+)%fdd_#W)o{`FmmU^g9s+7xHJ0~=Q=jcOL<@B{P5*Y?G5LF5 zc3rK|2_cSqAFBz9!e5L0u$sUz6{ZzeaX1`b?@$JysTs$j-AblQRt7EO9kTw>EyyLY%#;&@W$|Ywd{-GpZCPruf8rimunY6bZ?|)3g;&;-XK(E|8^V3 z4M|hXmY%z zL86%KVwPV4mmz$u9BX*1rEi@s|h5?6RX>pM;A$LeKn)a znxTu}{XG_@5NkIyd@E(C&qU5GC-kPC|39+a5C10K4dMu`BJL9h9L{KIr;@L=!RL(; zO=%I$D$RnzL6Q01P#XXGYS?*r0Gvu(1MOd5NB4Wz!2!+oWj*vS%8r<)qjx87fiVxh z91B`E(o+gb5HX?^iq;GM)5)k?+AokJESNBI2G?i)62j8m27!my;fL+);-NYHeN&F{ zkziqU*Hjjh-N6C>K=7+3g|Q~C*mwC+CTOBK$idKB$A@X-lF1pLpV0^{yb^f8zgX?H zU+daHli7Fe{wTEPp@e4thp4j-YP;LM{!_ypiWiDExJ$7j#oe6-cP}o*-5mmy;;zAh z6bZqhP@Diki(7GfbDulE`_AOgWSE?9IA@=|*ZM5g6hk*tAC8hnGTHhVyVhkk_XF+f zV|cDpd~uTGmY{%>A<#p@1N>43O}QOJYb~|a<{2^BUSsxi7KJJ4|v_Xqe zoxRntHqkHeZv1V}`Bt1OrT6pMkSn{9@fuh8`3HbG7OP@#;lV$Rq}39iX33qe;tc^< zmH!I4j8?>7{JWf>(-Wo>D`O~j7nu@DZw|iAz=u4%DpBvA6X!DgLhqgfegQiir3%7R z<8V8&&mZO>WtMx?nk>r*rfL~1@!>0)pP3Fx2lqq=Vl!+ zmNtbx%T>1VlTR4MIfN4xr>1!U7d8Rs*MWOvJ$DnxDdT15DU<2yd8Bw<=K@JWi5m0R zssOsgy}`1SWU;uCgSmz9>z(~7%LB0&HR_$BVU6{7L-()Y@{s#QNKAL#BMq%qXrq?o zVVy{|m&e!5XW)r)4y9s>NKZlKq91N7BvMv}9jyD+)xs0!vmg;7UgW~>oZ@uk74BB@ zG*3VBLRQ~eSzC>~ImJOq{yE9cX2!Mq=4YY(6;()-h-%f8-pw`gmG|jCzqKxV;>c7K z!&PcEZKJ|;ePkB4;+h8v+129t>Ftg>{uXyGFx8eNN4B3G?F|4cGNr->u%7qcZ^uwj z+B2}oY2eJZ!4oNW2U<_)UL0oD)h;AvQwKI~k0S>9HQH?n=MA^DBop{c7gq@z>-TMG3ykA4Zg-F?zR=1`45Khn~Qqz)FAU7h*ccimI-{?J;MlnRMHPVi&e z%}&vhT!v%jS2mJjA?YwKx(e4nNG|iwXF2V+*uk;2AII#)x^igIw!Al7*_-d08`VJ7 z=ofNd+;J~*Z?)8h9a2v(ANvw(y$)OGoO^`NTh}_x1pqy5T|fxg?Qj)E;N=kom1_EU zv4dNulMq9r(1nn}+{U#H4thLME40FrZS_B1sWWvb#Siy!d2b<0F}OvgWkQXs14^u9 zb_KEVs!BTJr-Sxsb_ag)LuYs5X!fNsZ=(rx)94E-0d-Q1Ke=F@=EyW#V+<=|1i6#? z7Rnx1$@FN4thK0J-{G+LK($vQ!LMxnUV|dfo~tDg889`3Gb7c6@dfROOkb%x4}EEI zo4^hu$WCfpNS^K$0NtEQEgU8kB02%Lv&TMxdQM9#gj~Yw2#p=5;(Xahv@Y>fRx zcZmF+h@!2W`fRg(j0lzwm4@+Wl743wGJL#}pYYo`@8!@pTELz_8ih5Hi3eHwJLKqG z=YQ{2MZ>IY5zkH=<$P2MhZAKq?m3wB+jcxje}|T(w(CsSF6?@wD6cekm^iNdy*{Kd ztQ=`*Tot*Hb6Wyb8{3abt=Vm^W5qAtBbN>7Z(7srOq?ZkGmC6emYj%|Pv^#5WRWK+ zWhHX+_=$sLqT}kgW>B7&60@7vkklEZwX<2A(9rCFGN}HM?58(^x)Fc|jmS$4%LP&3nnBCgMQjrwN%o=$4S0d9k0 z+TFf;RQN?Q(+yq!2jM%|m!Hm&VRko3vCyselDY))6izX1$sJg666NxM8aL*^Jv&tG z9KnQ$Ng;(sK@S@$JV$&4Ac5c@gbO>)2Y4LT6SW*yP$09dXNEhN{S(nU+Y4^txyWsIm~Drt zwv}RPtlxF#sBubT(|5_GOMVQ@#qlQENW0nedhzCH%xi@H|sfye6PrxU}B8->$7B{^@r-1g3Jg@>QQ> z^_ToL5!-`)D`Rmtg_w8(?O*1p9%91a4GHfm=!c^U;o7&v>(1WmLAO=T-tN^%JKHKX z@zdjhUw43rxYbK3|W^#9UiWt*>s#KGj*(H+n%3|vbBCP@ane@2XU>XetHSmh4Nt2enxuG&y-515>PV4 zdV(4Qu#~|jNSE6jujt*2b`_$X+=A7`OkMyC-BYjk*(=FpAGmm#rB`RN2B2`DQ)c*pDidOUF}K% zEqq*wwD@e#YQuNw^vY!m68Q=|CupR1QqRzQQaKVxIyCHKl)oW7nWea0uVrH5*hbC` z+gN#rDX<)^j!>ghe9Voci#QwAZ5_K9vvqoSh&4nKL{5)6-9MIywR3q2N!T}Fr~?bW z^t`*-u!3~6{0pfxkMUB79#68hO4HFF1DLg;8hYoZ9{^kp$Te48?Befzq8}X{m1qNk z6f&JY!!ig0h>qLzwmifyZcXeKiuh^!+he{zS=3KQarsI3dg>5a;`dVMaof2o2^Yrm zoK>#L@=?CwTM7A=k&>dhW(`R`|8xNPOA|?#o6D)x8^gh$WC&~+Xu!ypam2U%h{YgwhPBKW7nl?dOXMuuYJ?=NO9~aSvvgd@BqK~|MzhN~#pVjW`H)?nvXj{Z9CuHKB zIhD`B_e1!EDkEyaV|UwXV>WQ>nD=6QvoNynG%kROi4*2}k{VV_x$?<;4EOsE5sSze zrg+<8!#mW~JgPQv=7O%a4No375omA`dwiYAnyawN%8G-K$VBIY^KI&+I6~b2@|`NbU|lpSi9PG zRtr(d6br7_$A^Ss7{6WTwL;YR(402^=#72~G8uyI8g58`gEYKDDJ?cijE*V#=u(+2 z5J{I2*FFF=A9+<~iKBxIXCYtn6C%x}QBO&!a!FH2i4p=+rnGYH#?IX%7RreuGpnQ3 z3;)^^g{FbhBD!O7THDcG!gaz+1i@pS0U)84kX%;?S$o&&sowhNJ>A80eQ7{tZ}|36 zfN7AJTKb!$L1IKXFdI`%S&;or`e0zpK;t!xuoaS=dodHv!3x(mI>r}ZqtI|qtGKG~cFl9c z)}koQs7jxyTCjPEKgn4OPo3nW)der-pN4L6iT^c$+XRgP&3Ww?|G z&-4%=l**>d$151xUe5Mo@cWPPKmdgnzeB6NSZk50+AdmL%O_)h;4$wPb5s$eKnT z4?EW;jT}+2Wty`IlWIy-ap6c7c^hq4d3J-6@58c+9T*@x_<2KoBT z6)K{71#3S37avx>fgSIvL_b`Z&2LR}m33lWg8YL#!$3T27^hc;4w(k+H9LQa^evSp zSzFxi#Ml`F!N_>yS9x05iXQnDO?8oJTs#?bA>nMkz)!Jg<|;Jv1if8X?B~Oqot|_= zbXObgL8^vX3C%l)Gf@mh+U7$crBigTus&?!vD?As^jwPjv~~Q)eqS{QWm;Ez(XlER zr$^3=NmUpVWGq-%k`qXl=v#zBBE|2@`;sC~ov1@tOQ~2Q?XVffEM>@EY^q_sVGNEr z^^RMcWoHrZSlYxe?GD%ivg=(~JKW$p+Ps0;o;v)%N8v`$^t_88?cb!_eb0r$A!%E4 zeieu)Yt=mzaPiUrg-d{RDYgq9|Gw?<2JfaGI2M$Dcs@iGK*EAGpzXr!4_D)U-GPt) zq_n|RMH2)5S7rMt6$-F_MHCW!@-C!^AurPqN*~Fx;unh3D=l8&)u?LF`oOkjJigiA z<0<1l(r~X$i!=do<#G`NNnh(qaM5Ery3)(a!QL0bapu~27<&1t4JY4}lJh2hOWaYh zYf#1s^0et{n-eoz^KPpF>x2Sp((UMK-V(&bYN(?Gr;OjWuEW$9aOx^fW=29kRJ z9V{db1wF1vK#Z%SQdg3S9awo6cGXW;;^LABjhxR*qEISuD+`7lRX6vmN7z}UMt&QV zm;5>(n&nqATcx7IXRSKFy+qO79Tm71q0EfEhnMJG_m5}C>^xH2H7E#b$DVbQErEC~ zklq^hi3;}eJ|{|2K5w){7~#tC%>xu$pE^6@-Lh_a(BI9;Tiu{@DU;Ph?}p`+R89M= zjbfT6Epu{WCw^g*!($;(0ut90m*Ugh_`gl^+FW2;ke{j02%DU`?E{S9-C@PY#Lo-3 zujKPqD94RF%bLg(ZHa>Rr3J`YPZsw}T*{fD6z$r0*g-DJBBdXG07UWEn*H(>Pb4jq zM!m&j42xn+``8ucvrIvAf_~9bBMphvd}!Wo2@@V=2pjuyiqdFHfPX7#nU1#zm~>n5 zb^KujY29RE`t-~!u`&@V$!;5(vN_h%UlBiv-<&_WGV}GQ;#@0$oK3%^-&*fEoYI6t zD1We)T(-@Q1%~L}C(mCG_V?2r_mSvQ@Y}8noSb;O=b+c#Mds{bhCVFzXorE`@~{{A zFnR79V0=Wo=V}@q;b-V>BftIY3oFOe57)iNe%^|t8yB-2lS!FI61*7i?s(; zp6@f0K8#*Q#GNGu-Gt0vGj;o4{A|6(^?$qy4AA{IzXC>dGX3Md(`Pab!BB1Y44t8u z%QTwN$WTV^m?;f2c5FhR+}towq4KRbvPC?Fkz7+#_^4vVTFOdV0YHh~H0i#N(%aT+`URupRr_>q~`% zi12KP7fEaNh!f>ve29Vf=mFkb&4n4rP9i7y_mpdYtm~F%&$g?{ko=7q#9V;64p}<~ z=_L`M5+6icB}XulyeyPU^wu`dlpUn`r9=kf+!?l34%Ee2Ic9u1Fn#(KbbCSlP5XE^ z`{Y=~;e04jeDPv&JVGEceEx(=5QH)F$N%eflwGOs&6;UEo%n;rgV@nZNg zHi!~AlX$I&V60yoHLve8aI?p2_>e;0&Cji587gKM#2ro_U({r|+R=PpDt9YQ7hel~ zg(cL@PCWU1xByOjKXfF^P&N1=?*oX*Sq^tfZ(#*mui^#Bl#6%CU=9@jat@p>Vh%FGI&7kz++0G+@g5wG;^lNsk${;~c|be0LY`dy^6 z5>BuFO%Zc5qngXCmN?b8X~Ei%DWF|eW6pC(NnU75jt`@Rf|nd>)|sdM2{bL*ROTRo z6&w5yuG5%eT$8&(XA(`Z8(4-Zh^qHhtk0i%t{9*CE>wh74`Q2lko|`1;>i`!pgjO$ zjZR}JA)bh6M8`G;E7&v(2fa5_+5APhecX)Hglkx8oy_OT0nTQ04WFtC0tS%`&MmI9 z$)G#3psNFchs#`96D7L&<>a(5W2#X1@6pw&_?4j_YIj#W7PelTeQBQ5DR8hGuP3$= zS^l-CN*BdbUOygPLiBXCe2qMQPWQ&K#r?j1Cf^9nfCc~WN3t--;U#_j)ESZd8q=fSatzD*4qDs%hyXsWY9{B0^SDic7i z)hr&I@G9OUV>u0ZDepMyDi^&BPAc`i)lJ}RHolsiRJULlc&;x*%S|v69HGDV#!Kh^ zd*QQFX~4sQ>UmXKeK(z_YX&*p9X+{Bg_-)dh+vQ=u68g?6Ic;{l(le;DK;0rL>tp= zYj!3hqt~(9y7k49+E9w&0(~TQ9B&wiat#abZ;*beJ3=J9+(A4Dd@ms#=sCQcHa%1R z?xSsWqZa1cjT5Ikb07EQp+Gcs_YH`{iIKm^t&1$g|2j2OgjIZ3U=7aGO3qd2R7hSP zUILgUhmx0Q8({w^$aYlc`-*?8Ei>nV*s9}e6Q_rHA?^tAmh zQj-SYAkgPDLS*mX_^!QsDJiA#os5Qp|NT?4_~U`8tH{K|VJykRX)1+Q`lkOz>ze5K z-El%LJYTiWX~FsbF6`Q!Z~}LIUzFCOmrzzYJunvu!YXHBd%zEnW(87VYRUccR#N~$ zteXMixjkPB0IgGi`U>($M9!qS{t6!b+ff~wl&+seUN!vTyY0vZa{KK~H$?bg5`I{c!0NC^G!P;4qF2@Z?&kYTS7lnzF05XLy z6HC9saR)JVbF}RBuwNw{_z3sw_VrS&8LTtu*@?|1*^+4UGx81+F+-X0hLLc1`af;> z{{NHB++L9QEPYCtx7S8A6>{#A%YJY7RgiBx!1mCMC`U88;j2QlG6t>wUSm-yg4Jr3 zr!$)ND-P%0!G(!Zo5$8}hz7g@%}PZi6)s>;)f}s`#(!@5NLVHw{T+rrg&Ru&+~q;ZmaVRiEpS7k=4^* z=kD#GJFn;D6Dq4}zjkL0?{wT8IsM@rIRexg5WiArVb0>N^vHw=L$%_W!jXFQzQ1q4 zXC9;s#7m2ZpX}*!Qhe7+_A2jZuvhZw_dbldDP;pB%M^`PJ0)%(CLpkxyV`$Yw2AwjU0kJ1h6)@p@}GxHIV>vv zPYcl2tSCV}O#gNuZ)x4N)4Ro6_MA8)Nk8nxc@cUepXu`5yDi)% zOB%9LJGpQEsm039-^}AsFF2kst}wFP_9Ya)o(n@tXBFOv7;SYgV0x92Mg4AIwzdtuT#!Y;}DThqfT@}-J`drBM-|jI9 zJj_rB4Ni&$Kzr`C>FQ2YklXPYr1j+X7#=M0^Wa+6WR1ElNKoCVt$V2-?W zVh{c=w!E#1FVs5Ld=mE@X4@~aW%O!Wh^=a}2j9nBzRW=*zDqOXP7>jn_XIW>s;+iW zZ7fNuI{lu`>PoiXun7-Pz!GwY;44%W7b_{t^Wo6V;Emn+{?dZko8-7xx(3bWdv@;+ z@`mx%#JYGHcngrM25H_@A*a6p1g}{8(%HV%x|(c8|HHta%%-ZGb+F{@my}nUj9BV+ z8+zsr>{NbNwrYXrZvDnJosU;P@B912gpr4rTT|}Pu-dTy@<&^;5S zhB?6uUmrLD(DvTrqtS*-3;iHbRXh(2p{LXGU$DH^naU4(RCzT6sZ`F6>E?!HwbXXZ z8DzkXi4V`@0zgT|j?3T1!A(*czy^Z#6^L}K&6%An`+kwHLCShG6_k9w6e9p!W^HIq z7^7wu!*Ppe%&dR5lMs1%j`?`#LfT3b6aefm>6*4&`&S=KDxMG1==)@mId7cMUTJ)C zngHR(`rm^|GL7W@oa;3kw7l*sEF+)3N{w^bvhsPZFV8JFqB!vzMpSo#WT-~R4pmqN z&7^;w<{BYDe^Nj5^HkiOxS;o1c8AjF5kC83+snmp#Mr`iu&yDLpK#;UI5*p&*cT5HK@X2AF}|7uc}?y% z)O@m=@(pG_9xLfh%2KraH5Q1*c1;^@&R0A0(<$b-XAW&aj>UAZ%y*eAnETfAonZnB0*NQ!EjtR~)o(_F2XlFHowClF@-&+Q{ zWnPp4qO;EgNle!AZZ_;-y8?sGCkEopAoIBn?1NjiZ$_+!hJJH!>g zQj?QvN3yE0Bwvvsk?xfObVyJ$WFtnt{^whBozIs>lzWT6dWlVUvRMg>nD1TNlIGkL z5Gpc%l3)^Cx`P0Mjuntj|KE~1!6*k9>0+*gLSJ{H)uu1dwQMe26P=cF7@!ceYVL9N zaxz;lPbrRC`JoT(ku`BrR>Bctet7RKRl2{SkM~)%eBI2MQ`YYjnqc2N zE*8Q;nUN;;_Hv+v+{Qpc!|=rHNfBBgugGv^6@SmBO|3kyi|CRC)I5;@RCax`rZ0Kv zwN!%w0-8Iq%h-|a=Wuv()#FbNQ~2rL71_H%xtaMx_HGumFrEv4rrY!qfvWv$`XRYT`VQ9k~a`>hy@^i4;E2(6T%Jtb>C zY^u(^s9rvq5hcOyPlvs=Z2{RvP0Q-#;Kk~$(gEt5&$OF{X;u<*!u-2%jW%(1%F)!v zT_Na<;GM(?W&2iw;?PFI`0YM$2d00!;R)MYmT}x}Y)yn6 z0Gx>v{p`}G$!VhlLa5<~HgCHjJ-ajT0gj$FD*;ErF?WmRD%Weyiyh!jV7`6~VpWbD z#|gl|NOsp-eCFbzU>oQ2-V#FkGi^U}S=UvghEfyZ%H?$Zze63cN)cX~5VgTvOccQ~ z9$&(Id^)~4=1k3OIPQQ7{GAL>l8o$RMMUk4eEJ-*O4IQvmaASkD`Is~CSKIWx=nR@ z2I}iLLjJj@ z{b4t)kWFBe2N43sKXs{V{`n<~eY+f>FPSMq|A{@XKIR*#l$)J>rzktfF7Df!7;9&@ zxGQUN1WNJ|8v%~Tal`Xh0SyJ45o9Xcc$;|okZh37dcl;it?mj1ZtU4*-r0q!I0BW! z>tP2HiI%a~eRM{OEw5syQiJc=sMtr+DxAW+wnB|;L-F-I97fn`;Y4zJ`RFk_A6u_d zs*vn-E6&&YNx{#EU$96`ein}ekxCehRU~T+7N2tpkJ_TR5^x!}r-s8Uk2?RIfNXv| zA!7Wn>$o{xL<1+tVNMbpi?^G|8>bIey`FH=5?hS#EWpHtg-6cdHzgaoQJ;yGXuWaI z%QrvDguVE%p#EdteS(0*vIXm)wf@JxjXC#;cG~Hm@vX4I{6Gb zs9a%>Hf)?*e*_g{ai5BNlf(?RA^nozvDqx2hGDE9BJA+rC0bXZS3go*?4u$gTls7N zta4R+JJT+@IXd+&iv4k1QYmpSq?nQr=^)0jusJqGy2< zk@g)ce)maMvieF~j@jDL1{&g9KIb5fXaDs@v>gq=FMl{-HK5>fcU3s3K@R`^*cF(` zQ*bOG0>W^{;n|5%6lrl2OQJV9LNPH?j-n6`_&T2Gbk(eLd#rb}e;i!5O6B7xqHe#f z^i4SNx`blK;$%<=K9?bViaoOOY)S{MCOI$BZn0fwW>Rt7(qfsrzPZAEe-Zfn^msR6 zf;>r{oliHQvCkqm%v4sqtWrM z+U%&udR#kEcZcwKQS+uO$JK9)ll{Ww`F&{bv6a%p4K$-_JYxBA0C|f6vOgTbqfL7P zVat)>Gd|9>c~b8~JZ`^yyx2qrN@>`fR9JiZy|SlQv{1$(k1Wu^gjrgV%X;3A{SJdI z-kk*gr>CUjuXV;=ll-tK$Nz?=viX#-Ri#=%bWI;5hs}dG1!A2jDYH46`d_SyRon-%&g9oGI);cYNS9H~OUa!*VDeWu|@S{5@ z!hL)cf(`#G;7~m?vGbT}o_IMY;|L(Au%jE!R<0%)JZ(>{2A|tt=gFY-5j0ou-}ysWvnX5{cz=j$`93-7TO#yFEPpK5O*uLVR321$)<#6klSUqQWku;K zqY>A9@9o9WM?1JuOyV9oCs%3_Z2OWA*rIgam&H$yzhm-2Hd_9hfORTCZm|spQ)9_T z+>)eX8XTC0ItjlNt$eBPk^QUoxbmVu@~yI9wCAKLud=kZY%|Hzz*l$mG*O1xCLn zdalu2&Ty};RZT9sHjh=?FQ2E1o9)Kt%E68DG!@IZ6AfAle1pI*J=ubJH3t7>BCi>D zM*fC%EcTrau%a2FnNO%vFV(0S-;+Lq;@<_6KrupbGD+3;+zNFFebgc>98jUGz@O!u zj{i&oi)m>t?LO-nJbv%Tv{x>Rrr8PTIf$~pqIgBJqtVX}Mk`@cGN#Q)aZ4q@eOun( z?uc9CrG_XicR0sOg`>qTkT=D zp7gk-y3aEi^NXBlm%=@Nf1JilRCkCyh?J`RAWJi_-B9YU|KFg;YnqdCaXWf0+5-P# zQGX)GuTiJO;BaV?`q(Od?gt?lP;Buk#;zl2HC z_KXABV+w$kiA%X+hI~fWk40Ld9*wG#8>~w?RH^=ebwr>Cme9LNS#?FU;eG)VZLVMq zj8I0WP5S=jnKLt$ivk?Wt3l`0l?&6SKN-&m)29&XwYbiOBkxDSixVUy0=hU0h9XcTbhcEpBnS+|988s z#l9-yglLi+93IxcQICh$`blWgnhPek%!+(Gw|XnpkO~AhkmaeHuhd`&p+j81Zx5;k z+oI{VQjzS_f_8?Qs3I3asTGT&zyBcm@+ylof}5l$dxIB8F-szPa{r$MUo*{>&HjI4-fa7&Lo8o@N#{&wt|7_}F9o{Dqf4*lhP_`PJw7Io%EB~-biIrKt zCpDfmdr;i}-04cxPYjKWGgIgMylBagnBD(_GGpX^>5mv7PM^#jX&cr;Z6qpnTBpUK z%X`Ss)JrhK!rxxu4Ac^hCTx6 z9vI0YP_$o}A6Q{dRI~xRPvEa3`UL5B49eL&!SY0VZZ&h{u>iftdQ=@tHFG7^&kM5) z2Sejog8ZA0lrr4UQy(@u#mA8~uR8q3^!c3PDRHeEAvk~fBj}2V|vc*;|dyDCMj>oo$AtO)=a{F%xH zP$aUR@nbltILcJWh#eq^8Zk@wN--kE(&fkrUnLJPGO5f~?9iKWHx%@>K8^!R=e{I~ zb9nT$o;xS|t@mI}w z^S2%zKP&`!G(WGD;&=x(?b5f>qr>`tXukm$$`1cK@{H+e^`0!zs5Hg;l%g+}eTNFk z4%U)J@#g1t{8m{cnwrhCINlqRJX-;9Eys)$Ityf8aVkqP+ol|35{+gq8&G+z@k8%m zkVQ2zdiR|^BbvK)Qwsb$uY8(a!_O1rtwq1bh0ss5KX?hIBhpBxg@9wjIg6zOMSRDq zKzg%B&eT+%tt|F5C?MdRb4y91Z=l=9}}~rubbPoD_Ov7>U!Fot_qkhjcDV5 zo&XFlLRgjQv2|_y45&Y$3tX@D6^IPpK#A`<0`)oZK~fk%kSbZPjy9-;grv&s$_IwV ziKeg?VSIU$&;`q}psX(83aI^;V`?G|rYyKMWbysh*B@CAfnHRi7lgl5)K>E01+BO^ zQf|lR;-vca3l%SYlLG_vwk{JNO75O$)@`}Jken}FEL$C^_}6F@*Pe|0JAKXC2mtwA zS5eXv^t`lFr3TxtsxfGuNr zfN|DtEYYz)P%az#WzUHw*^|+`B2IpBH~BMjC}T=Qb8S0Um0C>lOltG-SekPUjX5o0 z^}c)>JWE}fa>s>Bm~iz$U*Hb*5pl7!v4Rm)aQP%5aPRQ&)NsFb8WJ>dm+_ogbA57o z8f4w@45{_`Z_!%k4RhiR;hT7;M;tF&jPXN-*iu2}bMj7`fWn0$6Pkhwe&a7CP63g~ zV5_Y}v~hArR}H&33gFbh%0?1rah#%DSH^S)GGK39U>O@JwNl2JYY|*2V4nNO9+=GR zhW;!#JNO<^BUau-Et`TdT$sfpP?W8Czp4BUr>}zCJ(rBnRRLdz`>(72Sp>GE#>u8* znY_(UFCk4-DKav5FH|sbZ(b!UUx*HCKC;oW7 z%MV`FT>GyCTNWu|@S}A;YP`-!Q-AAr9yN;R&03#EF3lhPK{+Y}MXl19pza^7Gyp@+ z^>LF|=m`#weBLrw!*F)H^!H(_u^S%Y85C9>020t+l}f3s;99Qit*1h-o$#Rc}yUb-eBjQHA5n|Fj1qk*Ycd&kGXCb=21lyWZrv&xJCV8l4<@ zEut(C)eeV)$bYs)KHEMQcy#aD->-i^L#=cF_i;b`+Q>sHc5{mQ#e%Y6Ljo}*(wRc7 zgDd}l92=dWx4f0wvuI`iG?Fu8umf=`qb0Ds5C|K3T_^qtE4-Z@kqON4Fx&TfD+F*v zgVt(+N>t?E>SlJ=#y{kr)65h-mXNd?x0tGW6j>gX61B00L8!nxZGPI{1^_Djl2G(~ zf@R=)`Au&@;M|au+0;N*c>BkagLLh%c4(HU_yK)n^&wwl-wyGTkM?%zqZ|)n^cq)$ zb#z-TR8W4BCCb`(pT}(RR?Yn>0EB50gXg|~9YZrGx}eeh;IB14!QKF@%n^$o-zU*=J-_}S%D>{K(fAj@GaGyiptl)PuEPZ@!oU(}fvG39M znk5J$$ByeC_WmVZ+lGxhHftylVKSPGlGMmMm*e$VxXhPVz zzMa#K);5sb)JtBg2Al{nw>$0qE0LauqqOMb14dlrio!H*&P~KztTsi?yeEWiP~F(h zoCH`Vab5)7L_GWO&aL5U>0dAX+fK(->x9QGkEH722Drwn*JF+;lWGuIdTkaGMSvu&^WIz!^sjjT%|7DfR+7-rM5O@|1G3Fj zG=Z6URklA=Ucr#P{5XjDb}i_qrbuG-)`M1-)}=;PqUGKsB*HbjG>df%^WK)8iRo2| z=-2LXtQQf#g;8AJ zW!RZGdd}J;OiMmV-Bx)Q)aoTh<7w=b{|pkp?$*_2hKwm$Sx9Y4C%e*-#(~z;T?xrY z(Iy99I9n0U#Cml8dC$!orxU;T0{eByAKsy=I6oc=sZKI;hhOjkZ_5tHM%UJc>I4`b zOP)A;yVm6@n!4A1fzP9q2M^c$j8;HS{pvKv zk~Fz7ICywx=R*yvm9&&6%#bdwtDmgD*iqhc$K9ALfdQCfW~zD|KfVYr;TnqxwKMt^ z@r|!t_T$guw_=Mq4ZmJv5!++ap{5hsnKvzqprSzp$lz>M zQqCsKUkW2_=ObIN{2sOU8M2J$kQlvYpy&s2sp4db`LQB-My0Kdzvf^((Xmh&%pA-o z>49Val17pRp4JfNo-ne|ovN>6C$;@f-R-dvAH|#wf@8mE_H}TZp3U4Qh0`sHdo#kR$S_QFCy`Ntk@rW4|Z~>g|N5|*gV40eyW*E(7(3Nt&O!S#koUB7C7EF)`? zl%k+hmPa}G*ce|$u4Dlq(}-y{voTj(#u(Pict>iTJ(z)K){>=cQ8iuy93)L4jKa6d zH~*?a%QMJ{iJ$wLF1pgg`=EANe>CM<4$YsyfWM3l9g$y>13t@=-twZrE*P^K;N)1W z?6RI~dF*k2SiS=P&AX-}QXQxtmN!uZ*4^!Kq`;RT$ZWw6t!kai8q{o-j2;YM9FuKQ z&BxqdWUM6HOC&Wd^Tn*E^m;3%QVyh*eNMlIYLsqqMSUW~qK!@#bcoTCA-&DPBbcC= z8#I?;&(s2^EI1I_W-KR^5;f>$_$y1r#wW!wC=7gYVYF_GB#ItxA|p?sU-^K!MNh88 z+~6g`wG+&6YtT_I@jj|wI27F7w)^JfwNW^Yb?!33$E<;j@%KtOQKWhmtS}j>M3(@T zMhxWK@Bg#_Vz$w6lovFN!PBgaVN*;U$lz%A-!&!iFF4?1POV9{NV{~NYiQgBoE3q< zOM!=7)`viHp^kBT0 zYTKZB%Ek1&mgHGOW+|z13Hju?hWUfF194CbF6TY?U*ou}5lvYeWBfe4+Z+Mbc)O(! zN@YAbEr>gZK~{{>ZnLd0bxSE2$1jex~5$ zrT|%9O{=eE)6G_g*fnT0Sp;;b^sPL~42zRK{W=sk7FAGk*ixI>;X5$6S>ndqeZ+$Q zXgAV}c0NWeIkL#(<*E-0vpJqMR|O%=&>VZMa@ZJtGOO2g?LEa26?9kD-*dIRHisIF zeAFbwdU)}y(>wh>pIW z)dEPR%RhO-zYapAdX5x3`mtzB`&J2-bUvk#dNZxiFc|H5w2DIfkHu8|7$e!ZCk@t) z_#%}V4@|5_mps;T=L?X@8-c@iIy+~_Ma|CIX}LT53=^RC0c~USZBOEp51+MiBZeIY zcZz}Bn7lN2qx~I?5y_+PM(s@1g-jXUk(orgN21`|c}6cuBJ*O$x0ZsIU2;;iOi+Yi`g zohRmlQJm))C6#7}*!GGMONPv;#tx5RdYDxV-OS%SC!zU(xm!P&o!eDEsrZk!&09-UpGv(PRe$cmG^%BE zgI)um480bPDWl0(-18BSmvAt>vX-%*CdY3r{Wf#mm!HMI(HV9@*@>j$Uc}L)*w+PM zr#FmQVb}2SZnVL)g!IScoz)>DpF+m}Nwt+qJ(uQkW~DQgRwGz7$RX0N74>jbgfIfQ zn5r(NBnHe_^v;v$GqbjjZ5dirk9UuUhW#Ym=DMyk^jUbhPQlyw6MBKdi)P%4UC@1n z3VoKBT)?;^!(M`y-L+>PsnAbK$1B8caI%WOLTgTXUOsPPH6d4CmM3w>qg28oO`D<+ zY{EqrtH6cB^GSQUQ$*zH<4M0j4|<|#%P1yQ`%l9<(a~rXK`JrW@MWw>AP=?ghQ5g( z=ETE4`6mfo%l0PsSR4&_0NIc_!gn@mVPw;QvaWDKyr zA&)NEVrCP`y5G|Sa3L|t`lCD5+jrFniN=pl?6ctg?Ve%?RmM=V?*@H|z3bfiy8jFoB8ttt7BoOo3!-FkbiPoiGwEOOj z^{$4%INTc6g8frbsTaqGM4L7jVha}E-7{wfy5tM2iA?s}+k=F>oC?4~uy&sN>Twt2 zI+G2hlkB#U5}w_*mFEZM%n7V6+FLz{$$cMr#wK>%CgP&AVlrsklf;>jAnHwn+(?E+ z63E3$q3-mM-!m&Eok|0l1dE2H$R~e@+_U zm1cBwdcT>Mwqyf{cGm~VOf-G0)g!x2!FRqWke5UG(XhzP5i*Mr2VyG>iBW%pd<1sn z%)5H;43`)iyJtCLB^%w(6y<-?caDNjG0j*d(Fg4c=bO2?y4TmgsvK!vQs z;~lXNgO1X~)lPKKB^4olj?!x3(4{j+io|}TpMmt+i6R8l5@^r=rmi~&zCj)6P1uL+ za%*Ygy(Q7@Gj*^kG6_+wZR+lxxQm@U?MuXUyD-_F&Mreh&+{+8vWvM+ow2(gBQ8Mu zs~2-`sP^J#=I=JEd%R;Vg4}-|BlfF02Q)=o&D5oXT%L$HGB!KC_l;L~xp%1oGkXpb z9_KVW|As0WZNHur3ksI~&%e#VLFZLJ>a~8Zm-p#yFIc3D&B0}ZzHHS$^E$Yyu6v-u zdVPEJpOXvrez16NQ{8xCKOM;pV)Nd}uP1`U$G-rqnYOIkc^z$8nr358Kh&8W#bB6d zyph5q=~&p3@FCh(&VeuZayacE6+n&LPJ#9#Fhe0mM~wl$dg273$p!}4$O3mQ7C6=9 z5aO<1$;P4`esNI@u3@Zy3#q>Tf31CYP*YFzuN6T+nl$Mh=|y@|njlSzv`~}~iVz~9 zclm-yM>4YXoC!qz979f;JfAKeO=Dk1PAMehcxpQ~t?w-B7=X1`U z-8~2SPMtE6mLA(tht5l78;>E~Fw0n{uZcAlO85sVSso^O^z`%4#eVmb)%}6|& z8uaORo`JCh+f?#EKM$ftd%UL9?J6!NjZM9*_K&mjpGcfk)KxK$*qMWUB=Ib6Ky7|A zKxf}-+Y+!yeDrZKh0+NuDe``uwS1gdBaaF3V@#J&dS6dHhzTyLO4k2HCJGlL)BxHx z+K63i^4Mk#NznR`_n<_3QgTbkXyh*lp2YZF5_4n3Yf?_blcL4J}awEFW^Qve*(%n zeG6j0nEK`JglqrVE*`(x8XPA})81tc;pq9^GKg&8I#>jtx|_Mymrs?qNZZQ^Qngip zl*=u_l`GWV(48d=QSyMGLPHp0FxmU9BI$GTPki83RMeO>6i2=>qffXtW*JwL8Fp1I zfa<(Z&J@mO7npS5nq{ydGQrk0l?I6FblB(&lpIY^!O47MgZFVYk~qL;;ItkzMkZ+F zRFNunYE;5F=jy=bimdP#n~5)@Fl74-joI(p=hEe~3{8@z)pQP1UeO&N?aII`(8-sl z!URzlH_2T4rcz#6OjKHOdUUXLLhWT6$@t=&>495{YfmY?Rx(6h-}Lw*Jx+@Z|H7lQ z(LEa1A?V+A`rgA6)~ytU@bN%V{1hv@9pDe*Xz-@gcUC};j`Q8fG!LYf>oBtS8_wToy%c%Yx z+A05gbGRtjn--;kYbYXp*)faxy=!dRb}K_r++No^&ZCTXvT4j*bqQ83qr_Qw!%#re zeb^MBr5D%u+d!oR!SY3$Ua8S87wORiKsIS%K7fOaDWg$KCt?jEQ=+txNJs-t27SQp#Hn0I%PNJWWmz;1jxl&Dn ze#JBCVwb=hnO-7Qc`>Php_%L13J;ws7Zcx_%SoYjUiw<$J;h- znD~WDV(YC4mUV}~q|{c}K0tUe;tZkS{kB(hPX%56Qj0cZk5t zp9ZMvp}h4opD5Qr@33sCuDJ9)LDi%4xXU8RmP2kx!CU0jl}v=srO~4Mq{E+Nzy0S^ zZDBjfhbZ$5NuD**s#8K`PQ;U2PWNs5snwvxv-8adldq@@wLT>!cu&=iEK7@5EqnQs zRCo)l#)xgBKqI@exZo*-XA6EjmsT=y&-8d5SfjFpTKw|2LAJ!YyFn6DM4eeJC z=ym(NLV?q60Nr69;Mkj;p86E`0IF(9N2}pbh?(=GAboAdS3i$*is#87mKRD4Sf-Ju zRqi9yuU{9fS1P=6$ZId+w)Ho0nL{sMwsfJ+&Nr?ucNP51BhKd5`Zy-N(8pi1M{17= z>6MP>^mm}u4zum5q%nPCK8%P#90n3EMF^X!Trme*#ztnC1 zHpXOdD_Wk(M(?29@0rqm<@c~$<*d`7Dfp<&!)5c#phbH@xa7|}ullBWR&v3Iey zWncq9aJq^I^ae-F3zcQval)DYI3-c)S0&}s!xgvy;{MSv?HAg#CuxUrhv0p(MCwQ6 zV8cf|Ca!3X#ZOFn{W79Qi+6f-8rb`sD?1v^d3~Vk)l~L#u;Qg(|5n@2|occFT+cT~jljiDfx~1Ms7eyyG7y_e9do- zpPBv}z&DYeOi)EqXeclt6MNL2@TZa3pdKHw_ zEJ*gUy=Aq$p_dlx%C76Q6v$k?ez#+1%F)#H?`a!GO4nvH41TtJw%$hGn^l=J`E@rf zR{Ga7J74qc>0t6mJ*Gu|_s_QyRjgy3x_7VCt^t5ou@cK zLCx&eo9{{g`tX6g2Pfe=>B8L9pVa53Rg(H#p7I`Fw>UQ8BQEJ}f5W)6rpJwjif>`X z-$OTUS@~Fj^}*dPZr8HcqY}F5emv0B&tOAEH+|fw1dZM0WB8`a*yFPGhW;5acPJ~O zUA^-}44+=+3?bSN_4R|qdh$^+lE8NZ%022S7ls0KL#Dx1Q$bF-(rt$^j)|suPfq_% ztKe;H%Su(cA+f@mUHM@n*tj$hybJ9-i7LYQonOrQX zpm=}Z{IaFvCdNO`p)t>QVwaccK~nUsborNqv8y5`>3nluD$tBE>Wbnb~WDg1;c-P?_p&bDVUaq&)=tRd3f#UsTW6k(cH>Rztivuz+Z5uYyf*Jo3HAb4x(jCQ0;Ou5T9|5)u7 zzr+?`1@+9TozhtS=cJff0|~G}oV-rH?C(jZN`dY^OOgigw0O;DZxUA~tbTOUFrQId ztOu8a@MhAt88pg1v#L^P=dCWEYhaqi%|cQM&mue6AsP!4H8^&o@ftfTyQ0P};Shg| zxuIqCcu?4H7NV-OcP+(WO|-E+fn>2SGHdanFuMkrpL;l_$4Mpgo#S(={hYfkU*Oi) zd=L%_7^ce1i>1cthncq&nMBRRcI1Tmz!DZ+-qout~QR8I}U$vMDc@ zwMah{jAbzbGVLzy{_)p*XGang9|_E?%U@nvriYfv`2 zTT_^IX-0tENdG0@l&gWaXz!z4d}dw-ZaRRA0jr)pD^sJnZZjv%L@D8aP^n@S!ms;R zariMm4FhXRPPaB2^x|lGZNFHbD&{fYPZ!aPH<`2q;orvmDhV^zTAT#&Md%>1w5b*L zoHa@|nJLO7j&_I}pbC+-^k>p!(G9_t>WwaV)D22FSIly$n(XE zUm3V6@XqJRSyM(>aIO5^lo^+&HLJP}iIPe{?w(W{Av>Nu`(0Ihj7*r7I>u5Mi_FZM z(u*Tup5&2&q;oE5++}$y1?5p7Q}#ziwM?Y*vNY-FX2tX8EdjnR3|}ijICfZx9beJ1 zreyHjIf37myj8;Sgoj-!xdk-i8P8VkQ=&69+%Di62m{7v><S7#wxKWwz(PgHB|$1{V101VLst3k`sf@ww; z5(-gIJXz_-*325~VLIPSol7Wtnq=OG;6J6ziCIitU|2#ywDe#GLc=|k2|p)APdE9R zMi9+)3|N=wHJ$f+_6wC9NsyZ!)9*%7qC(bOiH+CkiDF6CtU;RO$dZAOP>>tnqt61z z2hCu|x$S&FpA7zEYyHEtc#?5y@(X21wcGU)uQKGK)Tu`#jEIrx4imkJ)*tHw0U!IV=Mc&m zo*Z^{?+W%8udFaQ!y3^VMeqEoK0W0@9%0G|3RcY%4hv-N}Om*5|Z z(|748z>XeZl%Tl3I)idXj)%xiS@NpY z@P{-WR+F?*h3JjVj)(gm2KZL&k-~_6ctT-}Hl9ucDj1@wT~`idPVoPwQ!BjuzP5&W zws8Q<7KhnH2Cz%+EG!wpy#6r*4;G`RHWI}aR^EeB9UL~Gxj0(92ed_FK4%V6l=(@F2T^WMqw}BK(x-r9J!B1 zvD5Lppy$%yf9$P_V{8)NWqTO2RQesr33E)mhJ28h2IiG7#hSXiLgPNNjpM$Rb?OQv@X^4C-gCN@Hb&nF0-JLqa zS5dGjhw+XW^KOD#U9S@V43YTB5IhT0gQKEgCEWJ*b%bc*LJDiWz-Wem}kwCT|scj z_Qb-wVKf%NnY18 z&fuv&3l(GIA<(2%!0Q=#2XY$<5pb;&%62Q@%j#;sZD6^^1VxY)2zVuR%*}&f6g(z? zIUV1jCqDIvum#-?HZ2bWp(Zsk{7&ztg5z0N6EXgahpQZkCICMcF|e$B$epOBeV)*G z*gWFSPvk*>p6jhXV@Elszo#EZO!8XRq+!;Kp>+=I){AXhbRJLz#2+eCcIh59U{5Et zp~Q%f^-CstSWft2|B!>La8Q&3l|B_6qXnsgIo*~5cKj>Iy_!lIQT$V*H?yJ!!EPNK zL1Pn(O$SZ8PB9_T`S-I1US`mr$rqs11Z?Rx)8661!x_6D2leU(i=VR@JW31sVa4e8 z+MUU^u*}S*aoSh#I^Ug!$i}Yz9SQy5_Zy~d)dF@O@qx$5k&^Yj7x!&eJBhojoO;bc z&+qG;%!}pG@@%yF{+`q32mA4_a^iKn^Qi}ye;~;t)1dc#tUk5_%RPv2G^%qoj`kdwm&%WsD>ImB}CDMNg+k1+uYuq!yD4)UP;%rYsw z#U}N<9@BVS|7X0VEgzdzO7%eLr#E_zFNTG_Cj&XRDvMeZ1K&5K7s)=$o03O7HA;(h z+V2O3;w!L$=t?8)>yoM1Pnr4GT&b;vSfmGwX+Kq;smFJRP5Uv@d2X0{#NYO^PDC#l zS|V-dNy>|3&FV$a)Dh>4K}1mz$0PNA4auYJhhg6jHnyhGwW#Spq31>etFFViE`>Sd zjKJCkuwjKoj;EoE#lW?><0K7^Zj~-wI9-Q_ns*LeyGGWmul>Yg*j|=n+;t$k?R&A` zze*6Tt6>%M-|rxoXi)mo2cgY^(lQx3Z(3Of3YYD$ZM$pS_w3dz3HeZ0F$ZW;z}vR1 zk3>#0ZvLo*EK_lIgDkf6X#S{lyPJi;PC8e1Co$>gGIK;k6HVRs0ARJU7g;OLCu;sT z0EgL%*$RICzVT+n$m!K{5^}@gEgBFn9g6AySeSo-QzJ8Wd0)?o9d+iLkVpRUENro) zpKIA5t9PcHXWVK*YdUfUY37wm1Mnw*`K%)44D(_v#|qbjM$6X6z3LhhUTc`xU$v7a zVe`o4u-}yjfP&KSPo-16HO%5OC;Q`VOhm7BVB!-qD?ujdv{;sW#Y%?Qm#|Kx>JNd^ zu0AVvKn!e@HmW-}*6*H)1Z4t-%6sPOH2J{_79uiT<15aSu&kDY9#S9gzjw;vTLe+p zs!k@s4TmIF<3tj1TC*0baV4T;JoM6M)N@Wtsg*CX{S4JUu0tA{tb47yVJTZv)spc< zVjEG-o>k}HB)LFr_wz^6Rw0u1u-dapPoi8nKAr?&q^Ah>-%Ih=!2ikqe@-0Wh?)|3 zo-tR1SO^C&zv413Qm6hgdv&VE4CI=;>TL}s#pfoLkctcKwz0RL(3yUhltgWRt5t~P zk<+XjV46|Q&ZUZ~OpscYQ`UV+E8y;$M%zoxzi9$n`QIph~D&>klbZM{8AB1+E+s;{(2_#QbX)qV;8a?^bn-Lg3@IJL?1e zPnANT+yhos-h|IDs#^Bt^VQKaE3F${Y*We=9L7aqhr_iwmnTY>xXX32g+8x?rICfR z1e(8#H}+E2kyqs!De*;!T-7!f5pmRZ z7VqKnF1?&1iBnLGxqUcRoo7y!3UKT5Z5-~s)y6dMC-7(y=`665TEnv zE1k+|6_eGW-mdXqlzxrV43A%;W_WG zoc}?o|BX)nKKMV-_5UZ4ptExQ@^3lU#>NL94;;J!w>^mUB2t2AH! G_rCxSRGz#5 literal 8600 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 BI#&Py diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_01.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_01.png index fe60d93772b7145916b4c9e9fb59e35869f438e4..647f18b690d39ec44f68ee6c9c6bd7d15ec27108 100644 GIT binary patch literal 75046 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�V;|xNwe5G<=r)aH1yz2aF<9@~!?} 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 ?td@bLe5e#A5ltfVC!l7V#=zp>cWJ+H70dVU?dg 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 YOZO2s_3Wj*#Uan~jP2?2lUMKl2T3)o^8f$< diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02.png index 24fa2641ed6d72631824efbeb72776878602556a..c1002ea56bf36c57be7d8728a658ec4b26d71ad9 100644 GIT binary patch literal 85114 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%0AI<)XQAX3} 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 diff --git a/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02_global_zone.png b/doc/images/distributed-monitoring/icinga2_windows_setup_wizard_02_global_zone.png index 55a3633bc2fa55a390d3c7d8a6f343b127a59474..9324021271941a13986e6238f852c70463fd0fc8 100644 GIT binary patch literal 82614 zcmYJZ1ymeCvo=f!?(XjHZoyrG1oy=kcP9i3?yd-pVL=kZn{S*t0@ z!~OfuUD8vT{?>!)u59#1hBf$~@@~ZKhs|3jvbTzc0`d+TDY_`)7ujePI5-+O6?qvw z|JBo;pnA%Yki+}q^W2;Ei=eAeynaUIxbG~|1PUsx@+v$KUkY{%kXei$GM=d(1*JNWSyvfhi* z2sn-eg7}BSsscZ_hO%5#vp1j@1Rb>@`-@& zQqI9H`5%bCf<0Pci0T(Negg7kp-#1CyDu%2kWez97zpB7wRhFCiW6qPrqvp~J-fMe zD`CxkwDGPi%&}iKp#ib}?5W$JhUp zgSTc;lHq5BA^r+k|1}r_ae=FQ{I&cmrfiGpi@*5Bq)!g=Zi~U6V=NEJin@25VYM@L zYcF4?*Z#GIT{GVmzpU1!(#l0+kn-7#rfeS!m{Et|7_lVTN&a82d%EnB(_#(re+d3d z>8cNyZXK4j{of{^O?$vr*@~zAbiuY)@zeT8=D@vFrR64jt)mwgtJ*Epp(*yg%-y{2L7z2>Lhe?;hsFP%4$4TPktC?j=X&S}E$gM^YK|VsnL{ zMG^1?KOXY0LW^2_AeDYQOv}4#>lly-r8tJ%!4|-P%C)EZ+AvM(-O+}5NW+B=DEEJu zvJN*nGlTsHYJ#bhL~*q7e1es5|z4vYsiD41QY~%)K)76hOWE3z_X$PZlc#tPD~avl-Z@ntj7KFBoYOPgr&SPrNxhL!WSyVn8%bK$p1o+GKKT>KBUvBpRSVUaZM$ZHv z@Ke0ZW&2;w7oR))dw!Ns>ifeeb(1?|IuBH>^)UdP|A$wzO4Nv3Z;N}A3YC?kW7S|v z&>P?V-9B#-g|RH!?+LI zlN6KZxzn3>|EnvUHlL*)jTzc=?!#n+OUzKXiEXu_sA_`S){MfehOAuy6W^Nz>s zVo-u$-aMY!f9GnK1CIZGbK=ic2NJvQ-(}pQ0(vRl80_1|fh&z{P`=Z=wN_u#vCSk&JWtJFH$knM7V_5M}>w&*XBKU!4{=eKLFyNk7*Wh+{Ld`L^4ma8q?#ZrNu{ShE z$kOB$?n;((u`iN(!1*?ED=?B&U~OSD>3fllNMuiSaQW@{=(Y3S<$o=Om45_QyK6KB z5k*Hdd|R^AUlyfgDzh~O;u)Sco(W0p+udNh_WO|3+?F@t$SY!~aZInPskduTcgL*k z&Mn10Dk*>E=`E}mu;o7g@obfwU&G+c zy0~}hzZOfF5ec*XL-2$9l94cNLFibGmgFsg{Y=q*mWk^-Sz%ZnW(O=WYbZ)VQ^KPr zp4JZoOX1Y`gF5xz?;bCS(6^s*6ZsqP_9JRcXE83`*r^rwGvdLt{NdM}@sOadKZGLz*CGPS?Z>PYhe=++R(Vwm zK_XKP%-i8MHCr?5pt`~H* z{-eNH6e9Kdz@!Ll$^L;<9xBW~mclhcVuGA>wKC&EwzO=PVYjkS6h~@jLo(KiOF&g;b3cND(mthJ;1D zxUoMh^jZA9`#+U*kmFJe(isv29C3X8cZ~h|`}Mx>W-W1sD&&uL=)e20;_`AvCT3eH(WLGcUSbu|c&;`JeBW&bJf9 z;{I$z_{qKABl9mg;Hk9*n&bLm(>Ojw66EF#?S%!_`JMr40f9uF_W_-Mrds;{-P~M& zX#sD%^jF$3CNp-+4m}e5h4r@!LsG~V((%t)j!Os}NJb|c8Q+n@f>ALG+C!QU!ua*j zR~DYL{WmE;npa84;5GtKcNkC3uM}d0v6g;CVlx{noNfKp7qe-Km{mOcJR7!4v_{ z8O~38F`R$9iaC8YLpLG5rFAL^;EWvp1xT}w011zA+4gYL`?%V+pWs3r4!zdPj z=8oS`S3fyxiLuzPF1`pm`YB7Z@2c{Qs=fNBEsPJR3!i1kzu*0tBgkZ>ky zz;IDr3blROTkqjEK1gpCb(92~wt1TW2efnQ^BXpFn22f}(pp)eE9Qz8t1nO+b@iXL z{^{$3#>Aa6m<7MTqGEDI$

    2. xCj`o8YydiLL$VRxC4~}Ghmq$%GO)~oh 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 XVQY_qnqq)kKlk#v+Oxu^uRr`BFQMa8 literal 0 HcmV?d00001 diff --git a/doc/images/addons/icingaweb2_businessprocess.png b/doc/images/addons/icingaweb2_businessprocess.png new file mode 100644 index 0000000000000000000000000000000000000000..7824ded5b2500a4e5367a8ceb080391a59a8cb53 GIT binary patch literal 181635 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