From c035d1b8883ed7b65c3daa3975ea1adc48af754d Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 17 Mar 2016 06:35:30 +0100 Subject: [PATCH 01/86] Update .mailmap for Markus Frosch fixes #11399 --- .mailmap | 2 +- AUTHORS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.mailmap b/.mailmap index 45dbb9003..d5e641cd9 100644 --- a/.mailmap +++ b/.mailmap @@ -8,4 +8,4 @@ Jean-Marcel Flach Dolf Schimmel Markus Waldmüller Claudio Kuenzler - + diff --git a/AUTHORS b/AUTHORS index 62a91fd21..d8ec272b8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -53,7 +53,7 @@ Luca Lesinigo Malte Rabenseifner Marcus van Dam Marius Sturm -Markus Frosch +Markus Frosch Markus Waldmüller Martin Stiborsky Mathieu Lutfy From 24836a405c6f1cb7d33a80b6418010369ad4544d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 17 Mar 2016 15:49:13 +0100 Subject: [PATCH 02/86] Docs: Explain how to use functions for wildcard matches for arrays and/or dictionaries ... in assign where expressions fixes #11402 --- doc/3-monitoring-basics.md | 2 + doc/5-advanced-topics.md | 89 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/doc/3-monitoring-basics.md b/doc/3-monitoring-basics.md index ff884d0e4..f2510a1c2 100644 --- a/doc/3-monitoring-basics.md +++ b/doc/3-monitoring-basics.md @@ -517,6 +517,8 @@ The notification is ignored for services whose host name ends with `*internal` ignore where match("*internal", host.name) || (service.vars.priority < 2 && host.vars.is_clustered == true) } +More advanced examples are covered [here](5-advanced-topics.md#use-functions-assign-where). + ### Apply Services to Hosts The sample configuration already includes a detailed example in [hosts.conf](4-configuring-icinga-2.md#hosts-conf) diff --git a/doc/5-advanced-topics.md b/doc/5-advanced-topics.md index 95ae6e413..de13ca4df 100644 --- a/doc/5-advanced-topics.md +++ b/doc/5-advanced-topics.md @@ -208,6 +208,7 @@ Use the `period` attribute to assign time periods to period = "workhours" } + ## Use Functions in Object Configuration There is a limited scope where functions can be used as object attributes such as: @@ -393,6 +394,94 @@ as value for `ping_wrta`, all other hosts use 100. assign where true } +### Use Functions in Assign Where Expressions + +If a simple expression for matching a name or checking if an item +exists in an array or dictionary does not fit you should consider +writing your own global [functions](18-language-reference.md#functions). +You can call them inside `assign where` and `ignore where` expressions +for [apply rules](3-monitoring-basics.md#using-apply-expressions) or +[group assignments](3-monitoring-basics.md#group-assign-intro) just like +any other global functions for example [match](19-library-reference.md#global-functions). + +The following example requires the host `myprinter` being added +to the host group `printers-lexmark` but only if the host uses +a template matching the name `lexmark*`. + + template Host "lexmark-printer-host" { + vars.printer_type = "Lexmark" + } + + object Host "myprinter" { + import "generic-host" + import "lexmark-printer-host" + + address = "192.168.1.1" + } + + /* register a global function for the assign where call */ + globals.check_host_templates = function(host, search) { + /* iterate over all host templates and check if the search matches */ + for (tmpl in host.templates) { + if (match(search, tmpl)) { + return true + } + } + + /* nothing matched */ + return false + } + + object HostGroup "printers-lexmark" { + display_name = "Lexmark Printers" + /* call the global function and pass the arguments */ + assign where check_host_templates(host, "lexmark*") + } + + +Take a different more complex example: All hosts with the +custom attribute `vars_app` as nested dictionary should be +added to the host group `ABAP-app-server`. But only if the +`app_type` for all entries is set to `ABAP`. + +It could read as wildcard match for nested dictionaries: + + where host.vars.vars_app["*"].app_type == "ABAP" + +The solution for this problem is to register a global +function which checks the `app_type` for all hosts +with the `vars_app` dictionary. + + object Host "appserver01" { + check_command = "dummy" + vars.vars_app["ABC"] = { app_type = "ABAP" } + } + object Host "appserver02" { + check_command = "dummy" + vars.vars_app["DEF"] = { app_type = "ABAP" } + } + + globals.check_app_type = function(host, type) { + /* ensure that other hosts without the custom attribute do not match */ + if (typeof(host.vars.vars_app) != Dictionary) { + return false + } + + /* iterate over the vars_app dictionary */ + for (key => val in host.vars.vars_app) { + /* if the value is a dictionary and if contains the app_type being the requested type */ + if (typeof(val) == Dictionary && val.app_type == type) { + return true + } + } + + /* nothing matched */ + return false + } + + object HostGroup "ABAP-app-server" { + assign where check_app_type(host, "ABAP") + } ## Access Object Attributes at Runtime From c98c3f52f045f7455d8898963223958c9f937135 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 17 Mar 2016 22:49:39 +0100 Subject: [PATCH 03/86] Docs: Remove the migration script chapter fixes #11407 --- doc/22-migrating-from-icinga-1x.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/doc/22-migrating-from-icinga-1x.md b/doc/22-migrating-from-icinga-1x.md index aacfe2471..7c0f0fa85 100644 --- a/doc/22-migrating-from-icinga-1x.md +++ b/doc/22-migrating-from-icinga-1x.md @@ -6,24 +6,6 @@ The Icinga 2 configuration format introduces plenty of behavioural changes. In order to ease migration from Icinga 1.x, this section provides hints and tips on your migration requirements. -### Configuration Migration Script - -A standalone configuration migration script is available at -https://github.com/Icinga/icinga2-migration. All further -details on the command line parameters are documented there too. - -Please note that not each configuration detail, trick or attribute does work. -Some specific migration steps will be still required to be done manually, -especially if you want to preserve your existing file layout, or any other -object specific policies. - -> **Note** -> -> It is highly recommended to review your existing installation, do an inventory -> of checked objects, thresholds and then design your new configuration layout. -> Keep in mind that the more dynamic approach using the [apply rules](3-monitoring-basics.md#using-apply) -> allows you to start over in many scenarios. - ### Manual Config Migration For a long-term migration of your configuration you should consider re-creating From 62dfcc7dc8c310a9139bc54564eea3e653f6260c Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 1 Apr 2016 10:06:26 +0200 Subject: [PATCH 04/86] Docs: Fix url for Icinga Web 2 installation docs refs #11494 --- doc/2-getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/2-getting-started.md b/doc/2-getting-started.md index 06845b65b..8a78dac92 100644 --- a/doc/2-getting-started.md +++ b/doc/2-getting-started.md @@ -702,7 +702,7 @@ group using the `id` command: ### Installing Icinga Web 2 -Please consult the [installation documentation](https://github.com/Icinga/icingaweb2/blob/master/doc/installation.md) +Please consult the [installation documentation](https://github.com/Icinga/icingaweb2/blob/master/doc/02-Installation.md) for further instructions on how to install Icinga Web 2. From 122256bb917bceab65828dcaa39023e58c55ba25 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 11 Mar 2016 10:30:50 +0100 Subject: [PATCH 05/86] Use retry_interval on first OK -> NOT-OK state change Only valid for active check results. The API actions were missing that marker similar to the external command processor. The initial OK -> NOT-OK transition should use the retry_interval but nothing else. fixes #11336 --- lib/icinga/apiactions.cpp | 4 ++++ lib/icinga/checkable-check.cpp | 9 ++++++++- lib/icinga/externalcommandprocessor.cpp | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index 9faa0304c..a67121b53 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -104,6 +104,10 @@ Dictionary::Ptr ApiActions::ProcessCheckResult(const ConfigObject::Ptr& object, cr->SetCheckSource(HttpUtility::GetLastParameter(params, "check_source")); cr->SetPerformanceData(params->Get("performance_data")); cr->SetCommand(params->Get("check_command")); + + /* Mark this check result as passive. */ + cr->SetActive(false); + checkable->ProcessCheckResult(cr); /* Reschedule the next check. The side effect of this is that for as long diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 42dd993f5..79c690f06 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -197,7 +197,14 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig attempt = old_attempt + 1; // NOT-OK -> NOT-OK counter } else if (IsStateOK(old_state)) { SetStateType(StateTypeSoft); - attempt = 1; //OK -> NOT-OK transition, reset the counter + attempt = 1; // OK -> NOT-OK transition, reset the counter + + /* If there was a OK -> NOT-OK state change for actively scheduled checks, + * update the next check time using the retry_interval. + * Important: Add the cluster message origin. + */ + if (cr->GetActive()) + SetNextCheck(Utility::GetTime() + GetRetryInterval(), false, origin); } else { attempt = old_attempt; } diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index f0889376c..a98127e1e 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -321,6 +321,8 @@ void ExternalCommandProcessor::ProcessHostCheckResult(double time, const std::ve result->SetScheduleEnd(time); result->SetExecutionStart(time); result->SetExecutionEnd(time); + + /* Mark this check result as passive. */ result->SetActive(false); Log(LogNotice, "ExternalCommandProcessor") @@ -356,6 +358,8 @@ void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std: result->SetScheduleEnd(time); result->SetExecutionStart(time); result->SetExecutionEnd(time); + + /* Mark this check result as passive. */ result->SetActive(false); Log(LogNotice, "ExternalCommandProcessor") From 8668eb65b527af132489d7af6046ebf546380e77 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 15 Mar 2016 13:02:38 +0100 Subject: [PATCH 06/86] Use UpdateNextCheck() for determining the retry_interval in ProcessCheckResult() This patch also moves the next check updates for passive check results into ProcessCheckResult(). That way the next check status updates for DB IDO work in a sane way again. refs #11336 --- lib/icinga/apiactions.cpp | 5 ----- lib/icinga/checkable-check.cpp | 23 ++++++++++++++--------- lib/icinga/checkable.hpp | 2 +- lib/icinga/externalcommandprocessor.cpp | 10 ---------- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/lib/icinga/apiactions.cpp b/lib/icinga/apiactions.cpp index a67121b53..37f22cc43 100644 --- a/lib/icinga/apiactions.cpp +++ b/lib/icinga/apiactions.cpp @@ -110,11 +110,6 @@ Dictionary::Ptr ApiActions::ProcessCheckResult(const ConfigObject::Ptr& object, checkable->ProcessCheckResult(cr); - /* Reschedule the next check. The side effect of this is that for as long - * as we receive passive results for a service we won't execute any - * active checks. */ - checkable->SetNextCheck(Utility::GetTime() + checkable->GetCheckInterval()); - return ApiActions::CreateResult(200, "Successfully processed check result for object '" + checkable->GetName() + "'."); } diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 79c690f06..c5f3b605b 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -61,7 +61,7 @@ long Checkable::GetSchedulingOffset(void) return m_SchedulingOffset; } -void Checkable::UpdateNextCheck(void) +void Checkable::UpdateNextCheck(const MessageOrigin::Ptr& origin) { double interval; @@ -76,7 +76,7 @@ void Checkable::UpdateNextCheck(void) if (interval > 1) adj = fmod(now * 100 + GetSchedulingOffset(), interval * 100) / 100.0; - SetNextCheck(now - adj + interval); + SetNextCheck(now - adj + interval, false, origin); } bool Checkable::HasBeenChecked(void) const @@ -198,13 +198,6 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig } else if (IsStateOK(old_state)) { SetStateType(StateTypeSoft); attempt = 1; // OK -> NOT-OK transition, reset the counter - - /* If there was a OK -> NOT-OK state change for actively scheduled checks, - * update the next check time using the retry_interval. - * Important: Add the cluster message origin. - */ - if (cr->GetActive()) - SetNextCheck(Utility::GetTime() + GetRetryInterval(), false, origin); } else { attempt = old_attempt; } @@ -329,6 +322,18 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig is_flapping = IsFlapping(); + if (cr->GetActive()) { + /* If there was a OK -> NOT-OK state change for actively scheduled checks, + * update the next check time using the retry_interval. + * Important: Add the cluster message origin. */ + UpdateNextCheck(origin); + } else { + /* Reschedule the next check for passive check results. The side effect of + * this is that for as long as we receive passive results for a service we + * won't execute any active checks. */ + SetNextCheck(Utility::GetTime() + GetCheckInterval(), false, origin); + } + olock.Unlock(); // Log(LogDebug, "Checkable") diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 849806420..a576f5768 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -89,7 +89,7 @@ public: long GetSchedulingOffset(void); void SetSchedulingOffset(long offset); - void UpdateNextCheck(void); + void UpdateNextCheck(const MessageOrigin::Ptr& origin = MessageOrigin::Ptr()); bool HasBeenChecked(void) const; virtual bool IsStateOK(ServiceState state) = 0; diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index a98127e1e..09eeac2a9 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -329,11 +329,6 @@ void ExternalCommandProcessor::ProcessHostCheckResult(double time, const std::ve << "Processing passive check result for host '" << arguments[0] << "'"; host->ProcessCheckResult(result); - - /* Reschedule the next check. The side effect of this is that for as long - * as we receive passive results for a service we won't execute any - * active checks. */ - host->SetNextCheck(Utility::GetTime() + host->GetCheckInterval()); } void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std::vector& arguments) @@ -366,11 +361,6 @@ void ExternalCommandProcessor::ProcessServiceCheckResult(double time, const std: << "Processing passive check result for service '" << arguments[1] << "'"; service->ProcessCheckResult(result); - - /* Reschedule the next check. The side effect of this is that for as long - * as we receive passive results for a service we won't execute any - * active checks. */ - service->SetNextCheck(Utility::GetTime() + service->GetCheckInterval()); } void ExternalCommandProcessor::ScheduleHostCheck(double, const std::vector& arguments) From e076e91706c34b3ae1d1fd3e428390919cd1c0cc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 15 Mar 2016 14:02:19 +0100 Subject: [PATCH 07/86] Only call UpdateNextCheck() for soft states refs #11336 --- 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 c5f3b605b..6a3cd178b 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -326,7 +326,8 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig /* If there was a OK -> NOT-OK state change for actively scheduled checks, * update the next check time using the retry_interval. * Important: Add the cluster message origin. */ - UpdateNextCheck(origin); + if (GetStateType() == StateTypeSoft) + UpdateNextCheck(origin); } else { /* Reschedule the next check for passive check results. The side effect of * this is that for as long as we receive passive results for a service we From 20cb2e4414422ae2bc032620e929541291b6af3a Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 17 Mar 2016 15:49:13 +0100 Subject: [PATCH 08/86] Docs: Explain how to use functions for wildcard matches for arrays and/or dictionaries ... in assign where expressions fixes #11402 From 94d6cefea6e88bffc6a3595af6af1d2f381c1880 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 17 Mar 2016 22:49:39 +0100 Subject: [PATCH 09/86] Docs: Remove the migration script chapter fixes #11407 From c92ceff1ed8679ce7f7e1efa9cb4e0a2303eeac2 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 18 Mar 2016 12:26:54 +0100 Subject: [PATCH 10/86] Add --units, --rate and --rate-multiplier support for the snmpv3 check command fixes #11194 --- doc/7-icinga-template-library.md | 3 +++ itl/command-plugins.conf | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/doc/7-icinga-template-library.md b/doc/7-icinga-template-library.md index 1aa5e3094..800918eda 100644 --- a/doc/7-icinga-template-library.md +++ b/doc/7-icinga-template-library.md @@ -944,6 +944,9 @@ snmpv3_ereg | **Optional.** Return OK state (for that OID) if extended snmpv3_eregi | **Optional.** Return OK state (for that OID) if case-insensitive extended REGEX matches. snmpv3_invert_search | **Optional.** Invert search result and return CRITICAL if found snmpv3_label | **Optional.** Prefix label for output value. +snmpv3_units | **Optional.** Units label(s) for output value (e.g., 'sec.'). +snmpv3_rate_multiplier | **Optional.** Converts rate per second. For example, set to 60 to convert to per minute. +snmpv3_rate | **Optional.** Boolean. Enable rate calculation. snmpv3_timeout | **Optional.** The command timeout in seconds. Defaults to 10 seconds. ### snmp-uptime diff --git a/itl/command-plugins.conf b/itl/command-plugins.conf index 3763b93ee..017f2f213 100644 --- a/itl/command-plugins.conf +++ b/itl/command-plugins.conf @@ -1198,6 +1198,12 @@ object CheckCommand "snmpv3" { value = "$snmpv3_label$" description = "Prefix label for output from plugin" } + "-u" = "$snmpv3_units$" + "--rate-multiplier" = "$snmpv3_rate_multiplier$" + "--rate" = { + set_if = "$snmpv3_rate$" + description = "Enable rate calculation" + } "-t" = "$snmpv3_timeout$" } From f151e1ae9e66e757bfa523f953b32a994dde86f6 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 18 Mar 2016 15:10:37 +0100 Subject: [PATCH 11/86] Add --method parameter for check_{oracle,mysql,mssql}_health CheckCommands fixes #11098 --- doc/7-icinga-template-library.md | 3 +++ itl/plugins-contrib.d/databases.conf | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/doc/7-icinga-template-library.md b/doc/7-icinga-template-library.md index 800918eda..225add6b9 100644 --- a/doc/7-icinga-template-library.md +++ b/doc/7-icinga-template-library.md @@ -1649,6 +1649,7 @@ mssql_health_password | **Optional.** The password for the database c mssql_health_warning | **Optional.** The warning threshold depending on the mode. mssql_health_critical | **Optional.** The critical threshold depending on the mode. mssql_health_mode | **Required.** The mode uses predefined keywords for the different checks. For example "connection-time", "database-free" or "sql". +mssql_health_method | **Optional.** How the plugin should connect to the database (dbi for the perl module `DBD::Sybase` (default) and `sqlrelay` for the SQLRelay proxy). mssql_health_name | **Optional.** Depending on the mode this could be the database name or a SQL statement. mssql_health_name2 | **Optional.** If "mssql_health_name" is a sql statement, "mssql_health_name2" can be used to appear in the output and the performance data. mssql_health_regexp | **Optional.** If set to true, "mssql_health_name" will be interpreted as a regular expression. Defaults to false. @@ -1674,6 +1675,7 @@ mysql_health_database | **Optional.** The database to connect to. Def mysql_health_warning | **Optional.** The warning threshold depending on the mode. mysql_health_critical | **Optional.** The critical threshold depending on the mode. mysql_health_mode | **Required.** The mode uses predefined keywords for the different checks. For example "connection-time", "slave-lag" or "sql". +mysql_health_method | **Optional.** How the plugin should connect to the database (`dbi` for using DBD::Mysql (default), `mysql` for using the mysql-Tool). mysql_health_name | **Optional.** The SQL statement to be executed with "mysql_health_mode" sql. mysql_health_name2 | **Optional.** If "mysql_health_name" is a sql statement, "mysql_health_name2" can be used to appear in the output and the performance data. mysql_health_units | **Optional.** This is used for a better output of mode=sql and for specifying thresholds for mode=tablespace-free. Possible values are "%", "KB", "MB" and "GB". @@ -1694,6 +1696,7 @@ oracle_health_password | **Optional.** The password for the database c oracle_health_warning | **Optional.** The warning threshold depending on the mode. oracle_health_critical | **Optional.** The critical threshold depending on the mode. oracle_health_mode | **Required.** The mode uses predefined keywords for the different checks. For example "connection-time", "flash-recovery-area-usage" or "sql". +oracle_health_method | **Optional.** How the plugin should connect to the database (`dbi` for using DBD::Oracle (default), `sqlplus` for using the sqlplus-Tool). oracle_health_name | **Optional.** The tablespace, datafile, wait event, latch, enqueue depending on the mode or SQL statement to be executed with "oracle_health_mode" sql. oracle_health_name2 | **Optional.** If "oracle_health_name" is a sql statement, "oracle_health_name2" can be used to appear in the output and the performance data. oracle_health_regexp | **Optional.** If set to true, "oracle_health_name" will be interpreted as a regular expression. Defaults to false. diff --git a/itl/plugins-contrib.d/databases.conf b/itl/plugins-contrib.d/databases.conf index adf9a14a9..b80ee42d4 100644 --- a/itl/plugins-contrib.d/databases.conf +++ b/itl/plugins-contrib.d/databases.conf @@ -59,6 +59,10 @@ object CheckCommand "mssql_health" { value = "$mssql_health_mode$" description = "the mode of the plugin" } + "--method" = { + value = "$mssql_health_method$" + description = "how the plugin should connect to the database (dbi for using DBD::Sybase (default), sqlrelay for the SQLRelay proxy)" + } "--name" = { value = "$mssql_health_name$" description = "the name of the database etc depending on the mode" @@ -133,6 +137,10 @@ object CheckCommand "mysql_health" { value = "$mysql_health_mode$" description = "the mode of the plugin" } + "--method" = { + value = "$mysql_health_method$" + description = "how the plugin should connect to the database (dbi for using DBD::mysql (default), mysql for using the mysql-Tool)" + } "--name" = { value = "$mysql_health_name$" description = "currently only used for sql statements" @@ -184,6 +192,10 @@ object CheckCommand "oracle_health" { value = "$oracle_health_mode$" description = "the mode of the plugin" } + "--method" = { + value = "$oracle_health_method$" + description = "how the plugin should connect to the database (dbi for using DBD::Oracle (default), sqlplus for using the sqlplus-Tool)" + } "--name" = { value = "$oracle_health_name$" description = "the name of the tablespace, datafile, wait event, latch, enqueue, or sql statement depending on the mode" From 97f324ad3ece45bb5c8c432c55bda64c2211bcfa Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 22 Mar 2016 08:21:44 +0100 Subject: [PATCH 12/86] Follow symlinks in Utility::GlobRecursive fixes #11347 --- lib/base/utility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index b139ce7b0..2cf581fe0 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -661,7 +661,7 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const boo struct stat statbuf; - if (lstat(cpath.CStr(), &statbuf) < 0) + if (stat(cpath.CStr(), &statbuf) < 0) continue; if (S_ISDIR(statbuf.st_mode)) From ba3eeafb5a4f908c7a991877688f2893b3d4f395 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 23 Mar 2016 08:40:32 +0100 Subject: [PATCH 13/86] Implement recursion limit for AST expressions which don't use a separate stack frame fixes #11106 --- lib/base/scriptframe.cpp | 23 +++++++++++++++++++---- lib/base/scriptframe.hpp | 4 ++++ lib/config/expression.cpp | 11 ++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lib/base/scriptframe.cpp b/lib/base/scriptframe.cpp index 11841a153..c9aec385c 100644 --- a/lib/base/scriptframe.cpp +++ b/lib/base/scriptframe.cpp @@ -26,13 +26,13 @@ using namespace icinga; boost::thread_specific_ptr > ScriptFrame::m_ScriptFrames; ScriptFrame::ScriptFrame(void) - : Locals(new Dictionary()), Self(ScriptGlobal::GetGlobals()), Sandboxed(false) + : Locals(new Dictionary()), Self(ScriptGlobal::GetGlobals()), Sandboxed(false), Depth(0) { PushFrame(this); } ScriptFrame::ScriptFrame(const Value& self) - : Locals(new Dictionary()), Self(self), Sandboxed(false) + : Locals(new Dictionary()), Self(self), Sandboxed(false), Depth(0) { PushFrame(this); } @@ -43,6 +43,19 @@ ScriptFrame::~ScriptFrame(void) ASSERT(frame == this); } +void ScriptFrame::IncreaseStackDepth(void) +{ + if (Depth + 1 > 300) + BOOST_THROW_EXCEPTION(ScriptError("Stack overflow while evaluating expression: Recursion level too deep.")); + + Depth++; +} + +void ScriptFrame::DecreaseStackDepth(void) +{ + Depth--; +} + ScriptFrame *ScriptFrame::GetCurrentFrame(void) { std::stack *frames = m_ScriptFrames.get(); @@ -72,8 +85,10 @@ void ScriptFrame::PushFrame(ScriptFrame *frame) m_ScriptFrames.reset(frames); } - if (frames->size() > 500) - BOOST_THROW_EXCEPTION(ScriptError("Recursion level too deep.")); + if (!frames->empty()) { + ScriptFrame *parent = frames->top(); + frame->Depth += parent->Depth; + } frames->push(frame); } diff --git a/lib/base/scriptframe.hpp b/lib/base/scriptframe.hpp index c80f4776e..edb4413a6 100644 --- a/lib/base/scriptframe.hpp +++ b/lib/base/scriptframe.hpp @@ -33,11 +33,15 @@ struct I2_BASE_API ScriptFrame Dictionary::Ptr Locals; Value Self; bool Sandboxed; + int Depth; ScriptFrame(void); ScriptFrame(const Value& self); ~ScriptFrame(void); + void IncreaseStackDepth(void); + void DecreaseStackDepth(void); + static ScriptFrame *GetCurrentFrame(void); private: diff --git a/lib/config/expression.cpp b/lib/config/expression.cpp index 76b97d19e..c87e6d1d8 100644 --- a/lib/config/expression.cpp +++ b/lib/config/expression.cpp @@ -61,14 +61,23 @@ ExpressionResult Expression::Evaluate(ScriptFrame& frame, DebugHint *dhint) cons << "Executing:\n" << msgbuf.str();*/ #endif /* I2_DEBUG */ - return DoEvaluate(frame, dhint); + frame.IncreaseStackDepth(); + ExpressionResult result = DoEvaluate(frame, dhint); + frame.DecreaseStackDepth(); + return result; } catch (ScriptError& ex) { + frame.DecreaseStackDepth(); + ScriptBreakpoint(frame, &ex, GetDebugInfo()); throw; } catch (const std::exception& ex) { + frame.DecreaseStackDepth(); + BOOST_THROW_EXCEPTION(ScriptError("Error while evaluating expression: " + String(ex.what()), GetDebugInfo()) << boost::errinfo_nested_exception(boost::current_exception())); } + + frame.DecreaseStackDepth(); } bool Expression::GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const From b7ee26fa781dd5d5ce2915fd7cf2ceef209e3c91 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 23 Mar 2016 09:29:27 +0100 Subject: [PATCH 14/86] Don't use semi-colons in auto-generated config files fixes #11438 --- 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 b096b2490..2bfe8085d 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -628,7 +628,7 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec ConfigWriter::EmitIdentifier(fp, kv.first, true); fp << " = "; ConfigWriter::EmitValue(fp, 1, kv.second); - fp << ";\n"; + fp << "\n"; } fp << "}\n\n"; From a0536c2fc80f30408dc36179d714727c08a2abd0 Mon Sep 17 00:00:00 2001 From: Thomas Widhalm Date: Tue, 22 Mar 2016 23:19:40 +0100 Subject: [PATCH 15/86] Add silent installation, reference to NSClient++ and some extra information to the Windows Agent documentation fixes #11437 Signed-off-by: Gunnar Beutner --- doc/11-icinga2-client.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/11-icinga2-client.md b/doc/11-icinga2-client.md index f9bae266d..ca07c9829 100644 --- a/doc/11-icinga2-client.md +++ b/doc/11-icinga2-client.md @@ -421,7 +421,13 @@ Requirements: * Windows Vista/Server 2008 or higher * [Microsoft .NET Framework 2.0](http://www.microsoft.com/de-de/download/details.aspx?id=1639) if not already installed. -The setup wizard will install Icinga 2 and then continue with SSL certificate generation, +The installer package includes the [NSClient++](http://www.nsclient.org/) so Icinga 2 can use its built-in plugins. You can use [predefined commands from the ITL](7-icinga-template-library.md#nscp-plugin-check-commands) for these plugins. + +If you want to install the Client silently / unattended use the `/S` modifier. Using `/D` allows for changing the location where the Client will be installed. + + C:> Icinga2-v2.4.4.exe /S /D=D:\tools\monitoring + +After the installation you can run Icinga 2 from the Start menu. (The graphical installer will offer to run Icinga 2 right after the installation) On the first start Icinga 2 will show you the setup wizard which will help you with SSL certificate generation, CSR-Autosigning and configuration setup. You'll need the following configuration details: @@ -434,7 +440,9 @@ You'll need the following configuration details: for CSR Auto-Signing * Bind host/port for the Api feature (optional) -Once install is done, Icinga 2 is automatically started as a Windows service. +Besides the configuration changes, the setup wizard offers you to install the included NSClient++ package. + +Once install and configuration is done, Icinga 2 is automatically started as a Windows service. Running Icinga 2 again from the Start menu will allow you to change the settings from the the first setup wizard run. Please keep in mind that you can change all those settings within the configuration file and on the commandline. The Icinga 2 configuration is located inside the installation path and can be edited with your favorite editor. From e8f1bce11bd1fe59e662b8af5dbdae4353148ca2 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 23 Mar 2016 10:12:05 +0100 Subject: [PATCH 16/86] Update .mailmap refs #11437 --- .mailmap | 1 + 1 file changed, 1 insertion(+) diff --git a/.mailmap b/.mailmap index d5e641cd9..1502f2442 100644 --- a/.mailmap +++ b/.mailmap @@ -9,3 +9,4 @@ Dolf Schimmel Markus Waldmüller Claudio Kuenzler + From 582575b693ca301f024a2fe8e9aa99a4e4cfbf39 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 23 Mar 2016 13:09:08 +0100 Subject: [PATCH 17/86] Docs: Fix broken formatting in cluster manual SSL generation fixes #11440 --- doc/13-distributed-monitoring-ha.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/doc/13-distributed-monitoring-ha.md b/doc/13-distributed-monitoring-ha.md index 8a8348dd1..2f301ce7e 100644 --- a/doc/13-distributed-monitoring-ha.md +++ b/doc/13-distributed-monitoring-ha.md @@ -50,18 +50,14 @@ Decide whether to use the built-in [configuration syncronization](13-distributed Icinga 2 provides [CLI commands](8-cli-commands.md#cli-command-pki) assisting with CA and node certificate creation for your Icinga 2 distributed setup. -> **Tip** -> -> You can also use the master and client setup wizards to install the cluster nodes -> using CSR-Autosigning. -> -> The manual steps are helpful if you want to use your own and/or existing CA (for example -> Puppet CA). +You can also use the master and client setup wizards to install the cluster nodes +using CSR-Autosigning. -> **Note** -> -> You're free to use your own method to generated a valid ca and signed client -> certificates. +The manual steps are helpful if you want to use your own and/or existing CA (for example +Puppet CA). + +You're free to use your own method to generated a valid ca and signed client +certificates. The first step is the creation of the certificate authority (CA) by running the following command: From 1b69a7ff70c7d48aa58a242dbf4e2784462ddd09 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 23 Mar 2016 13:42:00 +0100 Subject: [PATCH 18/86] DB IDO: Fix that downtime is not in effect after restart fixes #10843 --- lib/db_ido/dbevents.cpp | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index e621ea8e5..3b34974a3 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -505,8 +505,9 @@ void DbEvents::AddDowntimeInternal(std::vector& queries, const Downtime fields1->Set("duration", downtime->GetDuration()); fields1->Set("scheduled_start_time", DbValue::FromTimestamp(downtime->GetStartTime())); fields1->Set("scheduled_end_time", DbValue::FromTimestamp(downtime->GetEndTime())); - fields1->Set("was_started", 0); - fields1->Set("is_in_effect", 0); + fields1->Set("was_started", ((downtime->GetStartTime() <= Utility::GetTime()) ? 1 : 0)); + fields1->Set("is_in_effect", (downtime->IsActive() ? 1 : 0)); + fields1->Set("trigger_time", DbValue::FromTimestamp(downtime->GetTriggerTime())); fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */ String node = IcingaApplication::GetInstance()->GetNodeName(); @@ -527,6 +528,39 @@ void DbEvents::AddDowntimeInternal(std::vector& queries, const Downtime query1.Fields = fields1; queries.push_back(query1); + + /* host/service status */ + if (!historical) { + Host::Ptr host; + Service::Ptr service; + tie(host, service) = GetHostService(checkable); + + DbQuery query2; + if (service) + query2.Table = "servicestatus"; + else + query2.Table = "hoststatus"; + + query2.Type = DbQueryUpdate; + query2.Category = DbCatState; + query2.StatusUpdate = true; + query2.Object = DbObject::GetOrCreateByObject(checkable); + + Dictionary::Ptr fields2 = new Dictionary(); + fields2->Set("scheduled_downtime_depth", checkable->GetDowntimeDepth()); + + query2.Fields = fields2; + + query2.WhereCriteria = new Dictionary(); + if (service) + query2.WhereCriteria->Set("service_object_id", service); + else + query2.WhereCriteria->Set("host_object_id", host); + + query2.WhereCriteria->Set("instance_id", 0); /* DbConnection class fills in real ID */ + + queries.push_back(query2); + } } void DbEvents::RemoveDowntime(const Downtime::Ptr& downtime) @@ -564,6 +598,7 @@ void DbEvents::RemoveDowntimeInternal(std::vector& queries, const Downt fields3->Set("was_cancelled", downtime->GetWasCancelled() ? 1 : 0); fields3->Set("actual_end_time", DbValue::FromTimestamp(time_bag.first)); fields3->Set("actual_end_time_usec", time_bag.second); + fields3->Set("is_in_effect", 0); query3.Fields = fields3; query3.WhereCriteria = new Dictionary(); @@ -623,7 +658,7 @@ void DbEvents::TriggerDowntime(const Downtime::Ptr& downtime) fields1->Set("was_started", 1); fields1->Set("actual_start_time", DbValue::FromTimestamp(time_bag.first)); fields1->Set("actual_start_time_usec", time_bag.second); - fields1->Set("is_in_effect", 1); + fields1->Set("is_in_effect", (downtime->IsActive() ? 1 : 0)); fields1->Set("trigger_time", DbValue::FromTimestamp(downtime->GetTriggerTime())); fields1->Set("instance_id", 0); /* DbConnection class fills in real ID */ From 521580f76eb1f2461ef045f4295230eace00d459 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Wed, 23 Mar 2016 14:03:44 +0100 Subject: [PATCH 19/86] Ensure that the legacy_id attribute for comment/downtime objects is restored on restart This has been changed when moving comments/downtimes to config objects in 050c520b2a3df0477f2eec71ec2d874b6dd36aa5 It may cause trouble with DB IDO DELETE and UPDATE statements depending on the old value. refs #11382 --- lib/icinga/comment.ti | 2 +- lib/icinga/downtime.ti | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icinga/comment.ti b/lib/icinga/comment.ti index 8e76a8b3d..8ac497aac 100644 --- a/lib/icinga/comment.ti +++ b/lib/icinga/comment.ti @@ -88,7 +88,7 @@ class Comment : ConfigObject < CommentNameComposer [config, required] String author; [config, required] String text; [config] double expire_time; - int legacy_id; + [state] int legacy_id; }; } diff --git a/lib/icinga/downtime.ti b/lib/icinga/downtime.ti index 774cc1d26..d5a16988a 100644 --- a/lib/icinga/downtime.ti +++ b/lib/icinga/downtime.ti @@ -81,7 +81,7 @@ class Downtime : ConfigObject < DowntimeNameComposer [state] Array::Ptr triggers { default {{{ return new Array(); }}} }; - int legacy_id; + [state] int legacy_id; [state] bool was_cancelled; [config] String config_owner; }; From 13c4bb06b839f30f0c18290c72551c333cc18692 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 24 Mar 2016 09:15:09 +0100 Subject: [PATCH 20/86] Improve validation for arrays fixes #11434 --- lib/config/configitem.cpp | 34 ++++++------ lib/icinga/user.cpp | 2 + tools/mkclass/classcompiler.cpp | 95 ++++++++++++++++++++------------- 3 files changed, 76 insertions(+), 55 deletions(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 8a14de5aa..83d40810b 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -226,6 +226,23 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) dobj->SetName(name); + Dictionary::Ptr dhint = debugHints.ToDictionary(); + + try { + DefaultValidationUtils utils; + dobj->Validate(FAConfig, utils); + } catch (ValidationError& ex) { + if (m_IgnoreOnError) { + Log(LogWarning, "ConfigObject") + << "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex); + + return ConfigObject::Ptr(); + } + + ex.SetDebugHint(dhint); + throw; + } + try { dobj->OnConfigLoaded(); } catch (const std::exception& ex) { @@ -244,8 +261,6 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) persistentItem->Set("type", GetType()); persistentItem->Set("name", GetName()); persistentItem->Set("properties", Serialize(dobj, FAConfig)); - - Dictionary::Ptr dhint = debugHints.ToDictionary(); persistentItem->Set("debug_hints", dhint); Array::Ptr di = new Array(); @@ -256,21 +271,6 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) di->Add(m_DebugInfo.LastColumn); persistentItem->Set("debug_info", di); - try { - DefaultValidationUtils utils; - dobj->Validate(FAConfig, utils); - } catch (ValidationError& ex) { - if (m_IgnoreOnError) { - Log(LogWarning, "ConfigObject") - << "Ignoring config object '" << m_Name << "' of type '" << m_Type << "' due to errors: " << DiagnosticInformation(ex); - - return ConfigObject::Ptr(); - } - - ex.SetDebugHint(dhint); - throw; - } - ConfigCompilerContext::GetInstance()->WriteObject(persistentItem); persistentItem.reset(); diff --git a/lib/icinga/user.cpp b/lib/icinga/user.cpp index f4e35d023..eb232fc84 100644 --- a/lib/icinga/user.cpp +++ b/lib/icinga/user.cpp @@ -111,6 +111,8 @@ void User::ValidateStates(const Array::Ptr& value, const ValidationUtils& utils) void User::ValidateTypes(const Array::Ptr& value, const ValidationUtils& utils) { + ObjectImpl::ValidateTypes(value, utils); + int tfilter = FilterArrayToInt(value, 0); if ((tfilter & ~(1 << NotificationDowntimeStart | 1 << NotificationDowntimeEnd | 1 << NotificationDowntimeRemoved | diff --git a/tools/mkclass/classcompiler.cpp b/tools/mkclass/classcompiler.cpp index 9914f0d3e..d0aab97a9 100644 --- a/tools/mkclass/classcompiler.cpp +++ b/tools/mkclass/classcompiler.cpp @@ -158,6 +158,33 @@ static bool FieldTypeCmp(const Field& a, const Field& b) return a.Type.GetRealType() < b.Type.GetRealType(); } +static std::string FieldTypeToIcingaName(const Field& field, bool inner) +{ + std::string ftype = field.Type.TypeName; + + if (!inner && field.Type.ArrayRank > 0) + return "Array"; + + if (field.Type.IsName) + return "String"; + + if (field.Attributes & FAEnum) + return "Number"; + + if (ftype == "bool" || ftype == "int" || ftype == "double") + return "Number"; + + if (ftype == "int" || ftype == "double") + return "Number"; + else if (ftype == "bool") + return "Boolean"; + + if (ftype.find("::Ptr") != std::string::npos) + return ftype.substr(0, ftype.size() - strlen("::Ptr")); + + return ftype; +} + void ClassCompiler::OptimizeStructLayout(std::vector& fields) { std::sort(fields.begin(), fields.end(), FieldTypeCmp); @@ -342,21 +369,7 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&) size_t num = 0; for (it = klass.Fields.begin(); it != klass.Fields.end(); it++) { - std::string ftype = it->Type.GetRealType(); - - if (ftype == "bool" || ftype == "int" || ftype == "double") - ftype = "Number"; - - if (ftype == "int" || ftype == "double") - ftype = "Number"; - else if (ftype == "bool") - ftype = "Boolean"; - - if (ftype.find("::Ptr") != std::string::npos) - ftype = ftype.substr(0, ftype.size() - strlen("::Ptr")); - - if (it->Attributes & FAEnum) - ftype = "Number"; + std::string ftype = FieldTypeToIcingaName(*it, false); std::string nameref; @@ -487,33 +500,39 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&) const Field& field = *it; - if ((field.Attributes & (FARequired)) || field.Type.IsName) { - if (field.Attributes & FARequired) { - if (field.Type.GetRealType().find("::Ptr") != std::string::npos) - m_Impl << "\t" << "if (!value)" << std::endl; - else - m_Impl << "\t" << "if (value.IsEmpty())" << std::endl; + if (field.Attributes & FARequired) { + if (field.Type.GetRealType().find("::Ptr") != std::string::npos) + m_Impl << "\t" << "if (!value)" << std::endl; + else + m_Impl << "\t" << "if (value.IsEmpty())" << std::endl; - m_Impl << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast(this), boost::assign::list_of(\"" << field.Name << "\"), \"Attribute must not be empty.\"));" << std::endl << std::endl; - } + m_Impl << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast(this), boost::assign::list_of(\"" << field.Name << "\"), \"Attribute must not be empty.\"));" << std::endl << std::endl; + } - if (field.Type.IsName) { - if (field.Type.ArrayRank > 0) { - m_Impl << "\t" << "if (value) {" << std::endl - << "\t\t" << "ObjectLock olock(value);" << std::endl - << "\t\t" << "BOOST_FOREACH(const String& ref, value) {" << std::endl; - } else - m_Impl << "\t" << "String ref = value;" << std::endl; + if (field.Type.ArrayRank > 0) { + m_Impl << "\t" << "if (value) {" << std::endl + << "\t\t" << "ObjectLock olock(value);" << std::endl + << "\t\t" << "BOOST_FOREACH(const Value& avalue, value) {" << std::endl; + } else + m_Impl << "\t" << "Value avalue = value;" << std::endl; - m_Impl << "\t" << "if (!ref.IsEmpty() && !utils.ValidateName(\"" << field.Type.TypeName << "\", ref))" << std::endl - << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast(this), boost::assign::list_of(\"" << field.Name << "\"), \"Object '\" + ref + \"' of type '" << field.Type.TypeName - << "' does not exist.\"));" << std::endl; + std::string ftype = FieldTypeToIcingaName(field, true); - if (field.Type.ArrayRank > 0) { - m_Impl << "\t\t" << "}" << std::endl - << "\t" << "}" << std::endl; - } - } + if (field.Type.IsName) { + m_Impl << "\t" << "if (!avalue.IsEmpty() && !utils.ValidateName(\"" << field.Type.TypeName << "\", avalue))" << std::endl + << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast(this), boost::assign::list_of(\"" << field.Name << "\"), \"Object '\" + avalue + \"' of type '" << field.Type.TypeName + << "' does not exist.\"));" << std::endl; + } else if (field.Type.ArrayRank > 0 && (ftype == "Number" || ftype == "Boolean")) { + m_Impl << "\t" << "try {" << std::endl + << "\t\t" << "Convert::ToDouble(avalue);" << std::endl + << "\t" << "} catch (const std::invalid_argument&) {" << std::endl + << "\t\t" << "BOOST_THROW_EXCEPTION(ValidationError(dynamic_cast(this), boost::assign::list_of(\"" << field.Name << "\"), \"Array element '\" + avalue + \"' of type '\" + avalue.GetReflectionType()->GetName() + \"' is not valid here; expected type '" << ftype << "'.\"));" << std::endl + << "\t" << "}" << std::endl; + } + + if (field.Type.ArrayRank > 0) { + m_Impl << "\t\t" << "}" << std::endl + << "\t" << "}" << std::endl; } m_Impl << "}" << std::endl << std::endl; From 23d445578a23cf20f92fa1ebfd49b1297840b88e Mon Sep 17 00:00:00 2001 From: Assaf Flatto Date: Wed, 23 Mar 2016 12:16:38 +0200 Subject: [PATCH 21/86] Update Centos/Redhat/Fedora installation instructions Old Docs gave wrong details on how to install Icinga 2. fixes #11439 Signed-off-by: Gunnar Beutner --- doc/2-getting-started.md | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/doc/2-getting-started.md b/doc/2-getting-started.md index 8a78dac92..bf92efd21 100644 --- a/doc/2-getting-started.md +++ b/doc/2-getting-started.md @@ -40,22 +40,34 @@ Ubuntu (PPA): # add-apt-repository ppa:formorer/icinga # apt-get update -RHEL/CentOS: +RHEL/CentOS 7: - # rpm --import http://packages.icinga.org/icinga.key - # curl -o /etc/yum.repos.d/ICINGA-release.repo http://packages.icinga.org/epel/ICINGA-release.repo - # yum makecache + yum install https://packages.icinga.org/epel/7/release/noarch/icinga-rpm-release-7-1.el7.centos.noarch.rpm + +RHEL/CentOS 6: + + yum install https://packages.icinga.org/epel/6/release/noarch/icinga-rpm-release-6-1.el6.noarch.rpm + +RHEL/CentOS 5: + + rpm -i http://packages.icinga.org/epel/5/release/noarch/icinga-rpm-release-5-1.el5.centos.noarch.rpm The packages for RHEL/CentOS depend on other packages which are distributed as part of the [EPEL repository](http://fedoraproject.org/wiki/EPEL). Please make sure to enable this repository by following [these instructions](http://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F). -Fedora: +Fedora 23: - # rpm --import http://packages.icinga.org/icinga.key - # curl -o /etc/yum.repos.d/ICINGA-release.repo http://packages.icinga.org/fedora/ICINGA-release.repo - # yum makecache + dnf install https://packages.icinga.org/fedora/23/release/noarch/icinga-rpm-release-23-1.fc23.noarch.rpm + +Fedora 22: + + dnf install https://packages.icinga.org/fedora/22/release/noarch/icinga-rpm-release-22-1.fc22.noarch.rpm + +Fedora 21: + + yum install http://packages.icinga.org/fedora/21/release/noarch/icinga-rpm-release-21-1.fc21.noarch.rpm SLES 11: From 9c6b070900016b56751753517dfa75fb5798c5e8 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 24 Mar 2016 14:51:03 +0100 Subject: [PATCH 22/86] Update AUTHORS refs #11439 --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index d8ec272b8..66609dfe8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,6 +6,7 @@ Alexander Wirt Andres Ivanov Andrew Meyer Arnd Hannemann +Assaf Flatto Bastian Guse Benedikt Heine Bernd Erk From eb53677e54e70ac28832cde0af4a057b8e621ff6 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 24 Mar 2016 15:07:56 +0100 Subject: [PATCH 23/86] Update .mailmap for Assaf Flatto refs #11439 --- .mailmap | 1 + AUTHORS | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.mailmap b/.mailmap index 1502f2442..1fde5f02e 100644 --- a/.mailmap +++ b/.mailmap @@ -10,3 +10,4 @@ Markus Waldmüller Claudio Kuenzler + diff --git a/AUTHORS b/AUTHORS index 66609dfe8..057082b7f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -6,7 +6,7 @@ Alexander Wirt Andres Ivanov Andrew Meyer Arnd Hannemann -Assaf Flatto +Assaf Flatto Bastian Guse Benedikt Heine Bernd Erk From 3c788f38999ab9a3f058dfdec3c79be483f188d6 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Mar 2016 07:54:41 +0200 Subject: [PATCH 24/86] Build fix for Win64 refs #11462 --- lib/base/objectlock.hpp | 4 ++-- lib/base/string-script.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/base/objectlock.hpp b/lib/base/objectlock.hpp index 2ef73ecf6..ea2e05484 100644 --- a/lib/base/objectlock.hpp +++ b/lib/base/objectlock.hpp @@ -62,7 +62,7 @@ public: #ifdef _WIN32 # ifdef _WIN64 - while (InterlockedCompareExchange64(&object->m_Mutex, I2MUTEX_LOCKED, I2MUTEX_UNLOCKED) != I2MUTEX_UNLOCKED) { + while (InterlockedCompareExchange64((LONGLONG *)&object->m_Mutex, I2MUTEX_LOCKED, I2MUTEX_UNLOCKED) != I2MUTEX_UNLOCKED) { # else /* _WIN64 */ while (InterlockedCompareExchange(&object->m_Mutex, I2MUTEX_LOCKED, I2MUTEX_UNLOCKED) != I2MUTEX_UNLOCKED) { # endif /* _WIN64 */ @@ -84,7 +84,7 @@ public: mtx->lock(); #ifdef _WIN32 # ifdef _WIN64 - InterlockedCompareExchange64(&object->m_Mutex, reinterpret_cast(mtx), I2MUTEX_LOCKED); + InterlockedCompareExchange64((LONGLONG *)&object->m_Mutex, reinterpret_cast(mtx), I2MUTEX_LOCKED); # else /* _WIN64 */ InterlockedCompareExchange(&object->m_Mutex, reinterpret_cast(mtx), I2MUTEX_LOCKED); # endif /* _WIN64 */ diff --git a/lib/base/string-script.cpp b/lib/base/string-script.cpp index 83aef1b19..7ea1c91ab 100644 --- a/lib/base/string-script.cpp +++ b/lib/base/string-script.cpp @@ -86,7 +86,7 @@ static Array::Ptr StringSplit(const String& delims) return result; } -static Value StringFind(const std::vector& args) +static int StringFind(const std::vector& args) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); String self = vframe->Self; From 94deb03e9c7e7aeae940109fe05d51ea3ed762fe Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Mar 2016 08:42:02 +0200 Subject: [PATCH 25/86] Another build fix for Win64 refs #11462 --- lib/base/value.hpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/base/value.hpp b/lib/base/value.hpp index 561283065..df904ce22 100644 --- a/lib/base/value.hpp +++ b/lib/base/value.hpp @@ -69,6 +69,14 @@ public: : m_Value(double(value)) { } + inline Value(long long value) + : m_Value(double(value)) + { } + + inline Value(unsigned long long value) + : m_Value(double(value)) + { } + inline Value(double value) : m_Value(value) { } From e314bc1ad5798119350119c80f0ef0070f3c159d Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Mar 2016 08:45:46 +0200 Subject: [PATCH 26/86] Add /bigobj compiler option for Windows refs #11462 --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c81fa2af9..bf5379f0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ endif() if(WIN32) set(Boost_USE_STATIC_LIBS ON) add_definitions(-DBOOST_ALL_NO_LIB) + add_definitions(/bigobj) endif() find_package(Boost ${BOOST_MIN_VERSION} COMPONENTS thread system program_options regex REQUIRED) From 0d2ae5ce92e4f99a8c72823866b7ddb46248ef7d Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Mar 2016 09:43:40 +0200 Subject: [PATCH 27/86] Fix Utility::MkDirP on Windows fixes #11455 --- lib/base/utility.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 2cf581fe0..dfb0614db 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -726,7 +726,11 @@ void Utility::MkDirP(const String& path, int mode) #else /*_ WIN32 */ pos = path.FindFirstOf("/\\", pos + 1); #endif /* _WIN32 */ - MkDir(path.SubStr(0, pos), mode); + + String spath = path.SubStr(0, pos + 1); + struct stat statbuf; + if (stat(spath.CStr(), &statbuf) < 0 && errno == ENOENT) + MkDir(path.SubStr(0, pos), mode); } } From d0b5898c469fafb5274977c70e499eaee174e4c9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 29 Mar 2016 12:09:51 +0200 Subject: [PATCH 28/86] Fix: Downtimes/Comments not being synced to child zones fixes #11227 --- lib/icinga/comment.cpp | 5 +++++ lib/icinga/downtime.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/lib/icinga/comment.cpp b/lib/icinga/comment.cpp index bbdeb2eee..b411a4143 100644 --- a/lib/icinga/comment.cpp +++ b/lib/icinga/comment.cpp @@ -175,6 +175,11 @@ String Comment::AddComment(const Checkable::Ptr& checkable, CommentType entryTyp if (service) attrs->Set("service_name", service->GetShortName()); + String zone = checkable->GetZoneName(); + + if (!zone.IsEmpty()) + attrs->Set("zone", zone); + String config = ConfigObjectUtility::CreateObjectConfig(Comment::TypeInstance, fullName, true, Array::Ptr(), attrs); Array::Ptr errors = new Array(); diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index b7b17f0e4..d7668f795 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -223,6 +223,11 @@ String Downtime::AddDowntime(const Checkable::Ptr& checkable, const String& auth if (service) attrs->Set("service_name", service->GetShortName()); + String zone = checkable->GetZoneName(); + + if (!zone.IsEmpty()) + attrs->Set("zone", zone); + String config = ConfigObjectUtility::CreateObjectConfig(Downtime::TypeInstance, fullName, true, Array::Ptr(), attrs); Array::Ptr errors = new Array(); From 98eef3339974d10d2d2422df296179308437b4f9 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 29 Mar 2016 13:49:38 +0200 Subject: [PATCH 29/86] Fix socket exceptions while querying the API fixes #11224 --- lib/base/tlsstream.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/base/tlsstream.cpp b/lib/base/tlsstream.cpp index f1248eee7..93a7501a5 100644 --- a/lib/base/tlsstream.cpp +++ b/lib/base/tlsstream.cpp @@ -245,7 +245,9 @@ void TlsStream::OnEvent(int revents) } if (m_Shutdown && !m_SendQ->IsDataAvailable()) { - lock.unlock(); + if (!success) + lock.unlock(); + Close(); } } From 45786e2b81224f1308c299f5dd9b22261acf8655 Mon Sep 17 00:00:00 2001 From: Louis Sautier Date: Sat, 26 Mar 2016 14:41:58 +0100 Subject: [PATCH 30/86] Re-add the 'su' directive to logrotate if supported - try to detect a recent logrotate version which supports the 'su' directive (added in 3.8.0, see https://github.com/logrotate/logrotate/commit/5be96cf1822496f80227e9a446281c3fa42e7b67#diff-e4eb329834da3d36278b1b7d943b3bc9R6) - if logrotate can't be found, assume an old version is used - allow the parameter to be forced by the user fixes #9249 Signed-off-by: Gunnar Beutner --- CMakeLists.txt | 16 ++++++++++++++++ etc/logrotate.d/icinga2.cmake | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf5379f0f..97ccd5533 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,22 @@ if(WIN32) add_definitions(/bigobj) endif() +if(NOT DEFINED LOGROTATE_HAS_SU) + set(LOGROTATE_HAS_SU OFF) + execute_process(COMMAND "/usr/sbin/logrotate" ERROR_VARIABLE LOGROTATE_OUTPUT) + if(LOGROTATE_OUTPUT) + string(REGEX REPLACE "^logrotate ([0-9.]*).*" "\\1" LOGROTATE_VERSION + ${LOGROTATE_OUTPUT}) + message(STATUS "Found logrotate (found version \"${LOGROTATE_VERSION}\")") + if("${LOGROTATE_VERSION}" VERSION_GREATER "3.7.9") + set(LOGROTATE_HAS_SU ON) + endif() + endif() +endif() +if(LOGROTATE_HAS_SU) + set(LOGROTATE_USE_SU "\n\tsu ${ICINGA2_USER} ${ICINGA2_GROUP}") +endif() + find_package(Boost ${BOOST_MIN_VERSION} COMPONENTS thread system program_options regex REQUIRED) link_directories(${Boost_LIBRARY_DIRS}) diff --git a/etc/logrotate.d/icinga2.cmake b/etc/logrotate.d/icinga2.cmake index d96fd7a09..91d8d23d3 100644 --- a/etc/logrotate.d/icinga2.cmake +++ b/etc/logrotate.d/icinga2.cmake @@ -1,6 +1,6 @@ @CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/icinga2.log @CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/debug.log { daily - rotate 7 + rotate 7@LOGROTATE_USE_SU@ compress delaycompress missingok @@ -13,7 +13,7 @@ @CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log { daily - rotate 90 + rotate 90@LOGROTATE_USE_SU@ compress delaycompress missingok From 0cbedf495a49ed4d8c123313b1f1aaa685cd2e33 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 21 Mar 2016 13:37:32 +0100 Subject: [PATCH 31/86] IDO: Ensure that the notification insert id is passed to contactnotification inserts We cannot add the notification insert id directly to the following contactnotifications queries. Instead we need to pass a DbValue reference which gets set after the notification insert id is calculated. The contactnotifications insert queries are fired as query group calling CanExecuteQuery() and FieldToEscapedString(). If the notification id does not exist yet, the queries are moved to the end of the queue. Once the contactnotifications queries are fired the DbValue reference is destroyed. This patch also removes the old notification insert id cache which was broken in many ways. fixes #11387 --- lib/db_ido/dbconnection.cpp | 21 --------------------- lib/db_ido/dbconnection.hpp | 4 ---- lib/db_ido/dbevents.cpp | 20 +++++++++++--------- lib/db_ido/dbquery.hpp | 3 ++- lib/db_ido/dbvalue.cpp | 5 +++++ lib/db_ido/dbvalue.hpp | 4 +++- lib/db_ido_mysql/idomysqlconnection.cpp | 23 ++++++++++------------- lib/db_ido_pgsql/idopgsqlconnection.cpp | 25 +++++++++++-------------- lib/icinga/notification.cpp | 6 ++++-- 9 files changed, 46 insertions(+), 65 deletions(-) diff --git a/lib/db_ido/dbconnection.cpp b/lib/db_ido/dbconnection.cpp index 514e7bc51..694b9e37f 100644 --- a/lib/db_ido/dbconnection.cpp +++ b/lib/db_ido/dbconnection.cpp @@ -323,26 +323,6 @@ DbReference DbConnection::GetInsertID(const DbType::Ptr& type, const DbReference return it->second; } -void DbConnection::SetNotificationInsertID(const CustomVarObject::Ptr& obj, const DbReference& dbref) -{ - if (dbref.IsValid()) - m_NotificationInsertIDs[obj] = dbref; - else - m_NotificationInsertIDs.erase(obj); -} - -DbReference DbConnection::GetNotificationInsertID(const CustomVarObject::Ptr& obj) const -{ - std::map::const_iterator it; - - it = m_NotificationInsertIDs.find(obj); - - if (it == m_NotificationInsertIDs.end()) - return DbReference(); - - return it->second; -} - void DbConnection::SetObjectActive(const DbObject::Ptr& dbobj, bool active) { if (active) @@ -360,7 +340,6 @@ void DbConnection::ClearIDCache(void) { m_ObjectIDs.clear(); m_InsertIDs.clear(); - m_NotificationInsertIDs.clear(); m_ActiveObjects.clear(); m_ConfigUpdates.clear(); m_StatusUpdates.clear(); diff --git a/lib/db_ido/dbconnection.hpp b/lib/db_ido/dbconnection.hpp index 63c12489c..6f81178f7 100644 --- a/lib/db_ido/dbconnection.hpp +++ b/lib/db_ido/dbconnection.hpp @@ -57,9 +57,6 @@ public: DbReference GetInsertID(const DbObject::Ptr& dbobj) const; DbReference GetInsertID(const DbType::Ptr& type, const DbReference& objid) const; - void SetNotificationInsertID(const CustomVarObject::Ptr& obj, const DbReference& dbref); - DbReference GetNotificationInsertID(const CustomVarObject::Ptr& obj) const; - void SetObjectActive(const DbObject::Ptr& dbobj, bool active); bool GetObjectActive(const DbObject::Ptr& dbobj) const; @@ -101,7 +98,6 @@ protected: private: std::map m_ObjectIDs; std::map, DbReference> m_InsertIDs; - std::map m_NotificationInsertIDs; std::set m_ActiveObjects; std::set m_ConfigUpdates; std::set m_StatusUpdates; diff --git a/lib/db_ido/dbevents.cpp b/lib/db_ido/dbevents.cpp index 3b34974a3..1afbe9c3b 100644 --- a/lib/db_ido/dbevents.cpp +++ b/lib/db_ido/dbevents.cpp @@ -833,8 +833,7 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con query1.Table = "notifications"; query1.Type = DbQueryInsert; query1.Category = DbCatNotification; - /* store the object ptr for caching the insert id for this object */ - query1.NotificationObject = notification; + query1.NotificationInsertID = new DbValue(DbValueObjectInsertID, -1); Host::Ptr host; Service::Ptr service; @@ -868,16 +867,17 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con query1.Fields = fields1; DbObject::OnQuery(query1); - DbQuery query2; - query2.Table = "contactnotifications"; - query2.Type = DbQueryInsert; - query2.Category = DbCatNotification; + std::vector queries; - /* filtered users */ BOOST_FOREACH(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; + query2.Category = DbCatNotification; + Dictionary::Ptr fields2 = new Dictionary(); fields2->Set("contact_object_id", user); fields2->Set("start_time", DbValue::FromTimestamp(time_bag.first)); @@ -885,12 +885,14 @@ void DbEvents::AddNotificationHistory(const Notification::Ptr& notification, con fields2->Set("end_time", DbValue::FromTimestamp(time_bag.first)); fields2->Set("end_time_usec", time_bag.second); - fields2->Set("notification_id", notification); /* DbConnection class fills in real ID from notification insert id cache */ + fields2->Set("notification_id", query1.NotificationInsertID); fields2->Set("instance_id", 0); /* DbConnection class fills in real ID */ query2.Fields = fields2; - DbObject::OnQuery(query2); + queries.push_back(query2); } + + DbObject::OnMultipleQueries(queries); } /* statehistory */ diff --git a/lib/db_ido/dbquery.hpp b/lib/db_ido/dbquery.hpp index e880d9e69..1dd2d4318 100644 --- a/lib/db_ido/dbquery.hpp +++ b/lib/db_ido/dbquery.hpp @@ -21,6 +21,7 @@ #define DBQUERY_H #include "db_ido/i2-db_ido.hpp" +#include "db_ido/dbvalue.hpp" #include "icinga/customvarobject.hpp" #include "base/dictionary.hpp" #include "base/configobject.hpp" @@ -67,7 +68,7 @@ struct I2_DB_IDO_API DbQuery Dictionary::Ptr Fields; Dictionary::Ptr WhereCriteria; intrusive_ptr Object; - intrusive_ptr NotificationObject; + DbValue::Ptr NotificationInsertID; bool ConfigUpdate; bool StatusUpdate; WorkQueuePriority Priority; diff --git a/lib/db_ido/dbvalue.cpp b/lib/db_ido/dbvalue.cpp index a70fef69e..dcd07f0c9 100644 --- a/lib/db_ido/dbvalue.cpp +++ b/lib/db_ido/dbvalue.cpp @@ -93,3 +93,8 @@ Value DbValue::GetValue(void) const { return m_Value; } + +void DbValue::SetValue(const Value& value) +{ + m_Value = value; +} diff --git a/lib/db_ido/dbvalue.hpp b/lib/db_ido/dbvalue.hpp index d2b394ed6..a5f565944 100644 --- a/lib/db_ido/dbvalue.hpp +++ b/lib/db_ido/dbvalue.hpp @@ -31,7 +31,7 @@ enum DbValueType { DbValueTimestamp, DbValueTimestampNow, - DbValueObjectInsertID, + DbValueObjectInsertID }; /** @@ -58,7 +58,9 @@ public: static Value ExtractValue(const Value& value); DbValueType GetType(void) const; + Value GetValue(void) const; + void SetValue(const Value& value); private: DbValueType m_Type; diff --git a/lib/db_ido_mysql/idomysqlconnection.cpp b/lib/db_ido_mysql/idomysqlconnection.cpp index 840d40003..acfa1841e 100644 --- a/lib/db_ido_mysql/idomysqlconnection.cpp +++ b/lib/db_ido_mysql/idomysqlconnection.cpp @@ -704,14 +704,6 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va } else if (key == "session_token") { *result = m_SessionToken; return true; - } else if (key == "notification_id") { - DbReference ref = GetNotificationInsertID(value); - - if (!ref.IsValid()) - return false; - - *result = static_cast(ref); - return true; } Value rawvalue = DbValue::ExtractValue(value); @@ -752,6 +744,14 @@ bool IdoMysqlConnection::FieldToEscapedString(const String& key, const Value& va *result = Value(msgbuf.str()); } else if (DbValue::IsTimestampNow(value)) { *result = "NOW()"; + } else if (DbValue::IsObjectInsertID(value)) { + long id = static_cast(rawvalue); + + if (id <= 0) + return false; + + *result = id; + return true; } else { Value fvalue; @@ -969,11 +969,8 @@ void IdoMysqlConnection::FinishExecuteQuery(const DbQuery& query, int type, bool SetStatusUpdate(query.Object, true); } - if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationObject) { // FIXME remove hardcoded table name - SetNotificationInsertID(query.NotificationObject, GetLastInsertID()); - Log(LogDebug, "IdoMysqlConnection") - << "saving contactnotification notification_id=" << static_cast(GetLastInsertID()); - } + if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationInsertID) + query.NotificationInsertID->SetValue(static_cast(GetLastInsertID())); } void IdoMysqlConnection::CleanUpExecuteQuery(const String& table, const String& time_column, double max_age) diff --git a/lib/db_ido_pgsql/idopgsqlconnection.cpp b/lib/db_ido_pgsql/idopgsqlconnection.cpp index 3d5d1a610..9eae07c78 100644 --- a/lib/db_ido_pgsql/idopgsqlconnection.cpp +++ b/lib/db_ido_pgsql/idopgsqlconnection.cpp @@ -583,14 +583,6 @@ bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& va } else if (key == "session_token") { *result = m_SessionToken; return true; - } else if (key == "notification_id") { - DbReference ref = GetNotificationInsertID(value); - - if (!ref.IsValid()) - return false; - - *result = static_cast(ref); - return true; } Value rawvalue = DbValue::ExtractValue(value); @@ -630,6 +622,14 @@ bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& va *result = Value(msgbuf.str()); } else if (DbValue::IsTimestampNow(value)) { *result = "NOW()"; + } else if (DbValue::IsObjectInsertID(value)) { + long id = static_cast(rawvalue); + + if (id <= 0) + return false; + + *result = id; + return true; } else { Value fvalue; @@ -849,12 +849,9 @@ void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType SetStatusUpdate(query.Object, true); } - if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationObject) { // FIXME remove hardcoded table name - String idField = "notification_id"; - DbReference seqval = GetSequenceValue(GetTablePrefix() + query.Table, idField); - SetNotificationInsertID(query.NotificationObject, seqval); - Log(LogDebug, "IdoPgsqlConnection") - << "saving contactnotification notification_id=" << Convert::ToString(seqval); + if (type == DbQueryInsert && query.Table == "notifications" && query.NotificationInsertID) { + DbReference seqval = GetSequenceValue(GetTablePrefix() + query.Table, "notification_id"); + query.NotificationInsertID->SetValue(static_cast(seqval)); } } diff --git a/lib/icinga/notification.cpp b/lib/icinga/notification.cpp index c2cec0ef7..1cfefa0f9 100644 --- a/lib/icinga/notification.cpp +++ b/lib/icinga/notification.cpp @@ -466,7 +466,7 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User:: if (!command) { Log(LogDebug, "Notification") - << "No notification_command found for notification '" << GetName() << "'. Skipping execution."; + << "No command found for notification '" << GetName() << "'. Skipping execution."; return; } @@ -482,7 +482,9 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User:: Service::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, author, text, command->GetName()); Log(LogInformation, "Notification") - << "Completed sending notification '" << GetName() << "' for checkable '" << GetCheckable()->GetName() << "'"; + << "Completed sending notification '" << GetName() + << "' for checkable '" << GetCheckable()->GetName() + << "' and user '" << user->GetName() << "'."; } catch (const std::exception& ex) { Log(LogWarning, "Notification") << "Exception occured during notification for checkable '" From a65f5fad26b8fe61837f990b7ff60ed06c2014d8 Mon Sep 17 00:00:00 2001 From: Rune Darrud Date: Tue, 29 Mar 2016 23:56:06 +0200 Subject: [PATCH 32/86] Add support for x64 Icinga2SetupAgent refs #11462 --- .../Icinga2SetupAgent.csproj | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/agent/windows-setup-agent/Icinga2SetupAgent.csproj b/agent/windows-setup-agent/Icinga2SetupAgent.csproj index e4f55e40d..4d09d4d5c 100644 --- a/agent/windows-setup-agent/Icinga2SetupAgent.csproj +++ b/agent/windows-setup-agent/Icinga2SetupAgent.csproj @@ -65,6 +65,43 @@ prompt 4 + + x64 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x64 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + x64 + pdbonly + true + bin\RelWithDebInfo\ + TRACE + prompt + 4 + + + x64 + pdbonly + true + bin\MinSizeRel\ + TRACE + prompt + 4 + icinga.ico @@ -164,4 +201,4 @@ --> - \ No newline at end of file + From e75262af2f42e24f12dc23fdf04fe2bbf1c88e92 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 30 Mar 2016 09:47:45 +0200 Subject: [PATCH 33/86] Update NSClient++ to version 0.4.4.19 fixes #11473 fixes #11474 --- CMakeLists.txt | 24 ++++++++++++++++-------- agent/windows-setup-agent/SetupWizard.cs | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97ccd5533..e60618893 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -326,16 +326,24 @@ set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) if(WIN32) - set(NSCP_SHA256SUM "") - if (EXISTS ${CMAKE_CURRENT_BINARY_DIR}/NSCP-Win32.msi) - file(SHA256 ${CMAKE_CURRENT_BINARY_DIR}/NSCP-Win32.msi NSCP_SHA256SUM) - endif() - - if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/NSCP-Win32.msi OR NOT ${NSCP_SHA256SUM} STREQUAL "226cef0154daf1f9b93d0e168068e723e2be407548e5c4772557401d87535b48") - file(DOWNLOAD https://github.com/mickem/nscp/releases/download/0.4.3.143/NSCP-0.4.3.143-Win32.msi ${CMAKE_CURRENT_BINARY_DIR}/NSCP-Win32.msi SHOW_PROGRESS) + if(CMAKE_VS_PLATFORM_NAME STREQUAL "x64") + set(NSCP_URL "https://github.com/mickem/nscp/releases/download/0.4.4.19/NSCP-0.4.4.19-x64.msi") + set(NSCP_SHA256 "36c487777e9488cbf7a15db3a87f63ff6d6af46398d6f36b25734041e3e13900") + else() + set(NSCP_URL "https://github.com/mickem/nscp/releases/download/0.4.4.19/NSCP-0.4.4.19-Win32.msi") + set(NSCP_SHA256 "f05bc00712966901531d5a9354c57e95c34eb65b4748cf3ebc305ccc8fa29cce") endif() - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/NSCP-Win32.msi DESTINATION ${CMAKE_INSTALL_SBINDIR}) + set(NSCP_SHA256SUM "") + if (EXISTS ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi) + file(SHA256 ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi NSCP_SHA256SUM) + endif() + + if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi OR NOT ${NSCP_SHA256SUM} STREQUAL ${NSCP_SHA256}) + file(DOWNLOAD ${NSCP_URL} ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi SHOW_PROGRESS) + endif() + + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi DESTINATION ${CMAKE_INSTALL_SBINDIR}) install( PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} diff --git a/agent/windows-setup-agent/SetupWizard.cs b/agent/windows-setup-agent/SetupWizard.cs index 6186f3311..38aab03ff 100644 --- a/agent/windows-setup-agent/SetupWizard.cs +++ b/agent/windows-setup-agent/SetupWizard.cs @@ -255,7 +255,7 @@ namespace Icinga Process proc = new Process(); proc.StartInfo.FileName = "msiexec.exe"; - proc.StartInfo.Arguments = "/i \"" + Program.Icinga2InstallDir + "\\sbin\\NSCP-Win32.msi\""; + proc.StartInfo.Arguments = "/i \"" + Program.Icinga2InstallDir + "\\sbin\\NSCP.msi\""; proc.Start(); proc.WaitForExit(); } From d276c7e4c2052912f90480728ce262382f3c4b52 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 30 Mar 2016 09:58:01 +0200 Subject: [PATCH 34/86] Fix: FatalError() returns when called before Application.Run fixes #11475 --- agent/windows-setup-agent/Program.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/agent/windows-setup-agent/Program.cs b/agent/windows-setup-agent/Program.cs index a36af0ef9..e3e282eb4 100644 --- a/agent/windows-setup-agent/Program.cs +++ b/agent/windows-setup-agent/Program.cs @@ -38,8 +38,10 @@ namespace Icinga string installDir = Program.Icinga2InstallDir; - if (installDir == "") - FatalError(null, "Icinga 2 does not seem to be installed properly."); + if (installDir == "") { + FatalError(null, "Icinga 2 does not seem to be installed properly."); + return; + } Form form; From 7b37bd8f417d2481ded3ef0face4305521fa0046 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 30 Mar 2016 11:47:39 +0200 Subject: [PATCH 35/86] Add preliminary support for 64-bit packages refs #11449 --- CMakeLists.txt | 4 ++- agent/windows-setup-agent/Program.cs | 34 +++++++++++++++++--- icinga-app/icinga.cpp | 46 +++++++++++++++++----------- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e60618893..7b629182c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -289,7 +289,7 @@ if(ICINGA2_WITH_TESTS) add_subdirectory(test) endif() -set(CPACK_PACKAGE_NAME "Icinga2") +set(CPACK_PACKAGE_NAME "Icinga 2") set(CPACK_PACKAGE_VENDOR "Icinga Development Team") set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION}) set(CPACK_NSIS_DISPLAY_NAME "Icinga 2") @@ -321,6 +321,8 @@ set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCre set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-install daemon'") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec 'net start icinga2'") set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "nsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-uninstall'") +set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") +set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/agent/windows-setup-agent/Program.cs b/agent/windows-setup-agent/Program.cs index e3e282eb4..3dcd3de75 100644 --- a/agent/windows-setup-agent/Program.cs +++ b/agent/windows-setup-agent/Program.cs @@ -2,22 +2,46 @@ using System.IO; using System.Windows.Forms; using Microsoft.Win32; +using System.Runtime.InteropServices; +using System.Text; namespace Icinga { static class Program { + [DllImport("msi.dll", SetLastError = true)] + static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf); - public static string Icinga2InstallDir + [DllImport("msi.dll", CharSet = CharSet.Unicode)] + static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); + + public static string Icinga2InstallDir { get { - RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Icinga Development Team\\ICINGA2"); + StringBuilder szProduct; - if (rk == null) - return ""; + for (int index = 0; ; index++) { + szProduct = new StringBuilder(39); + if (MsiEnumProducts(index, szProduct) != 0) + break; - return (string)rk.GetValue(""); + int cbName = 128; + StringBuilder szName = new StringBuilder(cbName); + + if (MsiGetProductInfo(szProduct.ToString(), "ProductName", szName, ref cbName) != 0) + continue; + + if (szName.ToString() != "Icinga 2") + continue; + + int cbLocation = 1024; + StringBuilder szLocation = new StringBuilder(cbLocation); + if (MsiGetProductInfo(szProduct.ToString(), "InstallLocation", szLocation, ref cbLocation) == 0) + return szLocation.ToString(); + } + + return ""; } } diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 4234aa96c..d67df4690 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -40,6 +40,8 @@ # include # include # include +#else /* _WIN32 */ +# include #endif /* _WIN32 */ using namespace icinga; @@ -125,30 +127,38 @@ int Main(void) #ifdef _WIN32 bool builtinPaths = true; - HKEY hKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Icinga Development Team\\ICINGA2", 0, - KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - BYTE pvData[MAX_PATH]; - DWORD cbData = sizeof(pvData)-1; - DWORD lType; - if (RegQueryValueEx(hKey, NULL, NULL, &lType, pvData, &cbData) == ERROR_SUCCESS && lType == REG_SZ) { - pvData[cbData] = '\0'; + String prefix; - String prefix = (char *)pvData; - Application::DeclarePrefixDir(prefix); - Application::DeclareSysconfDir(prefix + "\\etc"); - Application::DeclareRunDir(prefix + "\\var\\run"); - Application::DeclareLocalStateDir(prefix + "\\var"); - Application::DeclarePkgDataDir(prefix + "\\share\\icinga2"); - Application::DeclareIncludeConfDir(prefix + "\\share\\icinga2\\include"); + char szProduct[39]; + bool foundMsi = false; + for (int i = 0; MsiEnumProducts(i, szProduct) == ERROR_SUCCESS; i++) { + char szName[128]; + DWORD cbName = sizeof(szName); + if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, szName, &cbName) != ERROR_SUCCESS) + continue; + + if (strcmp(szName, "Icinga 2") != 0) + continue; + + char szLocation[1024]; + DWORD cbLocation = sizeof(szLocation); + if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLLOCATION, szLocation, &cbLocation) == ERROR_SUCCESS) { builtinPaths = false; + prefix = szLocation; + foundMsi = true; + break; } - - RegCloseKey(hKey); } - if (builtinPaths) { + if (!builtinPaths) { + Application::DeclarePrefixDir(prefix); + Application::DeclareSysconfDir(prefix + "\\etc"); + Application::DeclareRunDir(prefix + "\\var\\run"); + Application::DeclareLocalStateDir(prefix + "\\var"); + Application::DeclarePkgDataDir(prefix + "\\share\\icinga2"); + Application::DeclareIncludeConfDir(prefix + "\\share\\icinga2\\include"); + } else { Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths."); #endif /* _WIN32 */ From 309ea899ed1a63323230e4c4251ad1eb7ef6deb1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 31 Mar 2016 11:42:52 +0200 Subject: [PATCH 36/86] Fix: Overwriting global type variables causes crash in ConfigItem::Commit() fixes #11484 --- lib/config/configitem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 83d40810b..267328a8c 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -168,7 +168,8 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) /* Make sure the type is valid. */ Type::Ptr type = Type::GetByName(GetType()); - ASSERT(type && ConfigObject::TypeInstance->IsAssignableFrom(type)); + if (!type || !ConfigObject::TypeInstance->IsAssignableFrom(type)) + BOOST_THROW_EXCEPTION(ScriptError("Type '" + GetType() + "' does not exist.", m_DebugInfo)); if (IsAbstract()) return ConfigObject::Ptr(); From 389cb54f93fae00f3ad61e36ae3218179ed046fe Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 30 Mar 2016 18:59:23 +0200 Subject: [PATCH 37/86] Implement support for running custom install/uninstall actions refs #11449 --- .gitignore | 6 ++- CMakeLists.txt | 5 +++ icinga-app/icinga.cpp | 28 +------------ icinga-installer/CMakeLists.txt | 35 ++++++++++++++++ icinga-installer/icinga-installer.cpp | 57 +++++++++++++++++++++++++++ icinga2.wixpatch | 11 ++++++ lib/base/utility.cpp | 26 +++++++++++- lib/base/utility.hpp | 4 ++ 8 files changed, 144 insertions(+), 28 deletions(-) create mode 100644 icinga-installer/CMakeLists.txt create mode 100644 icinga-installer/icinga-installer.cpp create mode 100644 icinga2.wixpatch diff --git a/.gitignore b/.gitignore index afa2557e5..a17271a4d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,8 @@ .*.swo build/ build-debug/ -build-release/ \ No newline at end of file +build-release/ +build32/ +build64/ +debug/ +release/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b629182c..687a40349 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,6 +281,10 @@ add_subdirectory(doc) add_subdirectory(agent) add_subdirectory(plugins) +if(MSVC) + add_subdirectory(icinga-installer) +endif() + if(ICINGA2_WITH_STUDIO) add_subdirectory(icinga-studio) endif() @@ -323,6 +327,7 @@ set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsE set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "nsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-uninstall'") set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") +set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index d67df4690..2f465bd0b 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -40,8 +40,6 @@ # include # include # include -#else /* _WIN32 */ -# include #endif /* _WIN32 */ using namespace icinga; @@ -127,31 +125,9 @@ int Main(void) #ifdef _WIN32 bool builtinPaths = true; - String prefix; + String prefix = Utility::GetIcingaInstallPath(); - char szProduct[39]; - bool foundMsi = false; - - for (int i = 0; MsiEnumProducts(i, szProduct) == ERROR_SUCCESS; i++) { - char szName[128]; - DWORD cbName = sizeof(szName); - if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, szName, &cbName) != ERROR_SUCCESS) - continue; - - if (strcmp(szName, "Icinga 2") != 0) - continue; - - char szLocation[1024]; - DWORD cbLocation = sizeof(szLocation); - if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLLOCATION, szLocation, &cbLocation) == ERROR_SUCCESS) { - builtinPaths = false; - prefix = szLocation; - foundMsi = true; - break; - } - } - - if (!builtinPaths) { + if (!prefix.IsEmpty()) { Application::DeclarePrefixDir(prefix); Application::DeclareSysconfDir(prefix + "\\etc"); Application::DeclareRunDir(prefix + "\\var\\run"); diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt new file mode 100644 index 000000000..4aa6c07dc --- /dev/null +++ b/icinga-installer/CMakeLists.txt @@ -0,0 +1,35 @@ +# Icinga 2 +# Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +add_executable(icinga-installer icinga-installer.cpp) + +include_directories(${Boost_INCLUDE_DIRS}) +target_link_libraries(icinga-installer ${Boost_LIBRARIES} base config cli) + +set_target_properties ( + icinga-installer PROPERTIES + FOLDER Bin + OUTPUT_NAME icinga2-installer + LINK_FLAGS "/SUBSYSTEM:WINDOWS" +) + +set(InstallPath "${CMAKE_INSTALL_SBINDIR}") + +install( + TARGETS icinga-installer + RUNTIME DESTINATION ${InstallPath} +) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp new file mode 100644 index 000000000..3bfbdb9bb --- /dev/null +++ b/icinga-installer/icinga-installer.cpp @@ -0,0 +1,57 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "base/utility.hpp" +#include "base/application.hpp" + +using namespace icinga; + +int InstallIcinga(void) +{ + MessageBox(NULL, "Install", "Icinga 2", 0); + return 0; +} + +int UninstallIcinga(void) +{ + MessageBox(NULL, "Uninstall", "Icinga 2", 0); + return 0; +} + +/** +* Entry point for the installer application. +*/ +int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +{ + /* must be called before using any other libbase functions */ + Application::InitializeBase(); + + int rc; + + if (strcmp(lpCmdLine, "install") == 0) { + rc = InstallIcinga(); + } else if (strcmp(lpCmdLine, "uninstall") == 0) { + rc = UninstallIcinga(); + } else { + MessageBox(NULL, "This application should only be run by the MSI installer package.", "Icinga 2 Installer", MB_ICONWARNING); + rc = 1; + } + + Application::Exit(rc); +} diff --git a/icinga2.wixpatch b/icinga2.wixpatch new file mode 100644 index 000000000..38360b534 --- /dev/null +++ b/icinga2.wixpatch @@ -0,0 +1,11 @@ + + + + + + + $CM_CP_sbin.icinga2_installer.exe>2 + $CM_CP_sbin.icinga2_installer.exe=2 + + + \ No newline at end of file diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index dfb0614db..8d6466839 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -55,6 +55,7 @@ # include # include # include +# include #endif /*_WIN32*/ using namespace icinga; @@ -1859,4 +1860,27 @@ int Utility::MksTemp(char *tmpl) errno = EEXIST; return -1; } -#endif /*_WIN32*/ + +String Utility::GetIcingaInstallPath(void) +{ + char szProduct[39]; + + for (int i = 0; MsiEnumProducts(i, szProduct) == ERROR_SUCCESS; i++) { + char szName[128]; + DWORD cbName = sizeof(szName); + if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, szName, &cbName) != ERROR_SUCCESS) + continue; + + if (strcmp(szName, "Icinga 2") != 0) + continue; + + char szLocation[1024]; + DWORD cbLocation = sizeof(szLocation); + if (MsiGetProductInfo(szProduct, INSTALLPROPERTY_INSTALLLOCATION, szLocation, &cbLocation) == ERROR_SUCCESS) + return szLocation; + } + + return ""; +} + +#endif /* _WIN32 */ \ No newline at end of file diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index d244086f3..9af1b8f8a 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -143,6 +143,10 @@ public: static String CreateTempFile(const String& path, int mode, std::fstream& fp); +#ifdef _WIN32 + static String GetIcingaInstallPath(void); +#endif /* _WIN32 */ + private: Utility(void); static void CollectPaths(const String& path, std::vector& paths); From 01709955a814e22cd1acf625afb3c3dd9ce11f8b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 31 Mar 2016 10:25:44 +0200 Subject: [PATCH 38/86] Add missing pre and post installation commands refs #11449 --- CMakeLists.txt | 1 + icinga-installer/icinga-installer.cpp | 51 ++++++++++++++++++++++++--- icinga2.wixpatch | 19 +++++++++- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 687a40349..25582b534 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -328,6 +328,7 @@ set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "nsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\i set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch") +set(CPACK_WIX_EXTENSIONS "WixUtilExtension") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 3bfbdb9bb..022faa726 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -22,15 +22,54 @@ using namespace icinga; -int InstallIcinga(void) +static String GetIcingaInstallDir(void) { - MessageBox(NULL, "Install", "Icinga 2", 0); + char szFileName[MAX_PATH]; + if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName))) + return ""; + return Utility::DirName(Utility::DirName(szFileName)); +} + +static void ExecuteCommand(const String& command) +{ + std::cerr << "Executing command: " << command << std::endl; + system(command.CStr()); +} + +static void ExecuteIcingaCommand(const String& args) +{ + ExecuteCommand("\"" + GetIcingaInstallDir() + "\\sbin\\icinga2.exe\" " + args); +} + +static int InstallIcinga(void) +{ + String installDir = GetIcingaInstallDir(); + + ExecuteCommand("icacls \"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); + ExecuteCommand("icacls \"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); + + Utility::MkDirP(installDir + "/etc/icinga2/pki", 0700); + Utility::MkDirP(installDir + "/var/cache/icinga2", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/pki", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/agent/inventory", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/api/config", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/api/log", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/api/zones", 0700); + Utility::MkDirP(installDir + "/var/lib/icinga2/api/zones", 0700); + Utility::MkDirP(installDir + "/var/log/icinga2/compat/archive", 0700); + Utility::MkDirP(installDir + "/var/log/icinga2/crash", 0700); + Utility::MkDirP(installDir + "/var/spool/icinga2/perfdata", 0700); + Utility::MkDirP(installDir + "/var/spool/icinga2/tmp", 0700); + + ExecuteIcingaCommand("--scm-install daemon"); + return 0; } -int UninstallIcinga(void) +static int UninstallIcinga(void) { - MessageBox(NULL, "Uninstall", "Icinga 2", 0); + ExecuteIcingaCommand("--scm-uninstall"); + return 0; } @@ -42,6 +81,8 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi /* must be called before using any other libbase functions */ Application::InitializeBase(); + //AllocConsole(); + int rc; if (strcmp(lpCmdLine, "install") == 0) { @@ -53,5 +94,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi rc = 1; } + //Utility::Sleep(3); + Application::Exit(rc); } diff --git a/icinga2.wixpatch b/icinga2.wixpatch index 38360b534..d9ce2ceaf 100644 --- a/icinga2.wixpatch +++ b/icinga2.wixpatch @@ -1,11 +1,28 @@ + 1 + $CM_CP_sbin.icinga2_installer.exe>2 - $CM_CP_sbin.icinga2_installer.exe=2 + $CM_CP_sbin.icinga2_installer.exe=2 + + + + + + + + WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed + \ No newline at end of file From 5c77e853a781f8fc995e62b7842f0e82a84f6904 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 31 Mar 2016 10:26:23 +0200 Subject: [PATCH 39/86] Remove support for NSIS refs #11449 --- CMakeLists.txt | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25582b534..7d7ba3404 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -296,35 +296,11 @@ endif() set(CPACK_PACKAGE_NAME "Icinga 2") set(CPACK_PACKAGE_VENDOR "Icinga Development Team") set(CPACK_PACKAGE_VERSION ${ICINGA2_VERSION}) -set(CPACK_NSIS_DISPLAY_NAME "Icinga 2") set(CPACK_PACKAGE_INSTALL_DIRECTORY "ICINGA2") set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") -set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") -set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") -set(CPACK_NSIS_INSTALLED_ICON_NAME "sbin\\\\icinga2.exe") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") -set(CPACK_NSIS_EXECUTABLES_DIRECTORY "sbin") set(CPACK_PACKAGE_EXECUTABLES "Icinga2SetupAgent;Icinga 2 Agent Wizard;icinga-studio;Icinga Studio") -set(CPACK_NSIS_MUI_FINISHPAGE_RUN "Icinga2SetupAgent") -set(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "nsExec::Exec 'net stop icinga2'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec 'icacls \\\"$INSTDIR\\\" /grant *S-1-5-20:(oi)(ci)m'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec 'icacls \\\"$INSTDIR\\\\etc\\\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m /grant:r *S-1-5-32-544:(oi)(ci)f'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\etc\\\\icinga2\\\\pki'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\cache\\\\icinga2'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\lib\\\\icinga2\\\\pki'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\lib\\\\icinga2\\\\agent\\\\inventory'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\lib\\\\icinga2\\\\api\\\\config'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\lib\\\\icinga2\\\\api\\\\log'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\lib\\\\icinga2\\\\api\\\\zones'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\log\\\\icinga2\\\\compat\\\\archive'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\log\\\\icinga2\\\\crash'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\run\\\\icinga2\\\\cmd'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\spool\\\\icinga2\\\\perfdata'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nCreateDirectory '$INSTDIR\\\\var\\\\spool\\\\icinga2\\\\tmp'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-install daemon'") -set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}\nnsExec::Exec 'net start icinga2'") -set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "nsExec::Exec '\\\"$INSTDIR\\\\sbin\\\\icinga2\\\" --scm-uninstall'") set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch") From 9ce63aa68e24c5182f343a6cc5122c77f670d65b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 31 Mar 2016 13:54:10 +0200 Subject: [PATCH 40/86] Make sure config files aren't overwritten during updates refs #11449 --- cmake/InstallConfig.cmake | 19 +++++++------------ icinga-installer/icinga-installer.cpp | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index 452abfadf..e4af25d5e 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -21,25 +21,20 @@ function(install_if_not_exists src dest) set(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}") endif() get_filename_component(src_name "${src}" NAME) - if (NOT IS_ABSOLUTE "${dest}") - set(dest "${CMAKE_INSTALL_PREFIX}/${dest}") - endif() 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}") - set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS} - SetOverwrite off - CreateDirectory '$INSTDIR\\\\${nsis_dest_dir}' - File '/oname=${nsis_dest}' '${nsis_src}' - SetOverwrite on - " PARENT_SCOPE) install(CODE " - if(NOT EXISTS \"\$ENV{DESTDIR}${dest}/${src_name}\") - #file(INSTALL \"${src}\" DESTINATION \"${dest}\") + if(\${CMAKE_INSTALL_PREFIX} MATCHES .*/_CPack_Packages/.* OR NOT EXISTS \"\$ENV{DESTDIR}${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}\" - \"\$ENV{DESTDIR}${dest}/${src_name}\" + \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${skel_prefix}${dest}/${src_name}\" RESULT_VARIABLE copy_result ERROR_VARIABLE error_output) if(copy_result) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 022faa726..ea5c5d8e0 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -41,10 +41,24 @@ static void ExecuteIcingaCommand(const String& args) ExecuteCommand("\"" + GetIcingaInstallDir() + "\\sbin\\icinga2.exe\" " + args); } +static void CopyConfigFile(const String& installDir, const String& sourceConfigPath, size_t skelPrefixLength) +{ + String relativeConfigPath = sourceConfigPath.SubStr(installDir.GetLength() + skelPrefixLength); + + String targetConfigPath = installDir + relativeConfigPath; + + if (!Utility::PathExists(targetConfigPath)) { + Utility::MkDirP(Utility::DirName(targetConfigPath), 0700); + Utility::CopyFile(sourceConfigPath, targetConfigPath); + } +} + static int InstallIcinga(void) { String installDir = GetIcingaInstallDir(); + installDir = "C:\\Program Files\\Icinga2\\"; + ExecuteCommand("icacls \"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); ExecuteCommand("icacls \"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); @@ -61,6 +75,9 @@ static int InstallIcinga(void) Utility::MkDirP(installDir + "/var/spool/icinga2/perfdata", 0700); Utility::MkDirP(installDir + "/var/spool/icinga2/tmp", 0700); + String skelDir = "/share/skel"; + Utility::GlobRecursive(installDir + skelDir, "*", boost::bind(&CopyConfigFile, installDir, _1, skelDir.GetLength()), GlobFile); + ExecuteIcingaCommand("--scm-install daemon"); return 0; From 0a96f4129e60a00bd74b83f21ca4a7ff32df5085 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 31 Mar 2016 13:56:28 +0200 Subject: [PATCH 41/86] Remove unused code in the Windows wizard refs #11449 --- .../SetupWizard.Designer.cs | 1 - agent/windows-setup-agent/SetupWizard.cs | 19 ------------------- 2 files changed, 20 deletions(-) diff --git a/agent/windows-setup-agent/SetupWizard.Designer.cs b/agent/windows-setup-agent/SetupWizard.Designer.cs index e026f66e6..8a2374bc6 100644 --- a/agent/windows-setup-agent/SetupWizard.Designer.cs +++ b/agent/windows-setup-agent/SetupWizard.Designer.cs @@ -619,7 +619,6 @@ this.MaximizeBox = false; this.Name = "SetupWizard"; this.Text = "Icinga 2 Setup Wizard"; - this.Shown += new System.EventHandler(this.AgentWizard_Shown); this.tabFinish.ResumeLayout(false); this.tabFinish.PerformLayout(); this.tabConfigure.ResumeLayout(false); diff --git a/agent/windows-setup-agent/SetupWizard.cs b/agent/windows-setup-agent/SetupWizard.cs index 38aab03ff..6bc13c7ff 100644 --- a/agent/windows-setup-agent/SetupWizard.cs +++ b/agent/windows-setup-agent/SetupWizard.cs @@ -275,25 +275,6 @@ namespace Icinga tbcPages.SelectedTab = tabFinish; } - private void AgentWizard_Shown(object sender, EventArgs e) - { - string installDir = Program.Icinga2InstallDir; - - /* TODO: This is something the NSIS installer should do */ - Directory.CreateDirectory(installDir + "\\etc\\icinga2\\pki"); - Directory.CreateDirectory(installDir + "\\var\\cache\\icinga2"); - Directory.CreateDirectory(installDir + "\\var\\lib\\icinga2\\pki"); - Directory.CreateDirectory(installDir + "\\var\\lib\\icinga2\\agent\\inventory"); - Directory.CreateDirectory(installDir + "\\var\\lib\\icinga2\\api\\config"); - Directory.CreateDirectory(installDir + "\\var\\lib\\icinga2\\api\\log"); - Directory.CreateDirectory(installDir + "\\var\\lib\\icinga2\\api\\zones"); - Directory.CreateDirectory(installDir + "\\var\\log\\icinga2\\compat\\archive"); - Directory.CreateDirectory(installDir + "\\var\\log\\icinga2\\crash"); - Directory.CreateDirectory(installDir + "\\var\\run\\icinga2\\cmd"); - Directory.CreateDirectory(installDir + "\\var\\spool\\icinga2\\perfdata"); - Directory.CreateDirectory(installDir + "\\var\\spool\\icinga2\\tmp"); - } - private void btnBack_Click(object sender, EventArgs e) { if (tbcPages.SelectedTab == tabError) { From fe5cef4107e7a890279acfa5197d505b6509c817 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 31 Mar 2016 14:17:32 +0200 Subject: [PATCH 42/86] Add missing MkDirP call refs #11449 --- icinga-installer/icinga-installer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index ea5c5d8e0..b4587f37c 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -57,8 +57,6 @@ static int InstallIcinga(void) { String installDir = GetIcingaInstallDir(); - installDir = "C:\\Program Files\\Icinga2\\"; - ExecuteCommand("icacls \"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); ExecuteCommand("icacls \"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); @@ -72,6 +70,7 @@ static int InstallIcinga(void) Utility::MkDirP(installDir + "/var/lib/icinga2/api/zones", 0700); Utility::MkDirP(installDir + "/var/log/icinga2/compat/archive", 0700); Utility::MkDirP(installDir + "/var/log/icinga2/crash", 0700); + Utility::MkDirP(installDir + "/var/run/icinga2/cmd", 0700); Utility::MkDirP(installDir + "/var/spool/icinga2/perfdata", 0700); Utility::MkDirP(installDir + "/var/spool/icinga2/tmp", 0700); From e04278e6c31f4c6a2df3a8b5be71e6386ae3665a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 1 Apr 2016 07:37:03 +0200 Subject: [PATCH 43/86] Hide console windows during installation refs #11449 --- icinga-installer/icinga-installer.cpp | 37 ++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index b4587f37c..764f47b53 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -19,6 +19,7 @@ #include "base/utility.hpp" #include "base/application.hpp" +#include using namespace icinga; @@ -30,15 +31,35 @@ static String GetIcingaInstallDir(void) return Utility::DirName(Utility::DirName(szFileName)); } -static void ExecuteCommand(const String& command) +static bool ExecuteCommand(const String& app, const String& arguments) { - std::cerr << "Executing command: " << command << std::endl; - system(command.CStr()); + SHELLEXECUTEINFO sei = {}; + sei.cbSize = sizeof(sei); + sei.fMask = SEE_MASK_NOCLOSEPROCESS; + sei.lpFile = app.CStr(); + sei.lpParameters = arguments.CStr(); + sei.nShow = SW_HIDE; + if (!ShellExecuteEx(&sei)) + return false; + + if (!sei.hProcess) + return false; + + WaitForSingleObject(sei.hProcess, INFINITE); + + DWORD exitCode; + bool res = GetExitCodeProcess(sei.hProcess, &exitCode); + CloseHandle(sei.hProcess); + + if (!res) + return false; + + return exitCode == 0; } -static void ExecuteIcingaCommand(const String& args) +static bool ExecuteIcingaCommand(const String& arguments) { - ExecuteCommand("\"" + GetIcingaInstallDir() + "\\sbin\\icinga2.exe\" " + args); + return ExecuteCommand(GetIcingaInstallDir() + "\\sbin\\icinga2.exe", arguments); } static void CopyConfigFile(const String& installDir, const String& sourceConfigPath, size_t skelPrefixLength) @@ -57,8 +78,8 @@ static int InstallIcinga(void) { String installDir = GetIcingaInstallDir(); - ExecuteCommand("icacls \"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); - ExecuteCommand("icacls \"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); + ExecuteCommand("icacls", "\"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); + ExecuteCommand("icacls", "\"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); Utility::MkDirP(installDir + "/etc/icinga2/pki", 0700); Utility::MkDirP(installDir + "/var/cache/icinga2", 0700); @@ -97,6 +118,8 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi /* must be called before using any other libbase functions */ Application::InitializeBase(); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + //AllocConsole(); int rc; From 53cb18543cff0723d916421b16056daa93b48a76 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 1 Apr 2016 08:25:36 +0200 Subject: [PATCH 44/86] Implement support for upgrading NSIS-based installations refs #11449 --- etc/CMakeLists.txt | 5 +- icinga-app/icinga.cpp | 17 +++--- icinga-installer/icinga-installer.cpp | 85 ++++++++++++++++++++------- lib/base/utility.cpp | 9 +++ lib/base/utility.hpp | 1 + lib/checker/CMakeLists.txt | 5 +- lib/notification/CMakeLists.txt | 5 +- 7 files changed, 87 insertions(+), 40 deletions(-) diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt index f97674c3b..3c39df7f6 100644 --- a/etc/CMakeLists.txt +++ b/etc/CMakeLists.txt @@ -83,10 +83,7 @@ if(NOT WIN32) DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d ) else() - install( - FILES icinga2/features-enabled/mainlog.conf - DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled - ) + install_if_not_exists(icinga2/features-enabled/mainlog.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) endif() if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 2f465bd0b..75ef69578 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -125,15 +125,16 @@ int Main(void) #ifdef _WIN32 bool builtinPaths = true; - String prefix = Utility::GetIcingaInstallPath(); + String binaryPrefix = Utility::GetIcingaInstallPath(); + String dataPrefix = Utility::GetIcingaDataPath(); - if (!prefix.IsEmpty()) { - Application::DeclarePrefixDir(prefix); - Application::DeclareSysconfDir(prefix + "\\etc"); - Application::DeclareRunDir(prefix + "\\var\\run"); - Application::DeclareLocalStateDir(prefix + "\\var"); - Application::DeclarePkgDataDir(prefix + "\\share\\icinga2"); - Application::DeclareIncludeConfDir(prefix + "\\share\\icinga2\\include"); + 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"); } else { Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths."); diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 764f47b53..a91c8b3ff 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -23,7 +23,7 @@ using namespace icinga; -static String GetIcingaInstallDir(void) +static String GetIcingaInstallPath(void) { char szFileName[MAX_PATH]; if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName))) @@ -59,12 +59,12 @@ static bool ExecuteCommand(const String& app, const String& arguments) static bool ExecuteIcingaCommand(const String& arguments) { - return ExecuteCommand(GetIcingaInstallDir() + "\\sbin\\icinga2.exe", arguments); + return ExecuteCommand(GetIcingaInstallPath() + "\\sbin\\icinga2.exe", arguments); } static void CopyConfigFile(const String& installDir, const String& sourceConfigPath, size_t skelPrefixLength) { - String relativeConfigPath = sourceConfigPath.SubStr(installDir.GetLength() + skelPrefixLength); + String relativeConfigPath = sourceConfigPath.SubStr(skelPrefixLength); String targetConfigPath = installDir + relativeConfigPath; @@ -74,29 +74,74 @@ static void CopyConfigFile(const String& installDir, const String& sourceConfigP } } +static String GetNSISInstallPath(void) +{ + HKEY hKey; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Icinga Development Team\\ICINGA2", 0, + KEY_QUERY_VALUE | KEY_WOW64_32KEY, &hKey) == ERROR_SUCCESS) { + BYTE pvData[MAX_PATH]; + DWORD cbData = sizeof(pvData) - 1; + DWORD lType; + if (RegQueryValueEx(hKey, NULL, NULL, &lType, pvData, &cbData) == ERROR_SUCCESS && lType == REG_SZ) { + pvData[cbData] = '\0'; + + return (char *)pvData; + } + + RegCloseKey(hKey); + } + + return ""; +} + +static int UpgradeNSIS(void) +{ + String installPath = GetNSISInstallPath(); + + if (installPath.IsEmpty()) + return 0; + + if (!Utility::PathExists(installPath + "\\uninstall.exe")) + return 0; + + ExecuteCommand(installPath + "\\uninstall.exe", "/S"); + + String dataPath = Utility::GetIcingaDataPath(); + + if (!Utility::PathExists(dataPath)) + CreateSymbolicLink(dataPath.CStr(), installPath.CStr(), SYMBOLIC_LINK_FLAG_DIRECTORY); + + return 0; +} + static int InstallIcinga(void) { - String installDir = GetIcingaInstallDir(); + UpgradeNSIS(); - ExecuteCommand("icacls", "\"" + installDir + "\" /grant *S-1-5-20:(oi)(ci)m"); - ExecuteCommand("icacls", "\"" + installDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); + String installDir = GetIcingaInstallPath(); + String dataDir = Utility::GetIcingaDataPath(); - Utility::MkDirP(installDir + "/etc/icinga2/pki", 0700); - Utility::MkDirP(installDir + "/var/cache/icinga2", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/pki", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/agent/inventory", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/api/config", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/api/log", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/api/zones", 0700); - Utility::MkDirP(installDir + "/var/lib/icinga2/api/zones", 0700); - Utility::MkDirP(installDir + "/var/log/icinga2/compat/archive", 0700); - Utility::MkDirP(installDir + "/var/log/icinga2/crash", 0700); - Utility::MkDirP(installDir + "/var/run/icinga2/cmd", 0700); - Utility::MkDirP(installDir + "/var/spool/icinga2/perfdata", 0700); - Utility::MkDirP(installDir + "/var/spool/icinga2/tmp", 0700); + Utility::MkDirP(dataDir, 0700); + + ExecuteCommand("icacls", "\"" + dataDir + "\" /grant *S-1-5-20:(oi)(ci)m"); + ExecuteCommand("icacls", "\"" + dataDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); + + Utility::MkDirP(dataDir + "/etc/icinga2/pki", 0700); + Utility::MkDirP(dataDir + "/var/cache/icinga2", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/pki", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/agent/inventory", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/api/config", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/api/log", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/api/zones", 0700); + Utility::MkDirP(dataDir + "/var/lib/icinga2/api/zones", 0700); + Utility::MkDirP(dataDir + "/var/log/icinga2/compat/archive", 0700); + Utility::MkDirP(dataDir + "/var/log/icinga2/crash", 0700); + Utility::MkDirP(dataDir + "/var/run/icinga2/cmd", 0700); + Utility::MkDirP(dataDir + "/var/spool/icinga2/perfdata", 0700); + Utility::MkDirP(dataDir + "/var/spool/icinga2/tmp", 0700); String skelDir = "/share/skel"; - Utility::GlobRecursive(installDir + skelDir, "*", boost::bind(&CopyConfigFile, installDir, _1, skelDir.GetLength()), GlobFile); + Utility::GlobRecursive(installDir + skelDir, "*", boost::bind(&CopyConfigFile, dataDir, _1, installDir.GetLength() + skelDir.GetLength()), GlobFile); ExecuteIcingaCommand("--scm-install daemon"); diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 8d6466839..0b09516b7 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -56,6 +56,7 @@ # include # include # include +# include #endif /*_WIN32*/ using namespace icinga; @@ -1883,4 +1884,12 @@ String Utility::GetIcingaInstallPath(void) return ""; } +String Utility::GetIcingaDataPath(void) +{ + char path[MAX_PATH]; + if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, path))) + return ""; + return String(path) + "\\icinga2"; +} + #endif /* _WIN32 */ \ No newline at end of file diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index 9af1b8f8a..c1c50cc53 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -145,6 +145,7 @@ public: #ifdef _WIN32 static String GetIcingaInstallPath(void); + static String GetIcingaDataPath(void); #endif /* _WIN32 */ private: diff --git a/lib/checker/CMakeLists.txt b/lib/checker/CMakeLists.txt index 8777e0640..cdbf1a9a5 100644 --- a/lib/checker/CMakeLists.txt +++ b/lib/checker/CMakeLists.txt @@ -45,10 +45,7 @@ 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\")") else() - install( - FILES ${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/checker.conf - DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled - ) + install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/checker.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) endif() install( diff --git a/lib/notification/CMakeLists.txt b/lib/notification/CMakeLists.txt index f05180149..22ebb482b 100644 --- a/lib/notification/CMakeLists.txt +++ b/lib/notification/CMakeLists.txt @@ -45,10 +45,7 @@ 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\")") else() - install( - FILES ${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/notification.conf - DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled - ) + install_if_not_exists(${PROJECT_SOURCE_DIR}/etc/icinga2/features-enabled/notification.conf ${CMAKE_INSTALL_SYSCONFDIR}/icinga2/features-enabled) endif() install(TARGETS notification RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/icinga2) From c1a31afb3b3f53b7b801a1ac57965a6a2130d15d Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 1 Apr 2016 10:06:26 +0200 Subject: [PATCH 45/86] Docs: Fix url for Icinga Web 2 installation docs refs #11494 From 909845c45628c5b21d9eb048c72c25aac139c468 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 1 Apr 2016 11:40:01 +0200 Subject: [PATCH 46/86] Fix incorrect path for the X509 certificates on Windows refs #11449 --- agent/windows-setup-agent/Program.cs | 13 +++++++++++-- agent/windows-setup-agent/SetupWizard.cs | 13 ++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/agent/windows-setup-agent/Program.cs b/agent/windows-setup-agent/Program.cs index 3dcd3de75..e132bc1b1 100644 --- a/agent/windows-setup-agent/Program.cs +++ b/agent/windows-setup-agent/Program.cs @@ -45,7 +45,16 @@ namespace Icinga } } - public static void FatalError(Form owner, string message) + public static string Icinga2DataDir + { + get + { + return Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\icinga2"; + } + } + + + public static void FatalError(Form owner, string message) { MessageBox.Show(owner, message, "Icinga 2 Setup Wizard", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); @@ -69,7 +78,7 @@ namespace Icinga Form form; - if (File.Exists(installDir + "\\etc\\icinga2\\features-enabled\\api.conf")) + if (File.Exists(Program.Icinga2DataDir + "\\etc\\icinga2\\features-enabled\\api.conf")) form = new ServiceStatus(); else form = new SetupWizard(); diff --git a/agent/windows-setup-agent/SetupWizard.cs b/agent/windows-setup-agent/SetupWizard.cs index 6bc13c7ff..ada117674 100644 --- a/agent/windows-setup-agent/SetupWizard.cs +++ b/agent/windows-setup-agent/SetupWizard.cs @@ -65,7 +65,7 @@ namespace Icinga { FileStream fp = null; try { - fp = File.Open(Program.Icinga2InstallDir + String.Format("\\etc\\icinga2\\features-enabled\\{0}.conf", feature), FileMode.Create); + fp = File.Open(Program.Icinga2DataDir + String.Format("\\etc\\icinga2\\features-enabled\\{0}.conf", feature), FileMode.Create); using (StreamWriter sw = new StreamWriter(fp, Encoding.ASCII)) { fp = null; sw.Write(String.Format("include \"../features-available/{0}.conf\"\n", feature)); @@ -144,8 +144,7 @@ namespace Icinga { SetRetrievalStatus(25); - string pathPrefix = Program.Icinga2InstallDir + "\\etc\\icinga2\\pki\\" + txtInstanceName.Text; - + string pathPrefix = Program.Icinga2DataDir + "\\etc\\icinga2\\pki\\" + txtInstanceName.Text; string output; if (!File.Exists(pathPrefix + ".crt")) { @@ -355,8 +354,8 @@ namespace Icinga thread.Start(); } - /*if (tbcPages.SelectedTab == tabParameters && - !File.Exists(Icinga2InstallDir + "\\etc\\icinga2\\pki\\agent\\agent.crt")) { + /*if (tbcPages.SelectedTab == tabParameters && + !File.Exists(Icinga2DataDir + "\\etc\\icinga2\\pki\\agent\\agent.crt")) { byte[] bytes = Convert.FromBase64String(txtBundle.Text); MemoryStream ms = new MemoryStream(bytes); GZipStream gz = new GZipStream(ms, CompressionMode.Decompress); @@ -368,10 +367,10 @@ namespace Icinga ms2.Write(buffer, 0, rc); ms2.Position = 0; TarReader tr = new TarReader(ms2); - tr.ReadToEnd(Icinga2InstallDir + "\\etc\\icinga2\\pki\\agent"); + tr.ReadToEnd(Icinga2DataDir + "\\etc\\icinga2\\pki\\agent"); }*/ - if (tbcPages.SelectedTab == tabConfigure) { + if (tbcPages.SelectedTab == tabConfigure) { Thread thread = new Thread(ConfigureService); thread.Start(); } From 5910f2e31063fbcf0fdc6ed355afde777c0c3a9b Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Mon, 4 Apr 2016 16:38:47 +0200 Subject: [PATCH 47/86] API: Ensure that empty passwords w/ client_cn are properly checked fixes #11482 --- 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 d78ced453..f4aa24f42 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -144,12 +144,16 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request) ApiUser::Ptr user; + /* client_cn matched. */ if (m_ApiUser) user = m_ApiUser; else { user = ApiUser::GetByName(username); - if (user && user->GetPassword() != password) + /* Deny authentication if 1) given password is empty 2) configured password does not match. */ + if (password.IsEmpty()) + user.reset(); + else if (user && user->GetPassword() != password) user.reset(); } From 1a2129380927f48a4f7d473d2e4ee4c5e9f24562 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 7 Apr 2016 15:07:17 +0200 Subject: [PATCH 48/86] Implement support for overriding check command timeout fixes #9283 --- doc/6-object-types.md | 2 ++ lib/icinga/checkable.ti | 1 + lib/icinga/pluginutility.cpp | 7 ++++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/6-object-types.md b/doc/6-object-types.md index 1f1a041fa..28c588a8f 100644 --- a/doc/6-object-types.md +++ b/doc/6-object-types.md @@ -562,6 +562,7 @@ Configuration Attributes: check\_command |**Required.** The name of the check command. max\_check\_attempts|**Optional.** The number of times a host is re-checked before changing into a hard state. Defaults to 3. check\_period |**Optional.** The name of a time period which determines when this host should be checked. Not set by default. + check\_timeout |**Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval |**Optional.** The check interval (in seconds). This interval is used for checks when the host is in a `HARD` state. Defaults to 5 minutes. retry\_interval |**Optional.** The retry interval (in seconds). This interval is used for checks when the host is in a `SOFT` state. Defaults to 1 minute. enable\_notifications|**Optional.** Whether notifications are enabled. Defaults to true. @@ -1182,6 +1183,7 @@ Configuration Attributes: check\_command |**Required.** The name of the check command. max\_check\_attempts|**Optional.** The number of times a service is re-checked before changing into a hard state. Defaults to 3. check\_period |**Optional.** The name of a time period which determines when this service should be checked. Not set by default. + check\_timeout |**Optional.** Check command timeout in seconds. Overrides the CheckCommand's `timeout` attribute. check\_interval |**Optional.** The check interval (in seconds). This interval is used for checks when the service is in a `HARD` state. Defaults to 5 minutes. retry\_interval |**Optional.** The retry interval (in seconds). This interval is used for checks when the service is in a `SOFT` state. Defaults to 1 minute. enable\_notifications|**Optional.** Whether notifications are enabled. Defaults to true. diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index d94aeb5f7..f3621e8f7 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -57,6 +57,7 @@ abstract class Checkable : CustomVarObject return TimePeriod::GetByName(GetCheckPeriodRaw()); }}} }; + [config] Value check_timeout; [config] double check_interval { default {{{ return 5 * 60; }}} }; diff --git a/lib/icinga/pluginutility.cpp b/lib/icinga/pluginutility.cpp index 803b9e7a0..bdc4a74bb 100644 --- a/lib/icinga/pluginutility.cpp +++ b/lib/icinga/pluginutility.cpp @@ -88,7 +88,12 @@ void PluginUtility::ExecuteCommand(const Command::Ptr& commandObj, const Checkab return; Process::Ptr process = new Process(Process::PrepareCommand(command), envMacros); - process->SetTimeout(commandObj->GetTimeout()); + + if (checkable->GetCheckTimeout().IsEmpty()) + process->SetTimeout(commandObj->GetTimeout()); + else + process->SetTimeout(checkable->GetCheckTimeout()); + process->Run(boost::bind(callback, command, _1)); } From 9156da566a098a945912b33eca5481766eb649ba Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Apr 2016 14:15:49 +0200 Subject: [PATCH 49/86] Fix incorrect link in the documentation fixes #11564 --- doc/9-icinga2-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/9-icinga2-api.md b/doc/9-icinga2-api.md index 99bf284a9..b10853e4b 100644 --- a/doc/9-icinga2-api.md +++ b/doc/9-icinga2-api.md @@ -194,7 +194,7 @@ custom attribute `os` that matches the regular expression `^Linux`. } ] -More information about filters can be found in the [filters](#9-icinga2-api.md#icinga2-api-filters) chapter. +More information about filters can be found in the [filters](9-icinga2-api.md#icinga2-api-filters) chapter. Available permissions for specific URL endpoints: From b27455c8654ef698aabca6dd2cc76e95794e5fab Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Apr 2016 13:41:29 +0200 Subject: [PATCH 50/86] Add new images for the Windows installer refs #11449 --- CMakeLists.txt | 2 ++ agent/bannrbmp.bmp | Bin 0 -> 29914 bytes agent/dlgbmp.bmp | Bin 0 -> 155898 bytes 3 files changed, 2 insertions(+) create mode 100644 agent/bannrbmp.bmp create mode 100644 agent/dlgbmp.bmp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d7ba3404..b682b07bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,6 +305,8 @@ set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch") set(CPACK_WIX_EXTENSIONS "WixUtilExtension") +set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/agent/bannrbmp.bmp") +set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/agent/dlgbmp.bmp") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/agent/bannrbmp.bmp b/agent/bannrbmp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..51c3890b72e441012e6d64cadb771afb53cc6e9b GIT binary patch literal 29914 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 HQSkmhYo%t0 literal 0 HcmV?d00001 From 97303d70784902a78772063cd5cb50a45fb8877b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Apr 2016 18:15:14 +0200 Subject: [PATCH 51/86] Remove 1px border around the dialog banner image refs #11449 --- agent/dlgbmp.bmp | Bin 155898 -> 155830 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agent/dlgbmp.bmp b/agent/dlgbmp.bmp index 6fce0315d9a8c97964c9a73578b98ad68af3a3dc..d998f74eb30b7f407468368634d6b31caad17505 100644 GIT binary patch delta 382 zcmex$kaOEXPJSofZ3#>aAYjJAz@RaaUtweM>b%JlSo${0urg)gWUR8@&i0z|1S3#^ z{PwqR7%xItci%x++}n44V0;P^5Yx+4}CbsSKzA!#O;`V)ma<^CffT-i% zp7{%+mw$WgAI66u#RA*?{z23UZnbB+4-wL1Vgj2aFjgYnCvK)g=mH liEnQehgd1Ly+jgXsMz)tX-t-jJVZ=l^1ZT(&2p?h_5fbkhq3?w literal 155898 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 HQSkmhYo%t0 From 1c199e3edba2277533eeca30d4ab6ff85b928831 Mon Sep 17 00:00:00 2001 From: Thomas Widhalm Date: Fri, 8 Apr 2016 18:41:24 +0200 Subject: [PATCH 52/86] Docs: Change the silent installation modifiers for the new msi packages fixes #11437 Signed-off-by: Gunnar Beutner --- doc/11-icinga2-client.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/doc/11-icinga2-client.md b/doc/11-icinga2-client.md index ca07c9829..c8b521fba 100644 --- a/doc/11-icinga2-client.md +++ b/doc/11-icinga2-client.md @@ -421,13 +421,17 @@ Requirements: * Windows Vista/Server 2008 or higher * [Microsoft .NET Framework 2.0](http://www.microsoft.com/de-de/download/details.aspx?id=1639) if not already installed. -The installer package includes the [NSClient++](http://www.nsclient.org/) so Icinga 2 can use its built-in plugins. You can use [predefined commands from the ITL](7-icinga-template-library.md#nscp-plugin-check-commands) for these plugins. +The installer package includes the [NSClient++](http://www.nsclient.org/) so Icinga 2 can +use its built-in plugins. You can use [predefined commands from the ITL](7-icinga-template-library.md#nscp-plugin-check-commands) for these plugins. -If you want to install the Client silently / unattended use the `/S` modifier. Using `/D` allows for changing the location where the Client will be installed. +If you want to install the client silently / unattended use the `/qn` modifier. The +installation should not trigger a restart but if you want to be completly sure, you can use the `/norestart` modifier. - C:> Icinga2-v2.4.4.exe /S /D=D:\tools\monitoring + C:> msiexec /i C:\Icinga2-v2.4.5-x86.msi /qn /norestart -After the installation you can run Icinga 2 from the Start menu. (The graphical installer will offer to run Icinga 2 right after the installation) On the first start Icinga 2 will show you the setup wizard which will help you with SSL certificate generation, +After the installation you can run Icinga 2 from the Start menu. (The graphical installer will +offer to run Icinga 2 right after the installation) On the first start Icinga 2 will show you +the setup wizard which will help you with SSL certificate generation, CSR-Autosigning and configuration setup. You'll need the following configuration details: @@ -442,7 +446,10 @@ for CSR Auto-Signing Besides the configuration changes, the setup wizard offers you to install the included NSClient++ package. -Once install and configuration is done, Icinga 2 is automatically started as a Windows service. Running Icinga 2 again from the Start menu will allow you to change the settings from the the first setup wizard run. Please keep in mind that you can change all those settings within the configuration file and on the commandline. +Once install and configuration is done, Icinga 2 is automatically started as a Windows service. +Running Icinga 2 again from the Start menu will allow you to change the settings from the the first +setup wizard run. Please keep in mind that you can change all those settings within the configuration +file and on the commandline. The Icinga 2 configuration is located inside the installation path and can be edited with your favorite editor. @@ -451,7 +458,9 @@ Configuration validation is done similar to the linux pendant on the Windows she C:> icinga2.exe daemon -C - +> **Note** +> +> You have to run this command in a shell with `administrator` permissions. ## Client Configuration Modes From 301455db972892613561b282bf6b5aa03b5fd5a8 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 12 Apr 2016 11:25:44 +0200 Subject: [PATCH 53/86] Don't overwrite config files on *NIX fixes #11542 --- cmake/InstallConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index e4af25d5e..7f70177f9 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -26,7 +26,7 @@ function(install_if_not_exists src dest) string(REPLACE "/" "\\\\" nsis_dest_dir "${real_dest}") string(REPLACE "/" "\\\\" nsis_dest "${real_dest}/${basename_dest}") install(CODE " - if(\${CMAKE_INSTALL_PREFIX} MATCHES .*/_CPack_Packages/.* OR NOT EXISTS \"\$ENV{DESTDIR}${dest}/${src_name}\") + 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/\") From 159681c390bd18aba2f08890d2ff2f7a82100547 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 12 Apr 2016 12:04:38 +0200 Subject: [PATCH 54/86] Fix crash in Downtime::DowntimesExpireTimerHandler fixes #11534 fixes #11559 --- lib/icinga/comment.cpp | 2 +- lib/icinga/downtime.cpp | 2 +- lib/notification/notificationcomponent.cpp | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/icinga/comment.cpp b/lib/icinga/comment.cpp index b411a4143..85c5f1a17 100644 --- a/lib/icinga/comment.cpp +++ b/lib/icinga/comment.cpp @@ -244,7 +244,7 @@ void Comment::CommentsExpireTimerHandler(void) } BOOST_FOREACH(const Comment::Ptr& comment, comments) { - if (comment->IsExpired()) + if (comment->IsActive() && comment->IsExpired()) RemoveComment(comment->GetName()); } } diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index d7668f795..2d1838302 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -358,7 +358,7 @@ void Downtime::DowntimesExpireTimerHandler(void) } BOOST_FOREACH(const Downtime::Ptr& downtime, downtimes) { - if (downtime->IsExpired()) + if (downtime->IsActive() && downtime->IsExpired()) RemoveDowntime(downtime->GetName(), false, true); } } diff --git a/lib/notification/notificationcomponent.cpp b/lib/notification/notificationcomponent.cpp index 3a1cf54de..abf1d7d75 100644 --- a/lib/notification/notificationcomponent.cpp +++ b/lib/notification/notificationcomponent.cpp @@ -72,6 +72,9 @@ void NotificationComponent::NotificationTimerHandler(void) double now = Utility::GetTime(); BOOST_FOREACH(const Notification::Ptr& notification, ConfigType::GetObjectsByType()) { + if (!notification->IsActive()) + continue; + Checkable::Ptr checkable = notification->GetCheckable(); if (checkable->IsPaused() && GetEnableHA()) From b7ccce9d834a5bc7aa03348092fe95f41c65e006 Mon Sep 17 00:00:00 2001 From: Rune Darrud Date: Mon, 14 Mar 2016 20:44:58 +0100 Subject: [PATCH 55/86] Add the Icinga2SetupAgent.exe.config to Windows installer fixes #10624 --- agent/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/CMakeLists.txt b/agent/CMakeLists.txt index 3eecc7548..8d1fba821 100644 --- a/agent/CMakeLists.txt +++ b/agent/CMakeLists.txt @@ -24,7 +24,7 @@ if(MSVC) ) install( - FILES ${CMAKE_CURRENT_SOURCE_DIR}/windows-setup-agent/bin/\${CMAKE_INSTALL_CONFIG_NAME}/Icinga2SetupAgent.exe + FILES ${CMAKE_CURRENT_SOURCE_DIR}/windows-setup-agent/bin/\${CMAKE_INSTALL_CONFIG_NAME}/Icinga2SetupAgent.exe ${CMAKE_CURRENT_SOURCE_DIR}/windows-setup-agent/bin/\${CMAKE_INSTALL_CONFIG_NAME}/Icinga2SetupAgent.exe.config DESTINATION ${CMAKE_INSTALL_SBINDIR} ) endif() From ea47e5552b1a85af747c02755d6c6f0bacda6fe8 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 12 Apr 2016 12:22:46 +0200 Subject: [PATCH 56/86] Update banner for the Windows setup wizard refs #11449 --- agent/windows-setup-agent/icinga-banner.png | Bin 25166 -> 1958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agent/windows-setup-agent/icinga-banner.png b/agent/windows-setup-agent/icinga-banner.png index e80f25b3d62c8aa958be9dde55aea066d28ef4aa..de4f5620d02de323add4047a8c8810a4dd242443 100644 GIT binary patch literal 1958 zcmcIl`8V5H8^35r?We_fi>T4kBc^7oQPHZ2rD`XkwU^kU)Ecc&)1kbrUB?y)qpc7$ zRP0-OMzsu5m4qTul-k0K#IAV1Ge5j<|AF_M`?>d?=iGar=lR_Gxz9sKdn+k%MR5Rt zl=W3}X8?pFp}E}&VW_w4tH^-{v52cTq5+WZ`5QuSZ&zU z0a+}p&CSqvCRVxcLS;jg->y4ZY8=-KSG|aRe8N(0MmzIwk~PLKj&_z ztN1OO6l2B963Tp{;d?etA^@b}iP=y)si5g;pVm_EKhRJMFEwx zd30mEHaZMSts3$K|6EoT7pKd7kans?mCaa|Z3! zXc?y+XCcfm-dtKOe!$M0S!ZE~>x4H+k*T2~V5eDm)t!hP{!J z_6+*Of!PeKL`w)%xxkziP^Isz?0f=^p;Pfm)0~oe77v>)PZNhS;HF*MPhN;p)H(%) zT(PcyvscsS|{>r<5z)BN|9u3bdc|X1}?+Pur4c z!Z%-E_oPbzBcUw3Nt0tJ!SZVN1V6!h%Pne3L>qyiK6%07^*K?>7d~rLwAy}i!0^ZH zw7rRZN_l7C0oQ}M+^^KY^lMRORlG*49T~R0Z`y3U@P=#cs4H+4XOVvBmBuFV4t;ON z_Q;pbuda=xBR(mYO75vo{W0maGBW`24<+PmPE0K&Kg_O{Ru3PTKe-)uE>__sW_6bnV~W z{C1jgih%8^ySUwXK#~_TqW_4L{g{ZxG`-xI&Fq|qq8cHG@-6P)$3O~_Q6rz|h>w4M zRrT}+A*(WLR#DW;b8@2MxETG*nX;~6>iafiv>8)hOEIF^6_;@N_q|!W@=;nGx91f+ zSUnqKm~A{0A7|z5MSeDj76v3=tI6$93*r1NQ8$b`4!_22og05?tkGfW=wBmhGtWJ$ ztjWqCUZy4nTS+SbrdH2_5JR2v3`K!UYAlKdWKO31CEth7Iyfs4_)(Pe_m?& zSEJhfq9ngTC-#vgT*bZg<&#r7n>+b`@Or5NzHb113Q|NhMRtZ0A2#UC;c%V}R^)xV zLl*(dtgZ^#n`}EpgT$wlliY;H(!+sS;4y4z7gz$i)YJ5@B(Q()?+H)`0(^iYqD zJz?n6Ijp|4FfjxP<4eC;56jRtow2o< zrq%}s=6AJ5h}<(IJq9+&bhP6^To~n07!(_aQ{#&oqb=N;ujekcE}4HAe-B+YD|1GA z^bTY?AgJFUH#HHh&(#@qwp%*8-dl113r-4?mU*2=1rciG%dSB#cg6~uDjCkPe@iMv zt7H?BO1?vbD~21z-gF3(M3xmE*P|IhtTTq>Ac6O+agz>5=_C13&77?heSCb2V`w3f zJaZ;oN&=i`Qx|{ey*+C_pBjG3%?Ga`*Wxb%5>D>5L_M(@^I7iHl!8j#|Ec7>LM-~M XRk+X(a_6C93xKtSy*ceC-(UU%)NPPW literal 25166 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℞z&)Hkvf#l%7c|M8j{rO=Cq^Ze| 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 em0JA$@Bcp|3`Ro&It-}*0000 Date: Tue, 12 Apr 2016 12:27:33 +0200 Subject: [PATCH 57/86] Update Chocolatey scripts to support the new MSI package refs #11449 --- tools/chocolateyInstall.ps1 | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/chocolateyInstall.ps1 b/tools/chocolateyInstall.ps1 index bec387eca..9aab98bb7 100755 --- a/tools/chocolateyInstall.ps1 +++ b/tools/chocolateyInstall.ps1 @@ -1,7 +1,8 @@ $packageName = 'icinga2' -$installerType = 'exe' -$url = 'http://packages.icinga.org/windows/Icinga2-v2.4.4.exe' -$silentArgs = '/S' +$installerType = 'msi' +$url32 = 'http://packages.icinga.org/windows/Icinga2-snapshot-x86.msi' +$url64 = 'http://packages.icinga.org/windows/Icinga2-snapshot-x86_64.msi' +$silentArgs = '/silent' $validExitCodes = @(0) -Install-ChocolateyPackage "$packageName" "$installerType" "$silentArgs" "$url" -validExitCodes $validExitCodes +Install-ChocolateyPackage "$packageName" "$installerType" "$silentArgs" "$url32" "$url64" -validExitCodes $validExitCodes From cf954fd512f21889132e9866ee2c88a3692d1b7b Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 12 Apr 2016 13:13:21 +0200 Subject: [PATCH 58/86] Ensure that KB2999226 is installed refs #11449 --- icinga2.wixpatch | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/icinga2.wixpatch b/icinga2.wixpatch index d9ce2ceaf..58bee7292 100644 --- a/icinga2.wixpatch +++ b/icinga2.wixpatch @@ -6,6 +6,9 @@ + + + $CM_CP_sbin.icinga2_installer.exe>2 $CM_CP_sbin.icinga2_installer.exe=2 @@ -24,5 +27,15 @@ Event="DoAction" Value="LaunchIcinga2Wizard">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed + + + + + + + + - \ No newline at end of file + From d481763b0bffc8702dd2d2311d5eee14151fb937 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 12 Apr 2016 15:30:28 +0200 Subject: [PATCH 59/86] Disable MSI restart manager refs #11449 --- icinga2.wixpatch | 1 + 1 file changed, 1 insertion(+) diff --git a/icinga2.wixpatch b/icinga2.wixpatch index 58bee7292..cc89fc032 100644 --- a/icinga2.wixpatch +++ b/icinga2.wixpatch @@ -1,6 +1,7 @@ 1 + Disable From 4686d7192e0a758990a654e413d0a3005b581a06 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 13 Apr 2016 08:58:16 +0200 Subject: [PATCH 60/86] Fix compiler warning in *::NotifyActive fixes #11577 --- tools/mkclass/classcompiler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/mkclass/classcompiler.cpp b/tools/mkclass/classcompiler.cpp index d0aab97a9..60ae196c7 100644 --- a/tools/mkclass/classcompiler.cpp +++ b/tools/mkclass/classcompiler.cpp @@ -935,11 +935,11 @@ void ClassCompiler::HandleClass(const Klass& klass, const ClassDebugInfo&) << "\t" << "virtual void Notify" << it->GetFriendlyName() << "(const Value& cookie = Empty);" << std::endl; m_Impl << "void ObjectImpl<" << klass.Name << ">::Notify" << it->GetFriendlyName() << "(const Value& cookie)" << std::endl - << "{" << std::endl - << "\t" << "ConfigObject *dobj = dynamic_cast(this);" << std::endl; + << "{" << std::endl; if (it->Name != "active") { - m_Impl << "\t" << "if (!dobj || dobj->IsActive())" << std::endl + m_Impl << "\t" << "ConfigObject *dobj = dynamic_cast(this);" << std::endl + << "\t" << "if (!dobj || dobj->IsActive())" << std::endl << "\t"; } From 02e32319474b8456200e7b63ab1615da35ea91cd Mon Sep 17 00:00:00 2001 From: Rune Darrud Date: Mon, 14 Mar 2016 20:49:07 +0100 Subject: [PATCH 61/86] Remove .Net 3.5 dependency from the Chocolatey package fixes #11384 Signed-off-by: Gunnar Beutner --- icinga2.nuspec | 3 --- 1 file changed, 3 deletions(-) diff --git a/icinga2.nuspec b/icinga2.nuspec index a8990fbc3..e26d167a4 100755 --- a/icinga2.nuspec +++ b/icinga2.nuspec @@ -16,9 +16,6 @@ https://www.icinga.org/resources/faq/ false https://www.icinga.org/wp-content/uploads/2015/05/icinga_icon_128x128.png - - - From 1a3481db98a307732d051f1069f857e1aa01469c Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 13 Apr 2016 09:32:08 +0200 Subject: [PATCH 62/86] Fix installations that use DESTDIR fixes #11574 --- cmake/InstallConfig.cmake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmake/InstallConfig.cmake b/cmake/InstallConfig.cmake index 7f70177f9..7af92cf22 100644 --- a/cmake/InstallConfig.cmake +++ b/cmake/InstallConfig.cmake @@ -26,6 +26,11 @@ function(install_if_not_exists src dest) 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}) + else() + set(target_dir \$ENV{DESTDIR}) + 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/.*) @@ -34,14 +39,14 @@ function(install_if_not_exists src dest) set(skel_prefix \"\") endif() execute_process(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\" - \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/\${skel_prefix}${dest}/${src_name}\" + \"\${target_dir}/\${skel_prefix}${dest}/${src_name}\" RESULT_VARIABLE copy_result ERROR_VARIABLE error_output) if(copy_result) message(FATAL_ERROR \${error_output}) endif() else() - message(STATUS \"Skipping : \$ENV{DESTDIR}${dest}/${src_name}\") + message(STATUS \"Skipping : \${target_dir}/${dest}/${src_name}\") endif() ") endfunction(install_if_not_exists) From e1373386fa6756686b3e9450327677ad1ac22732 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 13 Apr 2016 12:02:08 +0200 Subject: [PATCH 63/86] Only hide navigational attributes which are not config/state fixes #11567 --- lib/remote/objectqueryhandler.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/remote/objectqueryhandler.cpp b/lib/remote/objectqueryhandler.cpp index ef6c937a4..111d284bc 100644 --- a/lib/remote/objectqueryhandler.cpp +++ b/lib/remote/objectqueryhandler.cpp @@ -94,12 +94,8 @@ Dictionary::Ptr ObjectQueryHandler::SerializeObjectAttrs(const Object::Ptr& obje continue; /* hide internal navigation fields */ - if (field.Attributes & FANavigation) { - Value nval = object->NavigateField(fid); - - if (val == nval) - continue; - } + if (field.Attributes & FANavigation && !(field.Attributes & (FAConfig | FAState))) + continue; Value sval = Serialize(val, FAConfig | FAState); resultAttrs->Set(field.Name, sval); From 6e2e90cc625ef8f15753764db786f2a25c417483 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 13 Apr 2016 13:43:38 +0200 Subject: [PATCH 64/86] Make sure the etc and var directories are in the common data directory refs #11449 --- .../ServiceStatus.Designer.cs | 168 ++++++++++-------- agent/windows-setup-agent/ServiceStatus.cs | 7 +- icinga-installer/icinga-installer.cpp | 57 +++++- 3 files changed, 150 insertions(+), 82 deletions(-) diff --git a/agent/windows-setup-agent/ServiceStatus.Designer.cs b/agent/windows-setup-agent/ServiceStatus.Designer.cs index 23973d500..874f29672 100644 --- a/agent/windows-setup-agent/ServiceStatus.Designer.cs +++ b/agent/windows-setup-agent/ServiceStatus.Designer.cs @@ -28,82 +28,95 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceStatus)); - this.picBanner = new System.Windows.Forms.PictureBox(); - this.lblStatus = new System.Windows.Forms.Label(); - this.txtStatus = new System.Windows.Forms.TextBox(); - this.btnReconfigure = new System.Windows.Forms.Button(); - this.btnOK = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.picBanner)).BeginInit(); - this.SuspendLayout(); - // - // picBanner - // - this.picBanner.Image = global::Icinga.Properties.Resources.icinga_banner; - this.picBanner.Location = new System.Drawing.Point(0, 0); - this.picBanner.Name = "picBanner"; - this.picBanner.Size = new System.Drawing.Size(625, 77); - this.picBanner.TabIndex = 2; - this.picBanner.TabStop = false; - // - // lblStatus - // - this.lblStatus.AutoSize = true; - this.lblStatus.Location = new System.Drawing.Point(12, 105); - this.lblStatus.Name = "lblStatus"; - this.lblStatus.Size = new System.Drawing.Size(79, 13); - this.lblStatus.TabIndex = 3; - this.lblStatus.Text = "Service Status:"; - // - // txtStatus - // - this.txtStatus.Location = new System.Drawing.Point(97, 102); - this.txtStatus.Name = "txtStatus"; - this.txtStatus.ReadOnly = true; - this.txtStatus.Size = new System.Drawing.Size(278, 20); - this.txtStatus.TabIndex = 2; - // - // btnReconfigure - // - this.btnReconfigure.Location = new System.Drawing.Point(219, 143); - this.btnReconfigure.Name = "btnReconfigure"; - this.btnReconfigure.Size = new System.Drawing.Size(75, 23); - this.btnReconfigure.TabIndex = 1; - this.btnReconfigure.Text = "Reconfigure"; - this.btnReconfigure.UseVisualStyleBackColor = true; - this.btnReconfigure.Click += new System.EventHandler(this.btnReconfigure_Click); - // - // btnOK - // - this.btnOK.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnOK.Location = new System.Drawing.Point(300, 143); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(75, 23); - this.btnOK.TabIndex = 0; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // ServiceStatus - // - this.AcceptButton = this.btnOK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.btnOK; - this.ClientSize = new System.Drawing.Size(391, 186); - this.Controls.Add(this.btnOK); - this.Controls.Add(this.btnReconfigure); - this.Controls.Add(this.txtStatus); - this.Controls.Add(this.lblStatus); - this.Controls.Add(this.picBanner); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.Name = "ServiceStatus"; - this.Text = "Icinga 2 Service Status"; - ((System.ComponentModel.ISupportInitialize)(this.picBanner)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceStatus)); + this.picBanner = new System.Windows.Forms.PictureBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.txtStatus = new System.Windows.Forms.TextBox(); + this.btnReconfigure = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnOpenConfigDir = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.picBanner)).BeginInit(); + this.SuspendLayout(); + // + // picBanner + // + this.picBanner.Image = global::Icinga.Properties.Resources.icinga_banner; + this.picBanner.Location = new System.Drawing.Point(0, 0); + this.picBanner.Name = "picBanner"; + this.picBanner.Size = new System.Drawing.Size(625, 77); + this.picBanner.TabIndex = 2; + this.picBanner.TabStop = false; + // + // lblStatus + // + this.lblStatus.AutoSize = true; + this.lblStatus.Location = new System.Drawing.Point(12, 105); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(79, 13); + this.lblStatus.TabIndex = 3; + this.lblStatus.Text = "Service Status:"; + // + // txtStatus + // + this.txtStatus.Location = new System.Drawing.Point(97, 102); + this.txtStatus.Name = "txtStatus"; + this.txtStatus.ReadOnly = true; + this.txtStatus.Size = new System.Drawing.Size(278, 20); + this.txtStatus.TabIndex = 3; + // + // btnReconfigure + // + this.btnReconfigure.Location = new System.Drawing.Point(195, 143); + this.btnReconfigure.Name = "btnReconfigure"; + this.btnReconfigure.Size = new System.Drawing.Size(89, 23); + this.btnReconfigure.TabIndex = 1; + this.btnReconfigure.Text = "Reconfigure"; + this.btnReconfigure.UseVisualStyleBackColor = true; + this.btnReconfigure.Click += new System.EventHandler(this.btnReconfigure_Click); + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnOK.Location = new System.Drawing.Point(290, 143); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(89, 23); + this.btnOK.TabIndex = 0; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnOpenConfigDir + // + this.btnOpenConfigDir.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnOpenConfigDir.Location = new System.Drawing.Point(100, 143); + this.btnOpenConfigDir.Name = "btnOpenConfigDir"; + this.btnOpenConfigDir.Size = new System.Drawing.Size(89, 23); + this.btnOpenConfigDir.TabIndex = 2; + this.btnOpenConfigDir.Text = "Examine Config"; + this.btnOpenConfigDir.UseVisualStyleBackColor = true; + this.btnOpenConfigDir.Click += new System.EventHandler(this.btnOpenConfigDir_Click); + // + // ServiceStatus + // + this.AcceptButton = this.btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnOK; + this.ClientSize = new System.Drawing.Size(391, 186); + this.Controls.Add(this.btnOpenConfigDir); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.btnReconfigure); + this.Controls.Add(this.txtStatus); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.picBanner); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "ServiceStatus"; + this.Text = "Icinga 2 Service Status"; + ((System.ComponentModel.ISupportInitialize)(this.picBanner)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -114,5 +127,6 @@ private System.Windows.Forms.TextBox txtStatus; private System.Windows.Forms.Button btnReconfigure; private System.Windows.Forms.Button btnOK; - } + private System.Windows.Forms.Button btnOpenConfigDir; + } } \ No newline at end of file diff --git a/agent/windows-setup-agent/ServiceStatus.cs b/agent/windows-setup-agent/ServiceStatus.cs index 3f9ae1ada..cdceb99b8 100644 --- a/agent/windows-setup-agent/ServiceStatus.cs +++ b/agent/windows-setup-agent/ServiceStatus.cs @@ -6,6 +6,7 @@ using System.Drawing; using System.Text; using System.Windows.Forms; using System.ServiceProcess; +using System.Diagnostics; namespace Icinga { @@ -33,5 +34,9 @@ namespace Icinga { Close(); } - } + + private void btnOpenConfigDir_Click(object sender, EventArgs e) { + Process.Start("explorer.exe", Program.Icinga2DataDir + "\\etc\\icinga2"); + } + } } diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index a91c8b3ff..e5560a965 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -19,6 +19,7 @@ #include "base/utility.hpp" #include "base/application.hpp" +#include #include using namespace icinga; @@ -48,7 +49,7 @@ static bool ExecuteCommand(const String& app, const String& arguments) WaitForSingleObject(sei.hProcess, INFINITE); DWORD exitCode; - bool res = GetExitCodeProcess(sei.hProcess, &exitCode); + BOOL res = GetExitCodeProcess(sei.hProcess, &exitCode); CloseHandle(sei.hProcess); if (!res) @@ -94,6 +95,41 @@ static String GetNSISInstallPath(void) return ""; } +static void CollectPaths(std::vector& paths, const String& path) +{ + paths.push_back(path); +} + +static bool MoveDirectory(const String& source, const String& destination) +{ + if (!MoveFileEx(source.CStr(), destination.CStr(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) { + // SHFileOperation requires file names to be terminated with two \0s + String tmpSource = source + String(1, '\0'); + String tmpDestination = destination + String(1, '\0'); + + SHFILEOPSTRUCT fop; + fop.wFunc = FO_COPY; + fop.pFrom = tmpSource.CStr(); + fop.pTo = tmpDestination.CStr(); + fop.fFlags = FOF_NO_UI; + if (SHFileOperation(&fop) != 0) + return false; + + std::vector paths; + paths.push_back(source); + Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobDirectory); + Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobFile); + + std::reverse(paths.begin(), paths.end()); + + BOOST_FOREACH(const String& path, paths) { + (void)MoveFileEx(path.CStr(), NULL, MOVEFILE_DELAY_UNTIL_REBOOT); + } + } + + return true; +} + static int UpgradeNSIS(void) { String installPath = GetNSISInstallPath(); @@ -108,15 +144,28 @@ static int UpgradeNSIS(void) String dataPath = Utility::GetIcingaDataPath(); - if (!Utility::PathExists(dataPath)) - CreateSymbolicLink(dataPath.CStr(), installPath.CStr(), SYMBOLIC_LINK_FLAG_DIRECTORY); + /* perform open heart surgery on the user's data dirs - yay */ + if (!Utility::PathExists(dataPath)) { + Utility::MkDirP(dataPath, 0700); + + String oldNameEtc = installPath + "\\etc"; + String newNameEtc = dataPath + "\\etc"; + if (!MoveDirectory(oldNameEtc, newNameEtc)) + return 1; + + String oldNameVar = installPath + "\\var"; + String newNameVar = dataPath + "\\var"; + if (!MoveDirectory(oldNameVar, newNameVar)) + return 1; + } return 0; } static int InstallIcinga(void) { - UpgradeNSIS(); + if (UpgradeNSIS() != 0) + return 1; String installDir = GetIcingaInstallPath(); String dataDir = Utility::GetIcingaDataPath(); From 1871bc93826d8a7cc189770bf3cabe2e6755eb3a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 13 Apr 2016 21:44:15 +0200 Subject: [PATCH 65/86] Replace the agent wizard banner refs #11449 --- agent/windows-setup-agent/icinga-banner.png | Bin 1958 -> 16939 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agent/windows-setup-agent/icinga-banner.png b/agent/windows-setup-agent/icinga-banner.png index de4f5620d02de323add4047a8c8810a4dd242443..b570ecf41097ae86adff2d7be96dfae71e6afa14 100644 GIT binary patch literal 16939 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

c`~0$I}SX-g(PrtQ?ZSx7w`-Y_CYTxz)wk>h(v% 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 literal 1958 zcmcIl`8V5H8^35r?We_fi>T4kBc^7oQPHZ2rD`XkwU^kU)Ecc&)1kbrUB?y)qpc7$ zRP0-OMzsu5m4qTul-k0K#IAV1Ge5j<|AF_M`?>d?=iGar=lR_Gxz9sKdn+k%MR5Rt zl=W3}X8?pFp}E}&VW_w4tH^-{v52cTq5+WZ`5QuSZ&zU z0a+}p&CSqvCRVxcLS;jg->y4ZY8=-KSG|aRe8N(0MmzIwk~PLKj&_z ztN1OO6l2B963Tp{;d?etA^@b}iP=y)si5g;pVm_EKhRJMFEwx zd30mEHaZMSts3$K|6EoT7pKd7kans?mCaa|Z3! zXc?y+XCcfm-dtKOe!$M0S!ZE~>x4H+k*T2~V5eDm)t!hP{!J z_6+*Of!PeKL`w)%xxkziP^Isz?0f=^p;Pfm)0~oe77v>)PZNhS;HF*MPhN;p)H(%) zT(PcyvscsS|{>r<5z)BN|9u3bdc|X1}?+Pur4c z!Z%-E_oPbzBcUw3Nt0tJ!SZVN1V6!h%Pne3L>qyiK6%07^*K?>7d~rLwAy}i!0^ZH zw7rRZN_l7C0oQ}M+^^KY^lMRORlG*49T~R0Z`y3U@P=#cs4H+4XOVvBmBuFV4t;ON z_Q;pbuda=xBR(mYO75vo{W0maGBW`24<+PmPE0K&Kg_O{Ru3PTKe-)uE>__sW_6bnV~W z{C1jgih%8^ySUwXK#~_TqW_4L{g{ZxG`-xI&Fq|qq8cHG@-6P)$3O~_Q6rz|h>w4M zRrT}+A*(WLR#DW;b8@2MxETG*nX;~6>iafiv>8)hOEIF^6_;@N_q|!W@=;nGx91f+ zSUnqKm~A{0A7|z5MSeDj76v3=tI6$93*r1NQ8$b`4!_22og05?tkGfW=wBmhGtWJ$ ztjWqCUZy4nTS+SbrdH2_5JR2v3`K!UYAlKdWKO31CEth7Iyfs4_)(Pe_m?& zSEJhfq9ngTC-#vgT*bZg<&#r7n>+b`@Or5NzHb113Q|NhMRtZ0A2#UC;c%V}R^)xV zLl*(dtgZ^#n`}EpgT$wlliY;H(!+sS;4y4z7gz$i)YJ5@B(Q()?+H)`0(^iYqD zJz?n6Ijp|4FfjxP<4eC;56jRtow2o< zrq%}s=6AJ5h}<(IJq9+&bhP6^To~n07!(_aQ{#&oqb=N;ujekcE}4HAe-B+YD|1GA z^bTY?AgJFUH#HHh&(#@qwp%*8-dl113r-4?mU*2=1rciG%dSB#cg6~uDjCkPe@iMv zt7H?BO1?vbD~21z-gF3(M3xmE*P|IhtTTq>Ac6O+agz>5=_C13&77?heSCb2V`w3f zJaZ;oN&=i`Qx|{ey*+C_pBjG3%?Ga`*Wxb%5>D>5L_M(@^I7iHl!8j#|Ec7>LM-~M XRk+X(a_6C93xKtSy*ceC-(UU%)NPPW From fd16e2d7d6959c79a7c63b4be5e133bc62172135 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 07:04:36 +0200 Subject: [PATCH 66/86] Wait for uninstall.exe to terminate refs #11449 --- icinga-installer/icinga-installer.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index e5560a965..f87debb63 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -137,10 +137,14 @@ static int UpgradeNSIS(void) if (installPath.IsEmpty()) return 0; - if (!Utility::PathExists(installPath + "\\uninstall.exe")) + String uninstallerPath = installPath + "\\uninstall.exe"; + + if (!Utility::PathExists(uninstallerPath)) return 0; - ExecuteCommand(installPath + "\\uninstall.exe", "/S"); + ExecuteCommand(uninstallerPath, "/S \"_?=" + installPath + "\""); + + _unlink(uninstallerPath.CStr()); String dataPath = Utility::GetIcingaDataPath(); From 233f8ffb1700fa9c5459bdcade8ca48ad09d6e21 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 07:51:23 +0200 Subject: [PATCH 67/86] Fix arguments for uninstall.exe refs #11449 --- icinga-installer/icinga-installer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index f87debb63..5f680f4e3 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -142,7 +142,7 @@ static int UpgradeNSIS(void) if (!Utility::PathExists(uninstallerPath)) return 0; - ExecuteCommand(uninstallerPath, "/S \"_?=" + installPath + "\""); + ExecuteCommand(uninstallerPath, "/S _?=" + installPath); _unlink(uninstallerPath.CStr()); From 55d4662286b02dc76f9049afad9fc4e035f3aaa7 Mon Sep 17 00:00:00 2001 From: Rune Darrud Date: Thu, 14 Apr 2016 08:29:58 +0200 Subject: [PATCH 68/86] Add support for msi uninstallation in Chocolatey package refs #11587 --- tools/chocolateyUninstall.ps1 | 47 +++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/tools/chocolateyUninstall.ps1 b/tools/chocolateyUninstall.ps1 index b9acd34dd..d5babe70f 100644 --- a/tools/chocolateyUninstall.ps1 +++ b/tools/chocolateyUninstall.ps1 @@ -1,25 +1,28 @@ -$instDir = "unset" -$uninstaller = "Uninstall.exe" -$icingaRegistry64bitOS = "hklm:\SOFTWARE\Wow6432Node\Icinga Development Team\ICINGA2" -$icingaRegistry32bitOS = "hklm:\SOFTWARE\Icinga Development Team\ICINGA2" -$found = $false +$packageName = "Icinga 2"; +$fileType = 'msi'; +$silentArgs = '/qr /norestart' $validExitCodes = @(0) - -if(test-path $icingaRegistry32bitOS) { - $instDir = (get-itemproperty -literalpath $icingaRegistry32bitOS).'(default)' - $found = $true + +try { + $packageGuid = Get-ChildItem HKLM:\SOFTWARE\Classes\Installer\Products | + Get-ItemProperty -Name 'ProductName' | + ? { $_.ProductName -like $packageName + "*"} | + Select -ExpandProperty PSChildName -First 1 + + $properties = Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\$packageGuid\InstallProperties + + $file = $properties.LocalPackage + + # Would like to use the following, but looks like there is a bug in this method when uninstalling MSI's + # Uninstall-ChocolateyPackage $packageName $fileType $silentArgs $file -validExitCodes $validExitCodes + + # Use this instead + $msiArgs = "/x $file $silentArgs"; + Start-ChocolateyProcessAsAdmin "$msiArgs" 'msiexec' -validExitCodes $validExitCodes + + Write-ChocolateySuccess $package } -elseif(test-path $icingaRegistry64bitOS) { - $instDir = (get-itemproperty -literalpath $icingaRegistry64bitOS).'(default)' - $found = $true -} -else { - Write-Host "Did not find a path in the registry to the Icinga2 folder, did you use the installer?" -} - -if ($found) { - $packageArgs = "/S ?_=" - $statements = "& `"$instDir\$uninstaller`" $packageArgs`"$instDir`"" - - Start-ChocolateyProcessAsAdmin "$statements" -minimized -validExitCodes $validExitCodes +catch { + Write-ChocolateyFailure $package "$($_.Exception.Message)" + throw } From 7fe6c429dd43e08b41639355047451e2cf9eb8aa Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 08:38:57 +0200 Subject: [PATCH 69/86] Make sure NSIS-based installations are uninstalled before we copy the new files refs #11449 --- CMakeLists.txt | 7 +- icinga-installer/CMakeLists.txt | 16 +- {agent => icinga-installer}/bannrbmp.bmp | Bin {agent => icinga-installer}/dlgbmp.bmp | Bin icinga-installer/icinga-installer.cpp | 209 ++++++++++++------ .../icinga2.wixpatch.cmake | 5 + 6 files changed, 163 insertions(+), 74 deletions(-) rename {agent => icinga-installer}/bannrbmp.bmp (100%) rename {agent => icinga-installer}/dlgbmp.bmp (100%) rename icinga2.wixpatch => icinga-installer/icinga2.wixpatch.cmake (84%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b682b07bb..e761d1aa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. cmake_minimum_required(VERSION 2.6) +cmake_policy(SET CMP0026 OLD) set(BOOST_MIN_VERSION "1.41.0") project(icinga2) @@ -303,10 +304,10 @@ set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") set(CPACK_PACKAGE_EXECUTABLES "Icinga2SetupAgent;Icinga 2 Agent Wizard;icinga-studio;Icinga Studio") set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/icinga-app\\\\icinga.ico") set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") -set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch") set(CPACK_WIX_EXTENSIONS "WixUtilExtension") -set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/agent/bannrbmp.bmp") -set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/agent/dlgbmp.bmp") +set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/bannrbmp.bmp") +set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/dlgbmp.bmp") +set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt index 4aa6c07dc..6751ed47b 100644 --- a/icinga-installer/CMakeLists.txt +++ b/icinga-installer/CMakeLists.txt @@ -15,10 +15,15 @@ # along with this program; if not, write to the Free Software Foundation # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. -add_executable(icinga-installer icinga-installer.cpp) +foreach(flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif(${flag_var} MATCHES "/MD") +endforeach(flag_var) -include_directories(${Boost_INCLUDE_DIRS}) -target_link_libraries(icinga-installer ${Boost_LIBRARIES} base config cli) +add_executable(icinga-installer icinga-installer.cpp) set_target_properties ( icinga-installer PROPERTIES @@ -27,6 +32,11 @@ set_target_properties ( LINK_FLAGS "/SUBSYSTEM:WINDOWS" ) +target_link_libraries(icinga-installer shlwapi) + +get_property(ICINGA2_INSTALLER_TARGET TARGET icinga-installer PROPERTY LOCATION_Release) +configure_file(icinga2.wixpatch.cmake ${CMAKE_CURRENT_BINARY_DIR}/icinga2.wixpatch @ONLY) + set(InstallPath "${CMAKE_INSTALL_SBINDIR}") install( diff --git a/agent/bannrbmp.bmp b/icinga-installer/bannrbmp.bmp similarity index 100% rename from agent/bannrbmp.bmp rename to icinga-installer/bannrbmp.bmp diff --git a/agent/dlgbmp.bmp b/icinga-installer/dlgbmp.bmp similarity index 100% rename from agent/dlgbmp.bmp rename to icinga-installer/dlgbmp.bmp diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 5f680f4e3..99abb5ed4 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -17,28 +17,37 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -#include "base/utility.hpp" -#include "base/application.hpp" -#include +#include +#include +#include +#include +#include +#include #include +#include -using namespace icinga; - -static String GetIcingaInstallPath(void) +static std::string GetIcingaInstallPath(void) { char szFileName[MAX_PATH]; if (!GetModuleFileName(NULL, szFileName, sizeof(szFileName))) return ""; - return Utility::DirName(Utility::DirName(szFileName)); + + if (!PathRemoveFileSpec(szFileName)) + return ""; + + if (!PathRemoveFileSpec(szFileName)) + return ""; + + return szFileName; } -static bool ExecuteCommand(const String& app, const String& arguments) +static bool ExecuteCommand(const std::string& app, const std::string& arguments) { SHELLEXECUTEINFO sei = {}; sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; - sei.lpFile = app.CStr(); - sei.lpParameters = arguments.CStr(); + sei.lpFile = app.c_str(); + sei.lpParameters = arguments.c_str(); sei.nShow = SW_HIDE; if (!ShellExecuteEx(&sei)) return false; @@ -58,24 +67,82 @@ static bool ExecuteCommand(const String& app, const String& arguments) return exitCode == 0; } -static bool ExecuteIcingaCommand(const String& arguments) +static bool ExecuteIcingaCommand(const std::string& arguments) { return ExecuteCommand(GetIcingaInstallPath() + "\\sbin\\icinga2.exe", arguments); } -static void CopyConfigFile(const String& installDir, const String& sourceConfigPath, size_t skelPrefixLength) +static std::string DirName(const std::string& path) { - String relativeConfigPath = sourceConfigPath.SubStr(skelPrefixLength); + char *spath = strdup(path.c_str()); - String targetConfigPath = installDir + relativeConfigPath; + if (!PathRemoveFileSpec(spath)) { + free(spath); + throw std::runtime_error("PathRemoveFileSpec failed"); + } - if (!Utility::PathExists(targetConfigPath)) { - Utility::MkDirP(Utility::DirName(targetConfigPath), 0700); - Utility::CopyFile(sourceConfigPath, targetConfigPath); + std::string result = spath; + + free(spath); + + return result; +} + +static bool PathExists(const std::string& path) +{ + struct _stat statbuf; + return (_stat(path.c_str(), &statbuf) >= 0); +} + +static void CopyFile(const std::string& source, const std::string& target) +{ + std::ifstream ifs(source.c_str(), std::ios::binary); + std::ofstream ofs(target.c_str(), std::ios::binary | std::ios::trunc); + + ofs << ifs.rdbuf(); +} + +static std::string GetIcingaDataPath(void) +{ + char path[MAX_PATH]; + if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, path))) + throw std::runtime_error("SHGetFolderPath failed"); + return std::string(path) + "\\icinga2"; +} + +static void MkDir(const std::string& path) +{ + if (mkdir(path.c_str()) < 0 && errno != EEXIST) + throw std::runtime_error("mkdir failed"); +} + +static void MkDirP(const std::string& path) +{ + size_t pos = 0; + + while (pos != std::string::npos) { + pos = path.find_first_of("/\\", pos + 1); + + std::string spath = path.substr(0, pos + 1); + struct stat statbuf; + if (stat(spath.c_str(), &statbuf) < 0 && errno == ENOENT) + MkDir(path.substr(0, pos)); } } -static String GetNSISInstallPath(void) +static void CopyConfigFile(const std::string& installDir, const std::string& sourceConfigPath, size_t skelPrefixLength) +{ + std::string relativeConfigPath = sourceConfigPath.substr(skelPrefixLength); + + std::string targetConfigPath = installDir + relativeConfigPath; + + if (!PathExists(targetConfigPath)) { + MkDirP(DirName(targetConfigPath)); + CopyFile(sourceConfigPath, targetConfigPath); + } +} + +static std::string GetNSISInstallPath(void) { HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Icinga Development Team\\ICINGA2", 0, @@ -95,36 +162,37 @@ static String GetNSISInstallPath(void) return ""; } -static void CollectPaths(std::vector& paths, const String& path) +static void CollectPaths(std::vector& paths, const std::string& path) { paths.push_back(path); } -static bool MoveDirectory(const String& source, const String& destination) +static bool MoveDirectory(const std::string& source, const std::string& destination) { - if (!MoveFileEx(source.CStr(), destination.CStr(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) { + if (!MoveFileEx(source.c_str(), destination.c_str(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) { // SHFileOperation requires file names to be terminated with two \0s - String tmpSource = source + String(1, '\0'); - String tmpDestination = destination + String(1, '\0'); + std::string tmpSource = source + std::string(1, '\0'); + std::string tmpDestination = destination + std::string(1, '\0'); SHFILEOPSTRUCT fop; fop.wFunc = FO_COPY; - fop.pFrom = tmpSource.CStr(); - fop.pTo = tmpDestination.CStr(); + fop.pFrom = tmpSource.c_str(); + fop.pTo = tmpDestination.c_str(); fop.fFlags = FOF_NO_UI; if (SHFileOperation(&fop) != 0) return false; - std::vector paths; + // XXX: reimplement + /*std::vector paths; paths.push_back(source); Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobDirectory); Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobFile); std::reverse(paths.begin(), paths.end()); - BOOST_FOREACH(const String& path, paths) { - (void)MoveFileEx(path.CStr(), NULL, MOVEFILE_DELAY_UNTIL_REBOOT); - } + BOOST_FOREACH(const std::string& path, paths) { + (void)MoveFileEx(path.c_str(), NULL, MOVEFILE_DELAY_UNTIL_REBOOT); + }*/ } return true; @@ -132,33 +200,33 @@ static bool MoveDirectory(const String& source, const String& destination) static int UpgradeNSIS(void) { - String installPath = GetNSISInstallPath(); + std::string installPath = GetNSISInstallPath(); - if (installPath.IsEmpty()) + if (installPath.empty()) return 0; - String uninstallerPath = installPath + "\\uninstall.exe"; + std::string uninstallerPath = installPath + "\\uninstall.exe"; - if (!Utility::PathExists(uninstallerPath)) + if (!PathExists(uninstallerPath)) return 0; ExecuteCommand(uninstallerPath, "/S _?=" + installPath); - _unlink(uninstallerPath.CStr()); + _unlink(uninstallerPath.c_str()); - String dataPath = Utility::GetIcingaDataPath(); + std::string dataPath = GetIcingaDataPath(); /* perform open heart surgery on the user's data dirs - yay */ - if (!Utility::PathExists(dataPath)) { - Utility::MkDirP(dataPath, 0700); + if (!PathExists(dataPath)) { + MkDir(dataPath.c_str()); - String oldNameEtc = installPath + "\\etc"; - String newNameEtc = dataPath + "\\etc"; + std::string oldNameEtc = installPath + "\\etc"; + std::string newNameEtc = dataPath + "\\etc"; if (!MoveDirectory(oldNameEtc, newNameEtc)) return 1; - String oldNameVar = installPath + "\\var"; - String newNameVar = dataPath + "\\var"; + std::string oldNameVar = installPath + "\\var"; + std::string newNameVar = dataPath + "\\var"; if (!MoveDirectory(oldNameVar, newNameVar)) return 1; } @@ -168,34 +236,40 @@ static int UpgradeNSIS(void) static int InstallIcinga(void) { - if (UpgradeNSIS() != 0) - return 1; + std::string installDir = GetIcingaInstallPath(); + std::string dataDir = GetIcingaDataPath(); - String installDir = GetIcingaInstallPath(); - String dataDir = Utility::GetIcingaDataPath(); + if (!PathExists(dataDir)) { + std::string sourceDir = installDir + "\\share\\skel" + std::string(1, '\0'); + std::string destinationDir = dataDir + std::string(1, '\0'); - Utility::MkDirP(dataDir, 0700); + SHFILEOPSTRUCT fop; + fop.wFunc = FO_COPY; + fop.pFrom = sourceDir.c_str(); + fop.pTo = destinationDir.c_str(); + fop.fFlags = FOF_NO_UI | FOF_NOCOPYSECURITYATTRIBS; + + if (SHFileOperation(&fop) != 0) + return 1; + + MkDirP(dataDir + "/etc/icinga2/pki"); + MkDirP(dataDir + "/var/cache/icinga2"); + MkDirP(dataDir + "/var/lib/icinga2/pki"); + MkDirP(dataDir + "/var/lib/icinga2/agent/inventory"); + MkDirP(dataDir + "/var/lib/icinga2/api/config"); + MkDirP(dataDir + "/var/lib/icinga2/api/log"); + MkDirP(dataDir + "/var/lib/icinga2/api/zones"); + MkDirP(dataDir + "/var/lib/icinga2/api/zones"); + MkDirP(dataDir + "/var/log/icinga2/compat/archive"); + MkDirP(dataDir + "/var/log/icinga2/crash"); + MkDirP(dataDir + "/var/run/icinga2/cmd"); + MkDirP(dataDir + "/var/spool/icinga2/perfdata"); + MkDirP(dataDir + "/var/spool/icinga2/tmp"); + } ExecuteCommand("icacls", "\"" + dataDir + "\" /grant *S-1-5-20:(oi)(ci)m"); ExecuteCommand("icacls", "\"" + dataDir + "\\etc\" /inheritance:r /grant:r *S-1-5-20:(oi)(ci)m *S-1-5-32-544:(oi)(ci)f"); - Utility::MkDirP(dataDir + "/etc/icinga2/pki", 0700); - Utility::MkDirP(dataDir + "/var/cache/icinga2", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/pki", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/agent/inventory", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/api/config", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/api/log", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/api/zones", 0700); - Utility::MkDirP(dataDir + "/var/lib/icinga2/api/zones", 0700); - Utility::MkDirP(dataDir + "/var/log/icinga2/compat/archive", 0700); - Utility::MkDirP(dataDir + "/var/log/icinga2/crash", 0700); - Utility::MkDirP(dataDir + "/var/run/icinga2/cmd", 0700); - Utility::MkDirP(dataDir + "/var/spool/icinga2/perfdata", 0700); - Utility::MkDirP(dataDir + "/var/spool/icinga2/tmp", 0700); - - String skelDir = "/share/skel"; - Utility::GlobRecursive(installDir + skelDir, "*", boost::bind(&CopyConfigFile, dataDir, _1, installDir.GetLength() + skelDir.GetLength()), GlobFile); - ExecuteIcingaCommand("--scm-install daemon"); return 0; @@ -213,9 +287,6 @@ static int UninstallIcinga(void) */ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { - /* must be called before using any other libbase functions */ - Application::InitializeBase(); - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); //AllocConsole(); @@ -226,12 +297,14 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi rc = InstallIcinga(); } else if (strcmp(lpCmdLine, "uninstall") == 0) { rc = UninstallIcinga(); + } else if (strcmp(lpCmdLine, "upgrade-nsis") == 0) { + rc = UpgradeNSIS(); } else { MessageBox(NULL, "This application should only be run by the MSI installer package.", "Icinga 2 Installer", MB_ICONWARNING); rc = 1; } - //Utility::Sleep(3); + //::Sleep(3000s); - Application::Exit(rc); + return rc; } diff --git a/icinga2.wixpatch b/icinga-installer/icinga2.wixpatch.cmake similarity index 84% rename from icinga2.wixpatch rename to icinga-installer/icinga2.wixpatch.cmake index cc89fc032..0f6942e0f 100644 --- a/icinga2.wixpatch +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -3,13 +3,17 @@ 1 Disable + + + + $CM_CP_sbin.icinga2_installer.exe>2 $CM_CP_sbin.icinga2_installer.exe>2 $CM_CP_sbin.icinga2_installer.exe=2 @@ -20,6 +24,7 @@ From 0028bf0b8aa4a5c138ad49524187dec7e8db917a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 14:08:18 +0200 Subject: [PATCH 70/86] Fix support for building debug MSI packages refs #11449 --- CMakeLists.txt | 1 - icinga-installer/CMakeLists.txt | 13 ++++++++++--- icinga-installer/icinga2.wixpatch.cmake | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e761d1aa4..8212675ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -307,7 +307,6 @@ set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CPACK_WIX_EXTENSIONS "WixUtilExtension") set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/bannrbmp.bmp") set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/dlgbmp.bmp") -set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt index 6751ed47b..967e65cca 100644 --- a/icinga-installer/CMakeLists.txt +++ b/icinga-installer/CMakeLists.txt @@ -25,7 +25,7 @@ endforeach(flag_var) add_executable(icinga-installer icinga-installer.cpp) -set_target_properties ( +set_target_properties( icinga-installer PROPERTIES FOLDER Bin OUTPUT_NAME icinga2-installer @@ -34,8 +34,15 @@ set_target_properties ( target_link_libraries(icinga-installer shlwapi) -get_property(ICINGA2_INSTALLER_TARGET TARGET icinga-installer PROPERTY LOCATION_Release) -configure_file(icinga2.wixpatch.cmake ${CMAKE_CURRENT_BINARY_DIR}/icinga2.wixpatch @ONLY) +install(CODE " +set(CPACK_WIX_PATCH_FILE \"\${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch.\${BUILD_TYPE}\") +") + +file( + GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/icinga2.wixpatch.$" + INPUT "${CMAKE_CURRENT_SOURCE_DIR}/icinga2.wixpatch.cmake" +) set(InstallPath "${CMAKE_INSTALL_SBINDIR}") diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake index 0f6942e0f..f181979d1 100644 --- a/icinga-installer/icinga2.wixpatch.cmake +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -7,7 +7,7 @@ - + From 83e410a3025b1299bd5da11cca1aa47a62e6de6e Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 14:12:25 +0200 Subject: [PATCH 71/86] Remove cmake_policy call refs #11449 --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8212675ed..f64ddee4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,6 @@ # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. cmake_minimum_required(VERSION 2.6) -cmake_policy(SET CMP0026 OLD) set(BOOST_MIN_VERSION "1.41.0") project(icinga2) From 3c3ed809679937d56b3010845134ceeb55b88a2a Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 14:24:41 +0200 Subject: [PATCH 72/86] Remove the Icinga 2 directory (if it's empty) after running uninstall.exe refs #11449 --- icinga-installer/icinga-installer.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 99abb5ed4..d301af592 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -181,18 +181,6 @@ static bool MoveDirectory(const std::string& source, const std::string& destinat fop.fFlags = FOF_NO_UI; if (SHFileOperation(&fop) != 0) return false; - - // XXX: reimplement - /*std::vector paths; - paths.push_back(source); - Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobDirectory); - Utility::GlobRecursive(source, "*", boost::bind(&CollectPaths, boost::ref(paths), _1), GlobFile); - - std::reverse(paths.begin(), paths.end()); - - BOOST_FOREACH(const std::string& path, paths) { - (void)MoveFileEx(path.c_str(), NULL, MOVEFILE_DELAY_UNTIL_REBOOT); - }*/ } return true; @@ -229,6 +217,8 @@ static int UpgradeNSIS(void) std::string newNameVar = dataPath + "\\var"; if (!MoveDirectory(oldNameVar, newNameVar)) return 1; + + _unlink(installPath.c_str()); } return 0; From e17f5f7d0051b1d50da1c31a2b221a11a5ca5709 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 14:39:48 +0200 Subject: [PATCH 73/86] Use _rmdir instead of _unlink refs #11449 --- icinga-installer/icinga-installer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index d301af592..8e3b1d4bf 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -218,7 +218,7 @@ static int UpgradeNSIS(void) if (!MoveDirectory(oldNameVar, newNameVar)) return 1; - _unlink(installPath.c_str()); + _rmdir(installPath.c_str()); } return 0; From a716b9f4d75c1782c01280324e25572f516d1f12 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 14:58:13 +0200 Subject: [PATCH 74/86] Fix include for icinga2.wixpatch (again) refs #11449 --- CMakeLists.txt | 2 ++ icinga-installer/CMakeLists.txt | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f64ddee4e..09d6da840 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,6 +306,8 @@ set(CPACK_WIX_UPGRADE_GUID "52F2BEAA-4DF0-4C3E-ABDC-C0F61DE4DF8A") set(CPACK_WIX_EXTENSIONS "WixUtilExtension") set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/bannrbmp.bmp") set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/icinga-installer/dlgbmp.bmp") +set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch.Debug") +set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch") set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include(InstallRequiredSystemLibraries) diff --git a/icinga-installer/CMakeLists.txt b/icinga-installer/CMakeLists.txt index 967e65cca..0c32bade3 100644 --- a/icinga-installer/CMakeLists.txt +++ b/icinga-installer/CMakeLists.txt @@ -35,7 +35,13 @@ set_target_properties( target_link_libraries(icinga-installer shlwapi) install(CODE " -set(CPACK_WIX_PATCH_FILE \"\${CMAKE_CURRENT_BINARY_DIR}/icinga-installer/icinga2.wixpatch.\${BUILD_TYPE}\") + execute_process(COMMAND \${CMAKE_COMMAND} -E copy \"${CMAKE_CURRENT_BINARY_DIR}/icinga2.wixpatch.\${BUILD_TYPE}\" + \"${CMAKE_CURRENT_BINARY_DIR}/icinga2.wixpatch\" + RESULT_VARIABLE copy_result + ERROR_VARIABLE error_output) + if(copy_result) + message(FATAL_ERROR \${error_output}) + endif() ") file( From 4c0155511477003249b40e94ddf2f192ed8029c1 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Thu, 14 Apr 2016 16:04:29 +0200 Subject: [PATCH 75/86] Docs: Remove instance_name from Ido*Connection example fixes #11592 --- doc/6-object-types.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/doc/6-object-types.md b/doc/6-object-types.md index 28c588a8f..d6e8ed697 100644 --- a/doc/6-object-types.md +++ b/doc/6-object-types.md @@ -698,16 +698,11 @@ Example: user = "icinga" password = "icinga" database = "icinga" - table_prefix = "icinga_" - instance_name = "icinga2" - instance_description = "icinga2 instance" cleanup = { downtimehistory_age = 48h logentries_age = 31d } - - categories = DbCatConfig | DbCatState } Configuration Attributes: @@ -788,16 +783,11 @@ Example: user = "icinga" password = "icinga" database = "icinga" - table_prefix = "icinga_" - instance_name = "icinga2" - instance_description = "icinga2 instance" cleanup = { downtimehistory_age = 48h logentries_age = 31d } - - categories = DbCatConfig | DbCatState } Configuration Attributes: From d2ebb80c0aff2ef0afe9245df16edb2c2974df46 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Thu, 14 Apr 2016 19:36:59 +0200 Subject: [PATCH 76/86] Fix "Run Icinga 2 wizard" option in the installer refs #11449 --- icinga-installer/icinga2.wixpatch.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake index f181979d1..099d940c4 100644 --- a/icinga-installer/icinga2.wixpatch.cmake +++ b/icinga-installer/icinga2.wixpatch.cmake @@ -24,7 +24,6 @@ From 4c65061ab020c083849acadd18890afffd062fed Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 15 Apr 2016 04:11:59 +0200 Subject: [PATCH 77/86] Update the agent wizard banner fixes #11585 --- agent/windows-setup-agent/icinga-banner.png | Bin 16939 -> 2376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/agent/windows-setup-agent/icinga-banner.png b/agent/windows-setup-agent/icinga-banner.png index b570ecf41097ae86adff2d7be96dfae71e6afa14..34d89956a412d4de3805c808d424824103d78fbc 100644 GIT binary patch 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 literal 16939 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

c`~0$I}SX-g(PrtQ?ZSx7w`-Y_CYTxz)wk>h(v% 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 From feb4b97df75caa31f291336629339f2aab42f0e2 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 18 Apr 2016 14:25:52 +0200 Subject: [PATCH 78/86] Make the socket event engine configurable fixes #11522 --- doc/18-language-reference.md | 1 + lib/base/CMakeLists.txt | 2 +- lib/base/socketevents-epoll.cpp | 209 ++++++++++++++++++ lib/base/socketevents-poll.cpp | 199 +++++++++++++++++ lib/base/socketevents.cpp | 380 ++++++-------------------------- lib/base/socketevents.hpp | 91 +++++++- 6 files changed, 556 insertions(+), 326 deletions(-) create mode 100644 lib/base/socketevents-epoll.cpp create mode 100644 lib/base/socketevents-poll.cpp diff --git a/doc/18-language-reference.md b/doc/18-language-reference.md index 4d2b88d06..5dbbb2039 100644 --- a/doc/18-language-reference.md +++ b/doc/18-language-reference.md @@ -369,6 +369,7 @@ PidPath |**Read-write.** Contains the path of the Icinga 2 PID file. 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. UseVfork |**Read-write.** Whether to use vfork(). Only available on *NIX. Defaults to true. +EventEngine |**Read-write.** The name of the socket event engine, can be "poll" or "epoll". The epoll interface is only supported on Linux. AttachDebugger |**Read-write.** Whether to attach a debugger when Icinga 2 crashes. Defaults to false. RunAsUser |**Read-write.** Defines the user the Icinga 2 daemon is running as. Used in the `init.conf` configuration file. RunAsGroup |**Read-write.** Defines the group the Icinga 2 daemon is running as. Used in the `init.conf` configuration file. diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 1ccc4d1c8..5c9246348 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -32,7 +32,7 @@ set(base_SOURCES netstring.cpp networkstream.cpp number.cpp number-script.cpp object.cpp object-script.cpp objecttype.cpp primitivetype.cpp process.cpp ringbuffer.cpp scriptframe.cpp function.cpp function-script.cpp functionwrapper.cpp scriptglobal.cpp - scriptutils.cpp serializer.cpp socket.cpp socketevents.cpp stacktrace.cpp + scriptutils.cpp serializer.cpp socket.cpp socketevents.cpp socketevents-epoll.cpp socketevents-poll.cpp stacktrace.cpp statsfunction.cpp stdiostream.cpp stream.cpp streamlogger.cpp streamlogger.thpp string.cpp string-script.cpp sysloglogger.cpp sysloglogger.thpp tcpsocket.cpp threadpool.cpp timer.cpp tlsstream.cpp tlsutility.cpp type.cpp typetype-script.cpp unixsocket.cpp utility.cpp value.cpp diff --git a/lib/base/socketevents-epoll.cpp b/lib/base/socketevents-epoll.cpp new file mode 100644 index 000000000..a6476ac61 --- /dev/null +++ b/lib/base/socketevents-epoll.cpp @@ -0,0 +1,209 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "base/socketevents.hpp" +#include "base/exception.hpp" +#include "base/logger.hpp" +#include +#include +#include +#ifdef __linux__ +# include + +using namespace icinga; + +void SocketEventEngineEpoll::InitializeThread(int tid) +{ + m_PollFDs[tid] = epoll_create(128); + Utility::SetCloExec(m_PollFDs[tid]); + + SocketEventDescriptor sed; + + m_Sockets[tid][m_EventFDs[tid][0]] = sed; + m_FDChanged[tid] = true; + + epoll_event event; + memset(&event, 0, sizeof(event)); + event.data.fd = m_EventFDs[tid][0]; + event.events = EPOLLIN; + epoll_ctl(m_PollFDs[tid], EPOLL_CTL_ADD, m_EventFDs[tid][0], &event); +} + +int SocketEventEngineEpoll::PollToEpoll(int events) +{ + int result = 0; + + if (events & POLLIN) + result |= EPOLLIN; + + if (events & POLLOUT) + result |= EPOLLOUT; + + return events; +} + +int SocketEventEngineEpoll::EpollToPoll(int events) +{ + int result = 0; + + if (events & EPOLLIN) + result |= POLLIN; + + if (events & EPOLLOUT) + result |= POLLOUT; + + return events; +} + +void SocketEventEngineEpoll::ThreadProc(int tid) +{ + Utility::SetThreadName("SocketIO"); + + for (;;) { + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (m_FDChanged[tid]) { + m_FDChanged[tid] = false; + m_CV[tid].notify_all(); + } + } + + epoll_event pevents[64]; + int ready = epoll_wait(m_PollFDs[tid], pevents, sizeof(pevents) / sizeof(pevents[0]), -1); + + std::vector events; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (m_FDChanged[tid]) { + m_FDChanged[tid] = false; + + continue; + } + + for (int i = 0; i < ready; i++) { + if (pevents[i].data.fd == m_EventFDs[tid][0]) { + char buffer[512]; + if (recv(m_EventFDs[tid][0], buffer, sizeof(buffer), 0) < 0) + Log(LogCritical, "SocketEvents", "Read from event FD failed."); + + continue; + } + + if ((pevents[i].events & (EPOLLIN | EPOLLOUT | EPOLLHUP | EPOLLERR)) == 0) + continue; + + 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.push_back(event); + } + } + + BOOST_FOREACH(const EventDescription& event, events) { + try { + event.Descriptor.EventInterface->OnEvent(event.REvents); + } catch (const std::exception& ex) { + Log(LogCritical, "SocketEvents") + << "Exception thrown in socket I/O handler:\n" + << DiagnosticInformation(ex); + } catch (...) { + Log(LogCritical, "SocketEvents", "Exception of unknown type thrown in socket I/O handler."); + } + } + } +} + +void SocketEventEngineEpoll::Register(SocketEvents *se, Object *lifesupportObject) +{ + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + VERIFY(se->m_FD != INVALID_SOCKET); + + SocketEventDescriptor desc; + desc.EventInterface = se; + desc.LifesupportObject = lifesupportObject; + + VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); + + m_Sockets[tid][se->m_FD] = desc; + + epoll_event event; + memset(&event, 0, sizeof(event)); + event.data.fd = se->m_FD; + event.events = 0; + epoll_ctl(m_PollFDs[tid], EPOLL_CTL_ADD, se->m_FD, &event); + + se->m_Events = true; + } +} + +void SocketEventEngineEpoll::Unregister(SocketEvents *se) +{ + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (se->m_FD == INVALID_SOCKET) + return; + + m_Sockets[tid].erase(se->m_FD); + m_FDChanged[tid] = true; + + epoll_ctl(m_PollFDs[tid], EPOLL_CTL_DEL, se->m_FD, NULL); + + se->m_FD = INVALID_SOCKET; + se->m_Events = false; + } + + WakeUpThread(tid, true); +} + +void SocketEventEngineEpoll::ChangeEvents(SocketEvents *se, int events) +{ + if (se->m_FD == INVALID_SOCKET) + BOOST_THROW_EXCEPTION(std::runtime_error("Tried to read/write from a closed socket.")); + + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + std::map::iterator it = m_Sockets[tid].find(se->m_FD); + + if (it == m_Sockets[tid].end()) + return; + + epoll_event event; + memset(&event, 0, sizeof(event)); + event.data.fd = se->m_FD; + event.events = SocketEventEngineEpoll::PollToEpoll(events); + epoll_ctl(m_PollFDs[tid], EPOLL_CTL_MOD, se->m_FD, &event); + } +} +#endif /* __linux__ */ diff --git a/lib/base/socketevents-poll.cpp b/lib/base/socketevents-poll.cpp new file mode 100644 index 000000000..784212a16 --- /dev/null +++ b/lib/base/socketevents-poll.cpp @@ -0,0 +1,199 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "base/socketevents.hpp" +#include "base/exception.hpp" +#include "base/logger.hpp" +#include +#include +#include + +using namespace icinga; + +void SocketEventEnginePoll::InitializeThread(int tid) +{ + SocketEventDescriptor sed; + sed.Events = POLLIN; + + m_Sockets[tid][m_EventFDs[tid][0]] = sed; + m_FDChanged[tid] = true; +} + +void SocketEventEnginePoll::ThreadProc(int tid) +{ + Utility::SetThreadName("SocketIO"); + + std::vector pfds; + std::vector descriptors; + + for (;;) { + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (m_FDChanged[tid]) { + pfds.resize(m_Sockets[tid].size()); + descriptors.resize(m_Sockets[tid].size()); + + int i = 0; + + typedef std::map::value_type kv_pair; + + BOOST_FOREACH(const kv_pair& desc, m_Sockets[tid]) { + if (desc.second.EventInterface) + desc.second.EventInterface->m_EnginePrivate = &pfds[i]; + + pfds[i].fd = desc.first; + pfds[i].events = desc.second.Events; + descriptors[i] = desc.second; + + i++; + } + + m_FDChanged[tid] = false; + m_CV[tid].notify_all(); + } + } + + ASSERT(!pfds.empty()); + +#ifdef _WIN32 + (void) WSAPoll(&pfds[0], pfds.size(), -1); +#else /* _WIN32 */ + (void) poll(&pfds[0], pfds.size(), -1); +#endif /* _WIN32 */ + + std::vector events; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (m_FDChanged[tid]) + continue; + + for (int i = 0; i < pfds.size(); i++) { + if ((pfds[i].revents & (POLLIN | POLLOUT | POLLHUP | POLLERR)) == 0) + continue; + + if (pfds[i].fd == m_EventFDs[tid][0]) { + char buffer[512]; + if (recv(m_EventFDs[tid][0], buffer, sizeof(buffer), 0) < 0) + Log(LogCritical, "SocketEvents", "Read from event FD failed."); + + continue; + } + + EventDescription event; + event.REvents = pfds[i].revents; + event.Descriptor = descriptors[i]; + event.LifesupportReference = event.Descriptor.LifesupportObject; + VERIFY(event.LifesupportReference); + + events.push_back(event); + } + } + + BOOST_FOREACH(const EventDescription& event, events) { + try { + event.Descriptor.EventInterface->OnEvent(event.REvents); + } catch (const std::exception& ex) { + Log(LogCritical, "SocketEvents") + << "Exception thrown in socket I/O handler:\n" + << DiagnosticInformation(ex); + } catch (...) { + Log(LogCritical, "SocketEvents", "Exception of unknown type thrown in socket I/O handler."); + } + } + } +} + +void SocketEventEnginePoll::Register(SocketEvents *se, Object *lifesupportObject) +{ + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + VERIFY(se->m_FD != INVALID_SOCKET); + + SocketEventDescriptor desc; + desc.Events = 0; + desc.EventInterface = se; + desc.LifesupportObject = lifesupportObject; + + VERIFY(m_Sockets[tid].find(se->m_FD) == m_Sockets[tid].end()); + + m_Sockets[tid][se->m_FD] = desc; + + m_FDChanged[tid] = true; + + se->m_Events = true; + } + + WakeUpThread(tid, true); +} + +void SocketEventEnginePoll::Unregister(SocketEvents *se) +{ + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + if (se->m_FD == INVALID_SOCKET) + return; + + m_Sockets[tid].erase(se->m_FD); + m_FDChanged[tid] = true; + + se->m_FD = INVALID_SOCKET; + se->m_Events = false; + } + + WakeUpThread(tid, true); +} + +void SocketEventEnginePoll::ChangeEvents(SocketEvents *se, int events) +{ + if (se->m_FD == INVALID_SOCKET) + BOOST_THROW_EXCEPTION(std::runtime_error("Tried to read/write from a closed socket.")); + + int tid = se->m_ID % SOCKET_IOTHREADS; + + { + boost::mutex::scoped_lock lock(m_EventMutex[tid]); + + std::map::iterator it = m_Sockets[tid].find(se->m_FD); + + if (it == m_Sockets[tid].end()) + return; + + if (it->second.Events == events) + return; + + it->second.Events = events; + + if (se->m_EnginePrivate && boost::this_thread::get_id() == m_Threads[tid].get_id()) + ((pollfd *)se->m_EnginePrivate)->events = events; + else + m_FDChanged[tid] = true; + } + + WakeUpThread(tid, false); +} + diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 40234e60c..76b288d03 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -20,6 +20,8 @@ #include "base/socketevents.hpp" #include "base/exception.hpp" #include "base/logger.hpp" +#include "base/application.hpp" +#include "base/scriptglobal.hpp" #include #include #include @@ -29,268 +31,91 @@ using namespace icinga; -struct SocketEventDescriptor -{ -#ifndef __linux__ - int Events; -#endif /* __linux__ */ - SocketEvents *EventInterface; - Object *LifesupportObject; - - SocketEventDescriptor(void) - : -#ifndef __linux__ - Events(POLLIN), -#endif /* __linux__ */ - EventInterface(NULL), LifesupportObject(NULL) - { } -}; - -struct EventDescription -{ - int REvents; - SocketEventDescriptor Descriptor; - Object::Ptr LifesupportReference; -}; - -#define SOCKET_IOTHREADS 8 - static boost::once_flag l_SocketIOOnceFlag = BOOST_ONCE_INIT; -static boost::thread l_SocketIOThreads[SOCKET_IOTHREADS]; -#ifdef __linux__ -static SOCKET l_SocketIOPollFDs[SOCKET_IOTHREADS]; -#endif /* __linux__ */ -static SOCKET l_SocketIOEventFDs[SOCKET_IOTHREADS][2]; -static bool l_SocketIOFDChanged[SOCKET_IOTHREADS]; -static boost::mutex l_SocketIOMutex[SOCKET_IOTHREADS]; -static boost::condition_variable l_SocketIOCV[SOCKET_IOTHREADS]; -static std::map l_SocketIOSockets[SOCKET_IOTHREADS]; +static SocketEventEngine *l_SocketIOEngine; int SocketEvents::m_NextID = 0; -void SocketEvents::InitializeThread(void) +void SocketEventEngine::Start(void) { - for (int i = 0; i < SOCKET_IOTHREADS; i++) { -#ifdef __linux__ - l_SocketIOPollFDs[i] = epoll_create(128); - Utility::SetCloExec(l_SocketIOPollFDs[i]); -#endif /* __linux__ */ + for (int tid = 0; tid < SOCKET_IOTHREADS; tid++) { + Socket::SocketPair(m_EventFDs[tid]); - Socket::SocketPair(l_SocketIOEventFDs[i]); - - Utility::SetNonBlockingSocket(l_SocketIOEventFDs[i][0]); - Utility::SetNonBlockingSocket(l_SocketIOEventFDs[i][1]); + Utility::SetNonBlockingSocket(m_EventFDs[tid][0]); + Utility::SetNonBlockingSocket(m_EventFDs[tid][1]); #ifndef _WIN32 - Utility::SetCloExec(l_SocketIOEventFDs[i][0]); - Utility::SetCloExec(l_SocketIOEventFDs[i][1]); + Utility::SetCloExec(m_EventFDs[tid][0]); + Utility::SetCloExec(m_EventFDs[tid][1]); #endif /* _WIN32 */ - SocketEventDescriptor sed; -#ifndef __linux__ - sed.Events = POLLIN; -#endif /* __linux__ */ + InitializeThread(tid); - l_SocketIOSockets[i][l_SocketIOEventFDs[i][0]] = sed; - l_SocketIOFDChanged[i] = true; - -#ifdef __linux__ - epoll_event event; - memset(&event, 0, sizeof(event)); - event.data.fd = l_SocketIOEventFDs[i][0]; - event.events = EPOLLIN; - epoll_ctl(l_SocketIOPollFDs[i], EPOLL_CTL_ADD, l_SocketIOEventFDs[i][0], &event); -#endif /* __linux__ */ - - l_SocketIOThreads[i] = boost::thread(&SocketEvents::ThreadProc, i); + m_Threads[tid] = boost::thread(boost::bind(&SocketEventEngine::ThreadProc, this, tid)); } } -#ifdef __linux__ -int SocketEvents::PollToEpoll(int events) +void SocketEventEngine::WakeUpThread(int sid, bool wait) { - int result = 0; + int tid = sid % SOCKET_IOTHREADS; - if (events & POLLIN) - result |= EPOLLIN; - - if (events & POLLOUT) - result |= EPOLLOUT; - - return events; -} - -int SocketEvents::EpollToPoll(int events) -{ - int result = 0; - - if (events & EPOLLIN) - result |= POLLIN; - - if (events & EPOLLOUT) - result |= POLLOUT; - - return events; -} -#endif /* __linux__ */ - -void SocketEvents::ThreadProc(int tid) -{ - Utility::SetThreadName("SocketIO"); - -#ifndef __linux__ - std::vector pfds; - std::vector descriptors; -#endif /* __linux__ */ - - for (;;) { - { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); - - if (l_SocketIOFDChanged[tid]) { -#ifndef __linux__ - pfds.resize(l_SocketIOSockets[tid].size()); - descriptors.resize(l_SocketIOSockets[tid].size()); - - int i = 0; - - typedef std::map::value_type kv_pair; - - BOOST_FOREACH(const kv_pair& desc, l_SocketIOSockets[tid]) { - if (desc.second.EventInterface) - desc.second.EventInterface->m_PFD = &pfds[i]; - - pfds[i].fd = desc.first; - pfds[i].events = desc.second.Events; - descriptors[i] = desc.second; - - i++; - } -#endif /* __linux__ */ - - l_SocketIOFDChanged[tid] = false; - l_SocketIOCV[tid].notify_all(); - } - } - -#ifndef __linux__ - ASSERT(!pfds.empty()); -#endif /* __linux__ */ - -#ifdef __linux__ - epoll_event pevents[64]; - int ready = epoll_wait(l_SocketIOPollFDs[tid], pevents, sizeof(pevents) / sizeof(pevents[0]), -1); -#elif _WIN32 - (void) WSAPoll(&pfds[0], pfds.size(), -1); -#else /* _WIN32 */ - (void) poll(&pfds[0], pfds.size(), -1); -#endif /* _WIN32 */ - - std::vector events; - - { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); - - if (l_SocketIOFDChanged[tid]) { -#ifdef __linux__ - l_SocketIOFDChanged[tid] = false; -#endif /* __linux__ */ - - continue; - } - -#ifdef __linux__ - for (int i = 0; i < ready; i++) { - if (pevents[i].data.fd == l_SocketIOEventFDs[tid][0]) { - char buffer[512]; - if (recv(l_SocketIOEventFDs[tid][0], buffer, sizeof(buffer), 0) < 0) - Log(LogCritical, "SocketEvents", "Read from event FD failed."); - - continue; - } - - if ((pevents[i].events & (EPOLLIN | EPOLLOUT | EPOLLHUP | EPOLLERR)) == 0) - continue; - - EventDescription event; - event.REvents = EpollToPoll(pevents[i].events); - event.Descriptor = l_SocketIOSockets[tid][pevents[i].data.fd]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); - - events.push_back(event); - } -#else /* __linux__ */ - for (int i = 0; i < pfds.size(); i++) { - if ((pfds[i].revents & (POLLIN | POLLOUT | POLLHUP | POLLERR)) == 0) - continue; - - if (pfds[i].fd == l_SocketIOEventFDs[tid][0]) { - char buffer[512]; - if (recv(l_SocketIOEventFDs[tid][0], buffer, sizeof(buffer), 0) < 0) - Log(LogCritical, "SocketEvents", "Read from event FD failed."); - - continue; - } - - EventDescription event; - event.REvents = pfds[i].revents; - event.Descriptor = descriptors[i]; - event.LifesupportReference = event.Descriptor.LifesupportObject; - VERIFY(event.LifesupportReference); - - events.push_back(event); - } -#endif /* __linux__ */ - } - - BOOST_FOREACH(const EventDescription& event, events) { - try { - event.Descriptor.EventInterface->OnEvent(event.REvents); - } catch (const std::exception& ex) { - Log(LogCritical, "SocketEvents") - << "Exception thrown in socket I/O handler:\n" - << DiagnosticInformation(ex); - } catch (...) { - Log(LogCritical, "SocketEvents", "Exception of unknown type thrown in socket I/O handler."); - } - } - } -} - -void SocketEvents::WakeUpThread(bool wait) -{ - int tid = m_ID % SOCKET_IOTHREADS; - - if (boost::this_thread::get_id() == l_SocketIOThreads[tid].get_id()) + if (boost::this_thread::get_id() == m_Threads[tid].get_id()) return; if (wait) { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); + boost::mutex::scoped_lock lock(m_EventMutex[tid]); - l_SocketIOFDChanged[tid] = true; + m_FDChanged[tid] = true; - while (l_SocketIOFDChanged[tid]) { - (void) send(l_SocketIOEventFDs[tid][1], "T", 1, 0); + while (m_FDChanged[tid]) { + (void) send(m_EventFDs[tid][1], "T", 1, 0); boost::system_time const timeout = boost::get_system_time() + boost::posix_time::milliseconds(50); - l_SocketIOCV[tid].timed_wait(lock, timeout); + m_CV[tid].timed_wait(lock, timeout); } } else { - (void) send(l_SocketIOEventFDs[tid][1], "T", 1, 0); + (void) send(m_EventFDs[tid][1], "T", 1, 0); } } +void SocketEvents::InitializeEngine(void) +{ + String eventEngine = ScriptGlobal::Get("EventEngine", &Empty); + + if (eventEngine.IsEmpty()) +#ifdef __linux__ + eventEngine = "epoll"; +#else /* __linux__ */ + eventEngine = "poll"; +#endif /* __linux__ */ + + if (eventEngine == "poll") + l_SocketIOEngine = new SocketEventEnginePoll(); +#ifdef __linux__ + else if (eventEngine == "epoll") + l_SocketIOEngine = new SocketEventEngineEpoll(); +#endif /* __linux__ */ + else { + eventEngine = "poll"; + + Log(LogWarning, "SocketEvents") + << "Invalid event engine selected: " << eventEngine << " - Falling back to 'poll'"; + + l_SocketIOEngine = new SocketEventEnginePoll(); + } + + l_SocketIOEngine->Start(); + + ScriptGlobal::Set("EventEngine", eventEngine); +} + /** * Constructor for the SocketEvents class. */ SocketEvents::SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject) - : m_ID(m_NextID++), m_FD(socket->GetFD()) -#ifndef __linux__ - , m_PFD(NULL) -#endif /* __linux__ */ + : m_ID(m_NextID++), m_FD(socket->GetFD()), m_EnginePrivate(NULL) { - boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeThread); + boost::call_once(l_SocketIOOnceFlag, &SocketEvents::InitializeEngine); Register(lifesupportObject); } @@ -302,109 +127,28 @@ SocketEvents::~SocketEvents(void) void SocketEvents::Register(Object *lifesupportObject) { - int tid = m_ID % SOCKET_IOTHREADS; - - { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); - - VERIFY(m_FD != INVALID_SOCKET); - - SocketEventDescriptor desc; -#ifndef __linux__ - desc.Events = 0; -#endif /* __linux__ */ - desc.EventInterface = this; - desc.LifesupportObject = lifesupportObject; - - VERIFY(l_SocketIOSockets[tid].find(m_FD) == l_SocketIOSockets[tid].end()); - - l_SocketIOSockets[tid][m_FD] = desc; - -#ifdef __linux__ - epoll_event event; - memset(&event, 0, sizeof(event)); - event.data.fd = m_FD; - event.events = 0; - epoll_ctl(l_SocketIOPollFDs[tid], EPOLL_CTL_ADD, m_FD, &event); -#else /* __linux__ */ - l_SocketIOFDChanged[tid] = true; -#endif /* __linux__ */ - - m_Events = true; - } - -#ifndef __linux__ - WakeUpThread(true); -#endif /* __linux__ */ + l_SocketIOEngine->Register(this, lifesupportObject); } void SocketEvents::Unregister(void) { - int tid = m_ID % SOCKET_IOTHREADS; - - { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); - - if (m_FD == INVALID_SOCKET) - return; - - l_SocketIOSockets[tid].erase(m_FD); - l_SocketIOFDChanged[tid] = true; - -#ifdef __linux__ - epoll_ctl(l_SocketIOPollFDs[tid], EPOLL_CTL_DEL, m_FD, NULL); -#endif /* __linux__ */ - - m_FD = INVALID_SOCKET; - m_Events = false; - } - - WakeUpThread(true); + l_SocketIOEngine->Unregister(this); } void SocketEvents::ChangeEvents(int events) { - if (m_FD == INVALID_SOCKET) - BOOST_THROW_EXCEPTION(std::runtime_error("Tried to read/write from a closed socket.")); + l_SocketIOEngine->ChangeEvents(this, events); +} - int tid = m_ID % SOCKET_IOTHREADS; - - { - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); - - std::map::iterator it = l_SocketIOSockets[tid].find(m_FD); - - if (it == l_SocketIOSockets[tid].end()) - return; - -#ifdef __linux__ - epoll_event event; - memset(&event, 0, sizeof(event)); - event.data.fd = m_FD; - event.events = PollToEpoll(events); - epoll_ctl(l_SocketIOPollFDs[tid], EPOLL_CTL_MOD, m_FD, &event); -#else /* __linux__ */ - if (it->second.Events == events) - return; - - it->second.Events = events; - - if (m_PFD && boost::this_thread::get_id() == l_SocketIOThreads[tid].get_id()) - m_PFD->events = events; - else - l_SocketIOFDChanged[tid] = true; -#endif /* __linux__ */ - } - -#ifndef __linux__ - WakeUpThread(); -#endif /* __linux__ */ +boost::mutex& SocketEventEngine::GetMutex(int tid) +{ + return m_EventMutex[tid]; } bool SocketEvents::IsHandlingEvents(void) const { int tid = m_ID % SOCKET_IOTHREADS; - boost::mutex::scoped_lock lock(l_SocketIOMutex[tid]); + boost::mutex::scoped_lock lock(l_SocketIOEngine->GetMutex(tid)); return m_Events; } diff --git a/lib/base/socketevents.hpp b/lib/base/socketevents.hpp index d1a50ef8c..8243555a2 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 #ifndef _WIN32 # include @@ -48,6 +49,9 @@ public: bool IsHandlingEvents(void) const; + void *GetEnginePrivate(void) const; + void SetEnginePrivate(void *priv); + protected: SocketEvents(const Socket::Ptr& socket, Object *lifesupportObject); @@ -55,24 +59,97 @@ private: int m_ID; SOCKET m_FD; bool m_Events; -#ifndef __linux__ - pollfd *m_PFD; -#endif /* __linux__ */ + void *m_EnginePrivate; static int m_NextID; - static void InitializeThread(void); - static void ThreadProc(int tid); + static void InitializeEngine(void); void WakeUpThread(bool wait = false); - int GetPollEvents(void) const; - void Register(Object *lifesupportObject); + friend class SocketEventEnginePoll; + friend class SocketEventEngineEpoll; +}; + +#define SOCKET_IOTHREADS 8 + +struct SocketEventDescriptor +{ + int Events; + SocketEvents *EventInterface; + Object *LifesupportObject; + + SocketEventDescriptor(void) + : Events(POLLIN), EventInterface(NULL), LifesupportObject(NULL) + { } +}; + +struct EventDescription +{ + int REvents; + SocketEventDescriptor Descriptor; + Object::Ptr LifesupportReference; +}; + +class I2_BASE_API SocketEventEngine +{ +public: + void Start(void); + + void WakeUpThread(int sid, bool wait); + + boost::mutex& GetMutex(int tid); + +protected: + virtual void InitializeThread(int tid) = 0; + virtual void ThreadProc(int tid) = 0; + virtual void Register(SocketEvents *se, Object *lifesupportObject) = 0; + virtual void Unregister(SocketEvents *se) = 0; + virtual void ChangeEvents(SocketEvents *se, int events) = 0; + + boost::thread m_Threads[SOCKET_IOTHREADS]; + SOCKET m_EventFDs[SOCKET_IOTHREADS][2]; + bool m_FDChanged[SOCKET_IOTHREADS]; + boost::mutex m_EventMutex[SOCKET_IOTHREADS]; + boost::condition_variable m_CV[SOCKET_IOTHREADS]; + std::map m_Sockets[SOCKET_IOTHREADS]; + + friend class SocketEvents; +}; + +class I2_BASE_API SocketEventEnginePoll : public SocketEventEngine +{ +public: + virtual void Register(SocketEvents *se, Object *lifesupportObject); + virtual void Unregister(SocketEvents *se); + virtual void ChangeEvents(SocketEvents *se, int events); + +protected: + virtual void InitializeThread(int tid); + virtual void ThreadProc(int tid); +}; + +#ifdef __linux__ +class I2_BASE_API SocketEventEngineEpoll : public SocketEventEngine +{ +public: + virtual void Register(SocketEvents *se, Object *lifesupportObject); + virtual void Unregister(SocketEvents *se); + virtual void ChangeEvents(SocketEvents *se, int events); + +protected: + virtual void InitializeThread(int tid); + virtual void ThreadProc(int tid); + +private: + SOCKET m_PollFDs[SOCKET_IOTHREADS]; + static int PollToEpoll(int events); static int EpollToPoll(int events); }; +#endif /* __linux__ */ } From 089002fa21cbb7ceddacdf5438bbdb0f52523fe9 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 18 Apr 2016 15:02:02 +0200 Subject: [PATCH 79/86] Fix error message for the EventEngine variable refs #11522 --- lib/base/socketevents.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/base/socketevents.cpp b/lib/base/socketevents.cpp index 76b288d03..f68e056ea 100644 --- a/lib/base/socketevents.cpp +++ b/lib/base/socketevents.cpp @@ -96,11 +96,11 @@ void SocketEvents::InitializeEngine(void) l_SocketIOEngine = new SocketEventEngineEpoll(); #endif /* __linux__ */ else { - eventEngine = "poll"; - Log(LogWarning, "SocketEvents") << "Invalid event engine selected: " << eventEngine << " - Falling back to 'poll'"; + eventEngine = "poll"; + l_SocketIOEngine = new SocketEventEnginePoll(); } From cfafaee5b06ae9fb5a836e9e714f084c32540e95 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 18 Apr 2016 15:33:20 +0200 Subject: [PATCH 80/86] Move user data before running the uninstaller refs #11449 --- icinga-installer/icinga-installer.cpp | 66 ++++++++++++++++++--------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/icinga-installer/icinga-installer.cpp b/icinga-installer/icinga-installer.cpp index 8e3b1d4bf..c024315b5 100644 --- a/icinga-installer/icinga-installer.cpp +++ b/icinga-installer/icinga-installer.cpp @@ -167,23 +167,32 @@ static void CollectPaths(std::vector& paths, const std::string& pat paths.push_back(path); } -static bool MoveDirectory(const std::string& source, const std::string& destination) +static bool CopyDirectory(const std::string& source, const std::string& destination) { - if (!MoveFileEx(source.c_str(), destination.c_str(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) { - // SHFileOperation requires file names to be terminated with two \0s - std::string tmpSource = source + std::string(1, '\0'); - std::string tmpDestination = destination + std::string(1, '\0'); + // SHFileOperation requires file names to be terminated with two \0s + std::string tmpSource = source + std::string(1, '\0'); + std::string tmpDestination = destination + std::string(1, '\0'); - SHFILEOPSTRUCT fop; - fop.wFunc = FO_COPY; - fop.pFrom = tmpSource.c_str(); - fop.pTo = tmpDestination.c_str(); - fop.fFlags = FOF_NO_UI; - if (SHFileOperation(&fop) != 0) - return false; - } + SHFILEOPSTRUCT fop; + fop.wFunc = FO_COPY; + fop.pFrom = tmpSource.c_str(); + fop.pTo = tmpDestination.c_str(); + fop.fFlags = FOF_NO_UI; - return true; + return (SHFileOperation(&fop) == 0); +} + +static bool DeleteDirectory(const std::string& dir) +{ + // SHFileOperation requires file names to be terminated with two \0s + std::string tmpDir = dir + std::string(1, '\0'); + + SHFILEOPSTRUCT fop; + fop.wFunc = FO_DELETE; + fop.pFrom = tmpDir.c_str(); + fop.fFlags = FOF_NO_UI; + + return (SHFileOperation(&fop) == 0); } static int UpgradeNSIS(void) @@ -198,24 +207,39 @@ static int UpgradeNSIS(void) if (!PathExists(uninstallerPath)) return 0; - ExecuteCommand(uninstallerPath, "/S _?=" + installPath); - - _unlink(uninstallerPath.c_str()); - std::string dataPath = GetIcingaDataPath(); + if (dataPath.empty()) + return 1; + + bool moveUserData = !PathExists(dataPath); + /* perform open heart surgery on the user's data dirs - yay */ - if (!PathExists(dataPath)) { + if (moveUserData) { MkDir(dataPath.c_str()); std::string oldNameEtc = installPath + "\\etc"; std::string newNameEtc = dataPath + "\\etc"; - if (!MoveDirectory(oldNameEtc, newNameEtc)) + if (!CopyDirectory(oldNameEtc, newNameEtc)) return 1; std::string oldNameVar = installPath + "\\var"; std::string newNameVar = dataPath + "\\var"; - if (!MoveDirectory(oldNameVar, newNameVar)) + if (!CopyDirectory(oldNameVar, newNameVar)) + return 1; + } + + ExecuteCommand(uninstallerPath, "/S _?=" + installPath); + + _unlink(uninstallerPath.c_str()); + + if (moveUserData) { + std::string oldNameEtc = installPath + "\\etc"; + if (!DeleteDirectory(oldNameEtc)) + return 1; + + std::string oldNameVar = installPath + "\\var"; + if (!DeleteDirectory(oldNameVar)) return 1; _rmdir(installPath.c_str()); From d4b5ada951b9c4ffea9e9463a5e5eb7512b5ca07 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 19 Apr 2016 09:35:48 +0200 Subject: [PATCH 81/86] Fix crash in Checkable::ExecuteCheck fixes #11582 --- lib/icinga/checkable-check.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 6a3cd178b..1d5153d57 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -476,8 +476,16 @@ void Checkable::ExecuteCheck(void) /* fail to perform check on unconnected endpoint */ cr->SetState(ServiceUnknown); - cr->SetOutput("Remote Icinga instance '" + endpoint->GetName() + - "' " + "is not connected to '" + Endpoint::GetLocalEndpoint()->GetName() + "'"); + String output = "Remote Icinga instance '" + endpoint->GetName() + "' is not connected to "; + + Endpoint::Ptr localEndpoint = Endpoint::GetLocalEndpoint(); + + if (localEndpoint) + output += "'" + localEndpoint->GetName() + "'"; + else + output += "this instance"; + + cr->SetOutput(output); ProcessCheckResult(cr); } From 003e8e86c13aee9d3852079d6512ffcbbeda2ba3 Mon Sep 17 00:00:00 2001 From: Nicolas Limage Date: Tue, 19 Apr 2016 10:59:28 +0200 Subject: [PATCH 82/86] Fix typo in vim syntax highlighting fixes #11617 Signed-off-by: Michael Friedrich --- tools/syntax/vim/syntax/icinga2.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/syntax/vim/syntax/icinga2.vim b/tools/syntax/vim/syntax/icinga2.vim index 0d41467d2..e58e716a2 100644 --- a/tools/syntax/vim/syntax/icinga2.vim +++ b/tools/syntax/vim/syntax/icinga2.vim @@ -82,7 +82,7 @@ syn keyword icinga2Keyword template const import include include_recursive var " Assign conditions -syn match icinga2AssingCond contained "\(assign[ \t]\+\where\|ignore[ \t]\+\where\)" +syn match icinga2AssignCond contained "\(assign[ \t]\+\where\|ignore[ \t]\+\where\)" " Global functions From 6653c51df5d83d8582c0a1f9aa1baac2c1a0350e Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Apr 2016 12:02:25 +0200 Subject: [PATCH 83/86] Update AUTHORS refs #11617 --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 057082b7f..44571e1ba 100644 --- a/AUTHORS +++ b/AUTHORS @@ -63,6 +63,7 @@ Max Zhang Mhd Sulhan Michael Friedrich Michael Kraus +Nicolas Limage Pall Sigurdsson Paul Richards Per von Zweigbergk From 2d7bc7433928c2f9ed6c85abf46ae98f6820e7cb Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Apr 2016 16:09:27 +0200 Subject: [PATCH 84/86] Windows Wizard: Fix 'Examine Config' directory refs #11449 --- agent/windows-setup-agent/ServiceStatus.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/windows-setup-agent/ServiceStatus.cs b/agent/windows-setup-agent/ServiceStatus.cs index cdceb99b8..e9782fe1d 100644 --- a/agent/windows-setup-agent/ServiceStatus.cs +++ b/agent/windows-setup-agent/ServiceStatus.cs @@ -35,8 +35,8 @@ namespace Icinga Close(); } - private void btnOpenConfigDir_Click(object sender, EventArgs e) { - Process.Start("explorer.exe", Program.Icinga2DataDir + "\\etc\\icinga2"); - } - } + private void btnOpenConfigDir_Click(object sender, EventArgs e) { + Process.Start("explorer.exe", Program.Icinga2DataDir); + } + } } From 3dab52caf3b3a06ace0670ef668907e1f40dc839 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 19 Apr 2016 17:14:17 +0200 Subject: [PATCH 85/86] Documentation: Add Windows setup wizard screenshots fixes #9618 --- doc/11-icinga2-client.md | 86 +++++++++++++----- .../icinga2_windows_running_service.png | Bin 0 -> 94889 bytes .../icinga2_windows_setup_installer_01.png | Bin 0 -> 19483 bytes .../icinga2_windows_setup_installer_02.png | Bin 0 -> 28449 bytes .../icinga2_windows_setup_installer_03.png | Bin 0 -> 17551 bytes .../icinga2_windows_setup_installer_04.png | Bin 0 -> 16644 bytes .../icinga2_windows_setup_installer_05.png | Bin 0 -> 11081 bytes .../icinga2_windows_setup_wizard_01.png | Bin 0 -> 29478 bytes .../icinga2_windows_setup_wizard_02.png | Bin 0 -> 47264 bytes .../icinga2_windows_setup_wizard_03.png | Bin 0 -> 31344 bytes .../icinga2_windows_setup_wizard_04.png | Bin 0 -> 34177 bytes .../icinga2_windows_setup_wizard_05.png | Bin 0 -> 98464 bytes .../icinga2_windows_setup_wizard_06.png | Bin 0 -> 20242 bytes ...a2_windows_setup_wizard_examine_config.png | Bin 0 -> 22755 bytes 14 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 doc/images/icinga2-client/icinga2_windows_running_service.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_installer_01.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_installer_02.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_installer_03.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_installer_04.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_installer_05.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_01.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_02.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_03.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_04.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_05.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_06.png create mode 100644 doc/images/icinga2-client/icinga2_windows_setup_wizard_examine_config.png diff --git a/doc/11-icinga2-client.md b/doc/11-icinga2-client.md index c8b521fba..2a03042cb 100644 --- a/doc/11-icinga2-client.md +++ b/doc/11-icinga2-client.md @@ -418,50 +418,94 @@ Restart Icinga 2 once complete. Download the MSI-Installer package from [http://packages.icinga.org/windows/](http://packages.icinga.org/windows/). Requirements: + * Windows Vista/Server 2008 or higher * [Microsoft .NET Framework 2.0](http://www.microsoft.com/de-de/download/details.aspx?id=1639) if not already installed. The installer package includes the [NSClient++](http://www.nsclient.org/) so Icinga 2 can -use its built-in plugins. You can use [predefined commands from the ITL](7-icinga-template-library.md#nscp-plugin-check-commands) for these plugins. +use its built-in plugins. You can use the [nscp-local commands from the ITL](7-icinga-template-library.md#nscp-plugin-check-commands) +for these plugins. -If you want to install the client silently / unattended use the `/qn` modifier. The -installation should not trigger a restart but if you want to be completly sure, you can use the `/norestart` modifier. +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_installer_01.png) +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_installer_02.png) +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_installer_03.png) +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_installer_04.png) +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_installer_05.png) - C:> msiexec /i C:\Icinga2-v2.4.5-x86.msi /qn /norestart +The graphical installer will offer to run the Icinga 2 setup wizard after the installation. +You can also manually run the Icinga 2 setup wizard from the start menu. -After the installation you can run Icinga 2 from the Start menu. (The graphical installer will -offer to run Icinga 2 right after the installation) On the first start Icinga 2 will show you -the setup wizard which will help you with SSL certificate generation, -CSR-Autosigning and configuration setup. +On a fresh installation the setup wizard will guide you through the initial configuration +as well as the required details for SSL certificate generation using CSR-Autosigning. You'll need the following configuration details: * The client common name (CN). Defaults to FQDN. -* The client's local zone name. Defaults to FQDN. -* The master endpoint name. Look into your master setup `zones.conf` file for the proper name. -* The master endpoint connection information. Your master's IP address and port (defaults to 5665) * The [request ticket number](11-icinga2-client.md#csr-autosigning-requirements) generated on your master for CSR Auto-Signing -* Bind host/port for the Api feature (optional) -Besides the configuration changes, the setup wizard offers you to install the included NSClient++ package. +Example on the master: + + icinga2 pki ticket --cn DESKTOP-IHRPO96 + +Fill in the required information and click `Add` to add a new master connection. + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_01.png) + +Add the following details: + +* The master endpoint name. Look into your master setup `zones.conf` file for the proper name. +* The master endpoint connection information. Your master's IP address and port (defaults to 5665) + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_02.png) + +You can optionally enable the following settings: + +* Accept commands from master (client as [command execution bridge](11-icinga2-client.md#icinga2-client-configuration-command-bridge)). +* Accept config updates from master ([client receiving configuration](11-icinga2-client.md#icinga2-client-scenarios)) +* Install/Update NSClient++ + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_03.png) + +The next step allows you to verify the CA presented by the master. + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_04.png) + +If you have chosen to install/update the NSClient++ package the Icinga 2 setup wizard will ask +you to do so. + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_05.png) + +Finish the setup wizard. + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_06.png) Once install and configuration is done, Icinga 2 is automatically started as a Windows service. -Running Icinga 2 again from the Start menu will allow you to change the settings from the the first -setup wizard run. Please keep in mind that you can change all those settings within the configuration -file and on the commandline. -The Icinga 2 configuration is located inside the installation path and can be edited with -your favorite editor. +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_running_service.png) + +The Icinga 2 configuration is located inside the `C:\ProgramData\icinga2` directory. +If you click `Examine Config` in the setup wizard running it will open a new explorer window. + +![Icinga 2 Windows Setup](images/icinga2-client/icinga2_windows_setup_wizard_examine_config.png) + +The configuration files can be modified with your favorite editor. Configuration validation is done similar to the linux pendant on the Windows shell: C:> icinga2.exe daemon -C -> **Note** -> -> You have to run this command in a shell with `administrator` permissions. +**Note**: You have to run this command in a shell with `administrator` permissions. +In case you want to restart the Icinga 2 service, run `services.msc` and restart the +`icinga2` service. Alternatively you can use the `net {start,stop}` CLI commands. + +#### Silent Windows Client Setup + +If you want to install the client silently / unattended use the `/qn` modifier. The +installation should not trigger a restart but if you want to be completly sure, you can use the `/norestart` modifier. + + C:> msiexec /i C:\Icinga2-v2.4.5-x86.msi /qn /norestart ## Client Configuration Modes diff --git a/doc/images/icinga2-client/icinga2_windows_running_service.png b/doc/images/icinga2-client/icinga2_windows_running_service.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3aea20b8ef7d1ae2691a8e10eb94fe65f2751d GIT binary patch literal 94889 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 AKL7v# literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_installer_02.png b/doc/images/icinga2-client/icinga2_windows_setup_installer_02.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ba3c121e4135517ac793786d810bd5cd7b1967 GIT binary patch literal 28449 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 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_installer_03.png b/doc/images/icinga2-client/icinga2_windows_setup_installer_03.png new file mode 100644 index 0000000000000000000000000000000000000000..3e44e50af8881193359efd83d98fec569ce0da0c GIT binary patch literal 17551 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 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_installer_04.png b/doc/images/icinga2-client/icinga2_windows_setup_installer_04.png new file mode 100644 index 0000000000000000000000000000000000000000..92ecf47f8dcd34b8782d10f6e7dba03d7c3c9d06 GIT binary patch literal 16644 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 C*Q${K literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_wizard_01.png b/doc/images/icinga2-client/icinga2_windows_setup_wizard_01.png new file mode 100644 index 0000000000000000000000000000000000000000..beca25c332c06e50bee47a8ef0828cbec36c5142 GIT binary patch literal 29478 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_wizard_02.png b/doc/images/icinga2-client/icinga2_windows_setup_wizard_02.png new file mode 100644 index 0000000000000000000000000000000000000000..ad75cf41c476401768ceb7ce667e565374e06f68 GIT binary patch literal 47264 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 |9heY56!0$F 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_wizard_03.png b/doc/images/icinga2-client/icinga2_windows_setup_wizard_03.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ccbabd438bd0345c80c766e95d3a725b823308 GIT binary patch literal 31344 zcmb@uWmH_vwl3VbTL|tDB)A0+1czY3-9rfOuE7Zw+}&Lgq|pGuJ-A!Yrg7K1$h*(I zXOC~6aesW53|6{p)ml}vrq(lO5&l6@8UvLW6$Aod$jV5lfIzTLz;6UHBG8iQfawYR zhiD=vEdhFZ{+H8M91pah*vn`G-OzBKe_=pr8H7M1lC!LWB+?o@E(Rs~jmAq^5Qq{a zD`3i}1_ux+E{cS(ieW!9N`Th}35 zmDjA{W-eU1N19gb91|bpTEJ9Ey#mZdC3w8_IoZ_R8LJfE$1=FkC}0oyA9c*U+|2zYSteI)r?;>5(nIHj=g@Xj*z@*4Yf zF;WrVr62cgS1a8sZC*sX&jaejE^|YQ6w*Hil7cF9>QUX69FR0Bb<7B0m&rzGsHv&* z@G+f6Kbo1XU!QE+A~Z^UG%jK%@giNCsLEv~Yeb=`tvw&KJ8w{f3CMX$u6r-gWH6d) zsk1{zZ_}Y-qZenh96I?{TI*tLE2ET<-Si3%B3LRA4vZ^qV2~yEv_LG1P1?Z3#)cI@ z`9m=U4HdNum>Lc)u4(=K<)U3*fo%Noiq}#7XYp3C$zwwYkxxN}^NO|%a(y=_)Dp@; z8fu+KrLSF$3xUa);`)3mpR9H>AcMb%p22t<{#vz0yngY#rK*BZa;S;-O(|O(9sJ3(qJ+d$2<)!gDtQf>b1&u9awC$C zP}pDy*yrw26dT@p;Ri|{!^YW|NMFa(gWZxtA6b#hVbdn&$B!S49`A2bMEu%^68Aqu z&Pt^f3nYKkjj<*2GpOHo7}y&RsdHZ1&ovaby|64-<`{ZC1;gbkXdN0x{nC#laGV{o zm4$L;V!cAjoRAVwUvWog%;WeiIMv{_yYv;yC#hY?53AwcX_2pb zLa)oFNSAJDgLAJIvrS_@FS`z%qRm|L+H{yv$XrC6cyN8{NiB+FX*{Z$PV`oPfrImg zYg~VTa)*7G$by@=d^Ip2!2bT)Ve)0g`@$}OvFsMVUnK`F4aO?-*()JPD2qga#Z0E; z&ad&0vYIIJ81j5~ULF`GM8C}w_8e%cJzYWhNR=z`BKxG_7{?e_I5?^OM&-tu~ zL_|b$jdm1jjEUV$Ml5fV%%~vm7`IuF9hMeE z`qp|>oT%+|nDoS!zA{h0_9?1Dw_y2QDy!6ou+kzl8i|SeSUzcI2B`trRD$gFR&d6~ zCSi77HNE$JcL~#d*ZPfPvQv>sscW*uugOGTD(XC|4JLC11&&Ggr zS!T|iYkhl(aE^W@g<6bTk6iU+q43HFm4Q-VYbE*Y{^*>B`2h@DDZDi+&iDqfzQ% z2FgfnU%r;f&ha~hT}Gc&%b{M^9zID6#1?%wR*JXFyY%>8-9=VdvHk6+rPll)}j3r^R@_m~J(Z@A#+PM(m z|6z|`FeUOXb_0B)wtVQq<@EL4?fQ1por8Ik$6b6e+*{hwWVrLma+28a+K>psfRMH? zlPF{SPy%xwIl#>vBJt-l5$(eJ`T3nJft`vF*jkTalUQ^^02<$ws)^-K7>(zM7L{sj zmSjxvI}RnWa4ioO)N>~kn#ya@8jQ;#)z@T&LaJ21T*2l4}_ku+?D;9SxqU zM&=p8Kj!A<@I^!>Y|~s8epny_4kJHC_$y#C*C(VYTweb~KtM1CZfLf~TOTQ3?S`ne z-eo=xet7m|5Wspfe*Ua{hwMatfcV_=GQ#+I(6E25 zgxk-b`&m#yO*SLKm+;Sh1%Jiz13jrj{$5Q|o?Yd?zWj%#fA0TVum7>>|Mr$q(y67jkXCqh8Kf!sd7>YGq{f0dCLY~A)d*p|1z|zGA=m2{C=cM! z=erByDd}^wtG3$ycG40^4B)?yEO`DUAkUR_y8$nwQCCB^T9S4w^_eKkJ7Zg=b&nEe zSbg;o+Tl4*QUXZ*(zA$2a4t+uSD0HtIM&;aj&&8@UZDdk6N^^W->=7OXeS?z<_g&e zR$M{7c0T_2?fG4f-FQT)ch_I2j!!f|4qx28Ar3D!EHZ@69p&vl5@hX=Q$2SQkBAv| zIlGua;t!lN(AW1g_;^L)5oiS5qUNo??q9NdbJ5RI-8+XZGBsm0G1*6w*@~w@!0CLd zLD^r;1zOu#hzLX3{Tg#R)}*eq-_I^jHicGyp<^v<5R8SXZf^&8CY)|PId|JTSt0Xl zaEzh(Fd0!uBNn84Mr0$OLv2H^xv!Dj4SX-`o5|twfeqvz(+K;06ZS-5zM6C%pd$}5 zir4XGKxx`VtHm(N@0axECQ^tDB0tF8+!4K3;;uz)yJY;(b;!i?B>g$6+r6D+Y@`Eg zRR_m3cJ1p4yq1#+UU#2H7+}(Ax$&f-%VDB^5Rgl9%DLA(Q~;}`9 zBfNqd8FLs8%v>v&7gSQ#7PM*3J!jgq;bQ0UhMZHr-Z#ZBq>=l1QLH`hnkIA9>AhCz4?U|2$!%sUq}O5+f7~7 zJr4*6Xm-eNg!P-UT4w#8Ud<~No`1ZjHVA-bhZJVfR z5`j1E{uv<=#Kpnk7_Rr<1<`WSoreNzHg?DwN7_m9Vk0zpBmZEumV`Lx*Fn>}KS`RK zTg#HJxfUk!Y(j4t(E;WN9iQL~9RD8B{W8GO#_@*kXW9LNCyV1yS*>fwf(0Shia}3< zO|N6tvi_f$-TW=6&Yy+l1Q30FW?8_Q`<*>PAQ=wMg!=XbaiX{C_H7S}*PtF6TWwo& zT364n_Djvq=SAoZ*QMD&$lE6EPk_8 z*AgHR{Vv8qrDfYMTpNFCdID118>ejSYGyYo5(ud2lul%dB*|gmj^a-bU%iA$Gy(5c zyg5F8#AWX`D0%t|0&BO3q;7TM64cTBvhBF(Q()cnQ03!IJr{#36<0<`+#kGJH=*Yz z8f$<)-!MK8`&Gv#?E+ZNU4DKk9#TLfYTfS!=rZX)S>28smB$unwkw-1o^WXxA5Ejc z$=k^8L5@xn*8ileXe@rv(htQzVsa>GC7ytJFT__u&>NB>effw(5ru%yD{=Uz^5;|v zs2rMAd(kuvcI~w=$S3L!I9|Gp$6QP#eV`v`;JHZWxV?7au|Wa>Ts58MEo{K-e@a)+k(rf+W5bgP5Q)`Zj$c61K{f@*WO zvGW-D?C}189yFsLZ0=CX&HPUH{;13+iB{A!W5)P7PdOXt8Yd!-*@&R1f8n1)$M~QV zHM&f^VUEX5U@c})k*|KG;>L-+7GNK1Tdn(r+25MWRm;^JZqCl{-?!kcmQ+d!7qVhH^h9@kXQ-$W2MoBk49&@FHOJ} zPN@I3Tm>nsuCCcnK~3850c~tOTQl+o%*u`txSta=J7aZ{Np;=!k^&e*Eu z{>inpG%ZCs;p7nGJ8~CewfJY(BAY^j3ylf)dEnrF7Y@j=H4|UVM6R!*(i)O~KY1n& zbe0JB&Y**SisWwW_XJmmoI(HifIZ2}{E@zL`w8q_=3?EWn7!ch>aRM?DY^z3%3At; zYYGw)&Xqyn*AAUU<)knVCFA2DS{_0EouSX^>jk&GWb%CmkVqQKq!2^~+KyW4m2Glo zLDVtW@fgQ4)Y0@q!Q|hwtA*)=f|GsK-_`FdA@!~VaoEou9K#7vyUKu!!qPy`^~ob8 z!M2OOtgf@!2Zorfu(U!F+9ZYgRFem3?;m?^i<}$z574T8m(Y_(&!jEkmX@$pkm%o; z@tZeZ*0kou{}};%W4>4moWC_6;`wA|QX|dDiN@S=*c{LG8~Wk-m3QtBxvI84(}aNk z(I+CGJ?p(XfkXmy5t=wSEtNxy_XWJ|OS-tt7h}^Bm{`sZHJs=e@aX19u)ONPfhWr`0}iL z(6TJ!q{}IvK1#&5fowx;-k=r(O6Ic4D>pFV#~HQumb)Z*G2a5v(@H7ia!b~AA_CS= z&-&_$zx^!sfI7V@M&#YewwQJ*cN{8LppgZ9AuStuiXi9k9xsy~3eun-0&^9jk4qP5 zc;0hqe>IZ8rfuH;>B@h(=nDE=Tdnu(OnLCP zL2H5HcnpvAGnS~w-S=FTzP8iSH|7;Z2qGT#?0|WwZEPjxy>pdtH1sP!>%i2s&@odR zCG=EB*imSF8GZ?gyrLkC9O)Zd(;J~h$NWHDSlyvMzGUR!Vn=TmJUyGZm833+uG!G| zI#rl^u5d8{2o;_UXyt;kZgo%IV)wyJ8}VHVAi-7dQsDdnm#O&>)mHO9aOB2ZzHu9L z-nb(Zd(9IBcq9$qO55qn%H`@_z$s3in*%{qxmTmM3J^5yD=i+m0>S^L)2y|fDkskr z)}A51-6o*UuB%s!Zn2U-49#D)diYn<0YsPQEE|A~Jq}Z+W@XI|HFbTo+Y-vs~`;} znB{h){?kDy~wlHradAeZ&ekdnzU7e(VxZ%p{5w7DIED?wIrrscslBnse3rBoNN zjy1&5 zB8+whA-22aYCvWtCL3`Z$VH&1H&)_e_t^8xeHJY&7bg&A4?jWOM4p{B5dY`;Z%zOD^51*?&rScAw@kbdJHEOi zi1_;TUoe}zn%Yb0zd`;2*FVwwe~97#L(~5l!~cg!|Nj=&|A$AK$zRVQ*l2os3J87) zD?unIEUd)^wj@>2TSLj;al^vWjQ4&Q9>6yjIiw{5!uxN#l`!K&ov9B=(YkNpkppg4 zw!>=aQ0rJz0=}5$#_23Hg37gbNP?_vru;r1uQoZL>uF>Q$Lt zv;t?<`YtxeygeM{S(w=?X#>@;Oy8VEE&|AvvqCVxjU?hB`5nGueSFl6#z#tn)Uc~T zp@nH4XX0ketvqDqmlF*5xpz!6x!tD@n;m$v?`Z125!YhG;6al0HL8F5(GT~MPqarv zOO@wd)}tjNW&hg1xV@;)L*@GRRWI}L3YTQlf#00bR`HyJrCfD2%1>Gg>DADs9`I}| zL1mzh)7`r=J+MG#{gvaW+VIeH{65z>IBz z!Iy*}$#qJDY;f)}{D(U-g7BLoF#b1ZvmOSDQ_vy$?9(A$TFAqOXCzL=ER)tE#o6hs z@nWxg-&QW6l_7IC6YVx9fJ4^UnPbls$i?V+1W8dJjK`E<>o!r4CRlmPN4+S9swe-U z*{+sFMqCU3$gFjS;phsA;@AB~(t`Ot?tCmg<+WHndzc^pGrtZkAXXN9n9Ahr)K0rhym-pu4Jypz4NXmYF!N#MR82PaGa#lTl-hA+<`n6>7OD(9B@VV8ZX56g zH&Da5xlXe|Y`GFGnH*L)N#zXfcm?QZlUgaiyC{J06nY3_K8$2@>paIW{#sv^Y0Y^ z65Uy5A?0Baxp;WzT`)PzTlqQTPcR_*60`Ct&yq$iH?9*y86JyFa)}w2_+F@Wll)++ zHF~1P*Swx|`jq4cdLriFq=t2072=sAFlQ^aKWoOuBz2e+odH^gs{BZ2!rcZ)`A#V1 z!V)9pkV@D{Jzas`mB5KyftKtj8^^}OZOi?sLi4URLUSBjf!^g9!EPAIuJ0+E9|iEo zl@^P%B9YU&3UA@LC+X)iBg}^g(-ismdB<)#Ny0tG6gx4e5AkiPF?$&JQ6!|`shCZ^ z?db^s$kx5j!v{T;f3z4H!oT;vi`}i*x4`QC{5$y91g31mM>$bqJoqc8g%)b%0)9jR zXZXZ;J+X_@Z7sGaBACL(0rH`tC$9`^@7HTEnwr{n$k5IG&g-1%)MLrEXM z0&4dLbtdIILQ6pr83uv+eck7>Wg9{3+4MU-hOB6IL!3pxoC>~R;$UNGSI06M3-WR( zANKG({4rY>^Mjvl-4ID7mfgV6H%4-AjwWraFd`Cp!w?hLp|y7{nMLS+S*kxp#_xLo z5Z+=J@n4U~Jn$6y9#o`JJ`4f$Mj6Q-ovr|H%3`vFMWM<{2(}`eNj&;8tQpROYvG&gyuS~PI)m0!I%cQ z7Vcgn2<2-uh2mYGo&oS$^6j%pauyCHs|I`+%FiM$CDFhR)rbgO<7S+sPYP|qu& z8^@QI57JNH1#M!j;?0(yx#uz;=#}QMlA-yTxP7wl&CN-8D)le3K z=fK~SleOMAj;`=H%3RF)%`Yu1EDn&H=_Dm3Pav(&e)Hd*elzjQgMbE`zpfS7V8`{K zQU2}p+Tc0hmzWy;AES%^5Xr>C`@%_(BxPldDpFEg!aNTRZ<3Nnvv3EL^x+5z-*+|7xbkgq2asO8 z3sL*CFHs@$8!484J4&od@n1>4Iju53)3oFcAhhtk2}ZenXGUc7cv0j6F2xmox8RDC z$6x|B$>_$O0Mry+{3gl-hy1lSIf>ktb|)pVmy(kmL;HAy0zNNn36_{BFvUhypsZmb zp2c`k-Er18TaFKtDi?zn^dNW3i#yqul2Z|PCt6J&t7h^gZgY)?Kjt%iCj36p1o4ja z#i$9I2Mw_$mk&*xFxIbbMJs`A?DicFEe*k5_qaIqN0;A$> zmnC03UU{5Wkl~+Ei8YrdRTs0K4}BNnHAV*8X4lKO11WrGx+QWT0Qxt1ObasFO=kNW zIuH)N6;!rlit;L()XD91dc+^P2|_4nX7Ur*VKi!R8#iPY`srsiNV#p>iJ3`u(nyy zqtO>*Bgi71Uyw93ZN~3n0jAixY*{*a-3WCYs*EnIV=ifr68)TV=R-TI2&BBIhf$FG zGBTy@Ap~#=FuQG>SYZs3K#VbY4gudwcnfbbz52x3-9P7SJ(jt5jFo>W17k7^$!>A# zY1G>IBg8kL%ve$@yiVnOS2D^?cDMLodeWd{jOvJ%V1@0~gh=mbo)?2=g9*R(n$FmT zDO$KHwW!Oq=XNhs;9~jOeV>E@Y24l(&el_^!}}@C?szJaqz1?=N%d8BD?7aHMZTQ~ z_DEMbwk_}{37TaukmzUyTuB8{fgji5D|u;$j@+VSZu$wN^3|`6R?@sNEJeIO0sA5z zYEt3*5k<SdQl0vY$%NL(} zvDDDE=R-UF&+-$&EiYx>o=ulEAZ}cwlH^qNOU9_FZ znI60?DqXB`xDvm4bZwOG`hmAtTTVq5L;LxHhS=oAj6r|rIXeq0xm-7kK6zJcsnRBn z_}i!v>$AkVt&UaWPeC3DyNlx4l*JNX6vanGX@NZGhxP~l_5dT^jkx3SsOKDX-ZhUU zdD{p#s}4JL;`Cw=^wS+fB`kVho49vBC3( z8ja{oN;@ixk7*Tmz`f-JM1FNWY|#b~YS zWFy+Wj2M5wgK^S4vQ{x1sE-fZO+$7{5<1EV1#;Asai5>B#7v$Ma)7_@*||t@MVW-wFUm=NdB^o`72s0>Udk%j zG{VeeW&>5<@+q0aoBn}|F%9)vNMB)(hiStWNikC4?RVK~81a8d{S?&F!ImaoR`s)A ztU$_|D=G-sm9ht$mOj{$phoqXf0X!kaB?u{VC$g=Uev7m5g%5v90CURO4`e)1t;Y; zbGRhoHEXY4VR#{Vp^M7u#(t65GC8Ox3ub;g(>$`4i zIG%%?H8DgZHv% zj-wCB=RMhWgGL|39&%e9gRNQ zK2OvW3=gYnz)uy7^xU9)td&72RC#K75n~!Jg&hUGCAsPWK1R zTJRCuRukVee%qy>${nX0UFne9nE{bT<0;f_7o~MhJ^UliE?Igs6r7*_O{2SF0R%b| zsq8+lnf(@p8S=9cM8p(gT)>G_y$y9N9ia)bX5Ozuy87|k!wK!GoPAQxKL3PRVoam2jj0wtlI@jlmg$L2s3aR@W^_N;K zN`}&KWy$n5XX>s&sZxfBC;~$I@d)u)-(i0tv2DR{=v6Kl=Vm7Ss9L?=>bQvjL*JE| zyvn!I3hi|rMMWZBiLY`i-iNzKOu0n>#c67+)xOxf9L z-8SXk*Ui~`kbJC)Y-fOpDTkP1DyTiqiXLZTn)dqcE&>RNZK{kHzM{*g`NGZU7dH~X z_@AFUGaI&NNWcD{qi4x<8?9ql@7N)-=lJyx@;^}8KUwo#%MUeZ3k`*G$#no?6(*yR z-u4ezMY=itH|T|u{)6fL|3vowEB4MnurWhCJSh8B>yp$AP9k zk*KL95%LO%>Mdsh?g@pUOI}gPDNvQwo}zsuv!pPNg!u+cvg(d~XW5_)$UcPSU&O zhaT&M2~xi&J;Nz+=rm@%uk{L5!Vd=}tQoKT8#v+Idf2*_;AsOAB2MZhbXiHH7H3$U zI}}SBEXfj{L+3+<%b~&r0BDn#Qu|sYRNCCEbIBnhB2vB@T*EN+2$4$|L-~1#i?uOu z^Mp0O3j#f(7bEXe#6}DHX7hzOK#*i~>7;GS5Y10UV#AmcWPUI-6h}e4KuEwlSaTR| zEk9D;sYxZ!ea2&SE$9zK7Kjw(oeS8R)^~st6L--e<1YWfIy;Z_jv~B4qn$?Iz^qHl zJN6j6*+&gYAprk*$HvgNv203m+{b*^5W_RIUSS8U&+fvf^!zHV6sKZN$?;{GV{bUx zmYDUHcE6tT>y`5qfb#Ibr1g@Lr#3fh0ijM95`VdBRi)#W1yje*su1T^W359V z&VdHM@*#R*v#KkMHi-_k9aIF^op)JX3MZiH9X$q@8Ya-UyO91y)xSH4s*LjBVRI7VG;pYs8rtI^ zl2b7?c}_Z((-O;lKz2~ehs2^xeGKl_&UCa%#IP21GtJN>Ua1xGs{&jDK|Jl^#05izEN9_{iEamT>lMz{tr$6y8qux zYW`{36)5^VGWdACiKV8gnO{|fsZ)uM8Vs8$=oXTlO<~)5B6W!IJa_})wuG{Tx;h>) zG4c3!b0vnv_wF7Zxw*M80Kd$~vVxP731DGiDUo5XPyq};Sr^sGd^AI}FPdzk+EAo? zi%h`zT@3l#@qB5ll4;8feka5>ud5`Mo%4yYZ*IN5pR|rIg4sMx`%~w4^88?ave3or@*wpyMU3BAoLKpG#m~g(pI9S?{!liKX`rx@_-Jmn&TO*T!#0yWXcBD2W zUBpI{DFm(Ta{B3{1%HwC;aDeRQb81B;XGpxlt*qlVw`qqWlg3WFMYhx4bs-Kki1Yk zmd9gga63<@L`A7&W9^j@J8BJEBeH?%QK!VqH3*HlG65dzeEWjGBF~}=zJ9M%ZUoiO zl`!I$vOg;Ou$_Fw&0yos8w9GVx%@{}9{7HVu0r_(FvaO;daw_oOB|K=1qpS+UGL78 zWdBmhZ(v{mY&GlTzElCCiYhso_Gf(&YaO5Ft1d~OYx6XN;yhr`-oTvmaddEYXw?3T$>P?RaL_H97>V#*{?{FP1&d`>?wmVcOWa3zOT? z!(Fqhqtd$mN?`3cCl;lQ)TFURV$g+n+~yBU#U-p-9!j>#o^r(? z@(P@60H);75PZ8>*S>w3&*bwSKUNQoOwz#1RpO( z`NgFD=nU>S8jepyjZz^e%h~zfwoXbQTV5}Er}4D;2QrTAiX$u>YVUOj(?*=}t19z% zp!QjWxhPVBYVl?tmBlx8I|!dKDI}}P5FK9Ea@sJ}q!HUF`Yq1vD2gmxlI3)OsF$RX zlpB;r2;#5LT!27emc4Uz)sUHy(Gem$Jw0t3m2*P!7n#)IF@$-irltn*h6@5JKBvnG zo^5G{h#xsX#eR#n*ZFSe(I>#5QCq@FT4}ffBy#?EPP5iiV!6URfB1hCd;PZzZmitP zO6~c9czU2}*nZ;|%KhWr(eCd;G(>bl|Ad5>=SQpAUV(tyEMW-&_x4J)p7fINx$M6@ zY`ZeJhuZmx&sOO>tal-h3c8{{JzjO-5E6y~@*$r4!M+-(-M|5ts26E-adM8=no3(Q zHQ|JZhwo10BLU2Mw(hU!=u9?yqjslCaW$$9pfwp}5eXj{p-;;~wxoX(mionl%DS-= z)QfDIigJm5Z5O&;p9KxsG()#m>x|DX9gDG*7crgam9n0_&EsWb2T+cGu+m0ywd_V= z+jgO`1}XX8DoZ!he|`m3DX-O&2+tbL}5ZqE}bOxbhpRb#|w#Z zRefwa8#&)^T_;XXu6u$3B`@!WHh2yTSSD|oR!%=M=_^g7cONT3cYw#6a`*#6-_xz% zkV>{J;Zs|ZR9$C$($K(vUK`LmTU*vFk8Pq!)2*$oqSejKO^2hlE3rbAdccKzT|>C0 zZrqy5=du4ue3{rl9hm751)Xd-6=?f?A@SA$8wo=M4O#lWfZ<+MAM@4udgnU{1;-xg z?bEX}90CF)ko(yPFYWAnlLHON=yed#c)K)W$LXa;_WOtx(odcTodD){ ze{M+%)wWW_w9a};z5w^j>xVpeSfm&+th%Dk)%lkGf3k*E^1r;y$m6mP3LDH8#rn1o zUK4Cug)2dNSDCDDe_aa!Xv>G!C*e<3*ODpeIc#ojJ(ex5K+0OXBj1&1_KM`=a!11j zYlhiFQ~m>_q(gs?cj#fQgmkD6ssG2KvY#weSNiTfL^t$e=N{gw6CB>ZMRa3|? z$H%2!066zC_4ao7RP+Zjb?Kt9-vybfQ!M=LE7Ihs_c>iTM$M0(I`3tR2%DI@R@k3f zlY`Lu@R>WcDspqb;)2U?Xl-f)Sqhtz5cY%%@iwbolfUh9GYm*ETbKnL?EqFOl~7Pn zh~EeQw^XBHi0K|gVZA`PUurvUy`NL)a`E?conJ}8;Oj;YU+AhECF2=FWTZmhHkLaZ0?`YJX;TbPIEKUe=zinA*Ek4sU#IEkp&HAZ1D4*&)M2*`r9o* zP45U=){N}@?;a~`x=)PYtiM3vY>pTgn&kI}#rl>m6SAS(s7|pm{oaf6vt;dy>goP) zR@5_|6pEv*k56A25)Y0Vr%`WwdXP1qJ;a6?kCs@?R$W6IS3#iX;7zZuNiTom=j?2w?1gi4 z&m&e|ETt5+^_-xL2II+bv{%h!Ck11vV?mY(aozz#(3VV+n#aOd=$zRJ(vqrt*8&>9 zyVhJtMYnVf<;<+wXlLtK&8&&@sCeWz>jpF@#ny2hVm){re;%DKfI#TvEAY*>aNIS1E(qSY$_|WA=~9!!_@47zof(>n zii%DvMlus8wjH0ypQ=RZ8oom$wFD1t$c>q$Qo3?1kW39?1+cbmr9WTSPzZMtL)=)# zvLR{yS3Th}#Fv=y}=Yu(DQ>5uxrhRcPR>f;7vpeUIf_|)Bz%F(x$V$^Yz__+u3uJVEN^u-ZqKc|A zwkmW8@7wxBwN%C2OE&_M(LbRMd7W6aa~>V#!uOk3a7UbZcZO(C>Y?r?duF{Bn}wJq z$;+6~U}Q0PG55PWO|9L~opCl53E3-%?1)~-FI@rg*RXA-leKT%xP>IO>KiA=a|t80 z=6Cie+=QsPb@P__q!kYeFc+hZN_8bQjvIFJ=@GvbJQiqYVx{wHJJ;?r6f1*Q7|eKR(OfV;j1XgoPKz{KWOiY#-&> zzH$%>?Jo5+5>K&FcdvVQtNv@Sc{N7z5C*8nYpMU$|dy zWB?#ocGB+i3^Kg3>N8{W>kj)m-{e<^djjalj%_=ve@RKn%#8qBu-F%mv+dOObeHKe z^^(%kFV)p-h?t~d(iA=kt0V6vMxOOjv@x`1o_(;0!h;y?-7G7FirP`VJo0auobu34 z`QKOBY5>6-7ZiAIJaE9{j zSZyqfyIT@mhSHn7?85$2+6B|CR(?5!SOAYe&CZUUoBtTBN=*t(v_ty@?94HWH#4m}^gWRV-}@7$M8GCIoTC$za%t7n<^O=;^C^#I`cO@qrJ zme7MXn<5n(h3oWl`gh=l$YvJ2N$Hfv_4?S`Y*h{QW_{k+t=)i=Ca`Qu)Z09(YN9-= zSm4C$ev>aUet{uLl3#>i(8-&Lm2if>6)5f8u@(px4$ficjF#_4l9f>r+C>f(;V`Sf z2T{UHQ+*hZ*^p&1Pq8v4z#8jhbJN92E{_e4^vDNJ=CYM*rv&>R6`DFP2^_q=eiZ;C zKRhMUcj~dlxs{j;UoKVjQ>oCf3Qzrd^%u_EhqB%@3q~Q03PXe9b`lD~l=o2Vv=D^A z1L>VV3waNRuQnbl4PA}b<#tc2jJ^&kad8q0mad>8uSpIl_F zi0x(d4dR*kp;SKFGl?e`6Z{8gLNzzC@OfIN^)TrjJ>CjG?4pWY*Wc}adS3Bj#Z0lS z(l&Rs+^*TJ*;U@ehEn!fi(P@?_jLwzl*BkRoE$UaKMfm}LxF<9B@|^>=dNohdd;i` z`Cu}P?JXb)uo#7O+|*}2ce;AS&ef$i+88R_sfj7oAIGU);$e|lDlBcYN9ZPUh~D@# zKS$>VDT0J<@r(9ip-{c(bG*I|op_KyVbpgY!Pbwcj`4gx`wSOlrX5!u9jE+y9?yP$LxU2RGvfGa zy-!(Z!=eqR`3o|}ch46@rT46{8# z3kS@&jDGMC&gG$Qk-)M=gjsr;3a|dEbj%<5@jH z3Y{MK0!`ZsyyQD1KZZx*{ud zFIufgcOb)X!2rp!pEE7(eOI`u>{{12PsO@12v$jX*`fRfNWBi=PluP6mjF0Q z`DteeIJ?f!8%?%&;BEF2Kx*&)dWw4Ue`<@MDFOP=wbv|rfYm*K|69^*8S`fpDW56y zKhz)r4?$6mawUJwBHhLO2g|IZklsF~Cq9oF>2)mC>h&2jAYH2$_)`D_B>q33)Eck! zvjxGlx3N`KfXJ!$cRt`7BHIcz!2Hdc)p8hIUc3EJbQ*NK0#_x;{@I6^6ltQaOz-<0 z`LAo~I)b>mzYOuKu4i6ctz6 zGC8AMlBWg!tfNlAghm*N-a169DC_Qgk-3NZBUhGmeT>-3yM0xLBt<<}qxkD*AOlma zZxs`SyV%<;8}dF?!q#Ul_J(8?s5k^SR`f7;hyE?j&CDz0`?qxKf!x`(%aO(w(WA8uL-@;DM+nj6iT-ox3D>e z!7^UQ@FDHMvHM#*J*{)<=6l_zv!iTVX@36@aT5E<)eG^}J59eRpbDhrTZl_O`4?|u88ebwDekMMwdetq0#^dwz zaJ#nWymR^#u6D{%`Y)Y1o8xyl6t+*_m5ZsisZNdyLMOJMV<(AdV@`=?HwyZOx|jS7 z-fq}R5-HMMk6zcf2h7S^&ObbKEQ-spi3AP0ugaFOr|BoQs&TQ=_a=T|=E{BJk)ybO zKFZ&+7mppo5QH`MOA8CeZ{U^*b1rDQmlMyGJ7w{8(1mnOpzGl_0Pog|KNoWSKF(c) zio?VenErmshj1{?qI~|R<_^gxh-?s?k+9-mY(vCxP4Ru?YF!*jH+}oc*M0l}C;O(lfHqJWS|oAJG{df?3Z($tbpe6`}I zzF^Ltp+|}J*S&(Z{9mnoXIN8d*KU*%MiJ0aRJsk7F1>?DQ9wWhL~2xe@0}18 z6^E+yUZj@HguSh^nb8z z?u@3hhk;ah;$JpRRkhWOY;=YIRoio7+h*O8JSN*?XH9CoWkq4e9|2{3<>P&wu`b!I zkI83{DyhHv^|k7;_gia8yNmJ9xDL)ff4j4aE`8JLMzW>mi!7fm4ze)4W zxz@RtIYj)%mivM6LpL|rieC6km#LPap`jbpb~V_c$s%Zzz<$yjh*DS$S}DZEC*bs2 zx!O#bM(0yTq?b5VKAvsqHlRoLHy^PqL$iEi7~)dRuh@17e95Mvx*xqcB3-h!8a`)0 zkLIGB)Tpa`6V;mh{=2UTWoPwBtElQcDm{4DZ|#|`bnCqLdFXBs__G+jwYf1as`}ox z>H&}1yV%c;I;-JFk7~bi|D8VsJLaeTaZnZZ_XzLrKJBx_v4EGuRb%DtqUo(h!%}IAW(3O3N2#!frF<4%w~~(A42nF`L)bw z1~rHGojjct6a2|pj_0yEH2?OCieV>ds#$zRF<~@!%_;DWn>`GAx8wz0pAgL`D7Eq% z#EmVK#gFk73)?%=wkdC%5j5B_qPPF_4-n{<*lz`wp5zI_$}!|N*Bak%UaE+ZW4_s|AW*KN4T<$>xhcs6 z0yPAr8bObd=(kCvHWF>=beVws``@%N7X+@hfmT6=I|NK#(|G3Q0hWz!cf4tBCxXjOn{Osqy2I%k4 z`lmAgIM9E)&p(#=r$PLmOqg}U$EMs1C^{lJn-K(B`u&OfrzXWEJ7D(df0hvXb0+>j z_Viz)nyY(k_!ua-y7&H-ERb*fih^X8=cR~xEY>`j?c?5go%5iqS97HEo~c|Cw!bPf zfj%CKog*tV;Qsqee+I5gXa9KY_wsenoR>-9Ku7Q4g8JX40M2pXX?}D^GX1x6=d|Nh zpelKjJJ+||Fi#(qdHc>>%txaw&C0x`L^h5=KDqpw8=fhUS)SK%mXCoTrk$D$DF&n+S!)64w883?J#;iph_+i0zGP|*Z7J0>k#N7E+_ zHI|@t2iG#;w0tLd?S_RuREX=_s z-jAn1t;jhNK~?9ja3W=xd5U4LXiTIUMGLB(aNa5BLG+L>fl7Vldm zcqhRsSyV)n9-!L3(6#^ZAv#%09e&PoWh!+Zrm{-xq)lDWtc$6FycbQ_XrIAaAUfpT zIbx7i<#*ZpIy${kW(w#H?s-cWq8CpHl;q0dA)L!xOVAB>adBx@89yz%Nc-`)sN;ep zzcwT(caBGR@K@=*{m`gOrd+%Y4;B0P@YphLy=L#Yr>fRvIkW5)4$LFcmh9%LvZk$~ za7@cPy=vpdrJ}~{5k!U?8s4YGzvUbSp)#8AUw2MPp@~rGa4#kTqTlYTD+~(q{V*8I zQ7O2I5)dUF;jlFvj%E~rG@7I40<;c03^Aqe1g_R}IDr#9a4H3Bygt|0HOw~$ALk*n zm}(x#NKYR`uU?qE3X|w*!mse9%FZCvOkgo0T{Tj>Nk$UaEk+$XOlYie{FUsM7X`|e0}g4`Wsh___#SGS-P-yj`lM#oOJ0`0UHz*MYuRCi97;Rq zigFEyL^?`8SN9~2${J-5b7+zKZv8%^+*GB|EvWO?Xn}sS4=UqwxIJe*_8f#glRLF>9F17@k-UTNs*1`~>juVn6m0Bbt@Xa3Mlv8)A{Kml zUfh>4SS}j{X^v?&3FSXAxO{W~t#+r6c7H1AtCE<0{3?``n0(E`wsfJvHI1tFr z#nnS>0<2GP^{ocrb10YZU7ppeZ3fRvPwf8zv;8Ngy!isz{@5Ua|JpSQE%Wnjch3{K z=U>;y$Nxs0s8YWZ%WY_7m33QPT^cyJQZGlv%FD~Ei4)YH!NA12+q72aHNSKdG^3Rw zTq7eR<4nXNunm6YznwWl`W_{Qr;+C{QDQA6U%qI#%`}(*@%5zkr{CC*c&f=6$(gFh z2v8u$9BOvkfK0yHFXxSkZ7m_^xa_1jNwz9c_b&GOHDqRTlh)?I88U7UbaWyCiR38C z1N`dMD*=9f&BKeHo*%|5%toH@ZN_%w4$&xt&=$Ty>gedGV|SuJ_rL(zi4Li+bRN&D z66`F;`(IkRJqYZ62g!}KBd+7a3#*E!KgzvgzTBIXn79Pcmci?vnCxy|P+GOQd13n_ z1KZ&>K>>l~4{SPjAa8=ZbH8~&{l+hjq|wHBm^yq)jY6_}#3HuNEC6|+fOfU;_?c_9 z^{pm$e;G+7>vH|aFkvIR{TrHt?6+_c^?>$NP(-A!7&0?c@R-KlJxM)1g|#ml(Jq0VQj<((~~SjWz>7g26C<8VpL zEYjkhe1rR2w+x%EaiAj;yP^;mCy~mZ>ohb4F&#l>lw3I@BjsNp;O@AaqC+7&Zt%r9 z!1xj#xT@0elVaFVO9e&AwO}PQ-zCC1gmv5{Q@he`>$PFrnM|rew|}j}keo%xbXay1H5EIeMOFZA^r4+FJnn)o5gUYkp3YN`kP6!m%-P|Qb^>Lh0e4rtF9rZBF}A`b z(l*XE-gc56(C+cUZNTEdRJr6 zc=)xf$*B0k{IO)^jR{U%$V~uijWM|rAp=bh5^Vj(yKGxb3%9bj8?9E4)G51F_?G*$ z<%gVY^eWx*F8a}$ZdR8pK#s48PHIv5M87=O~Bwe_`FnhTSVsw$cSh+ znEIIQER5wWoUdc&WI;Al(?iDFaYR86uW5<}u52xSPJw!L*cyEe^{E!tV4Pj7HlCYm z-}>P)Z6#q<rlvx;W+K#S=^U#KH!(pDqPVV~}$-c$qF3mpRkQ$UK;7@lcjhou5m zcv|6>R=(kJwj_KfSCF9WVi{nF`>Jw+Pd(NfYe?8@m|0K85EWIimC?JWaM5EC?H(l` zlIy${{Ym ze{QA^Kjg4r7x~uqL+k_J&-OEpQurNZ$wW*?$eW_6a5n>vu~p*t!>3rouiahs0X znoG@O_0cgRzCYa61>#-I2POHZd}@Hr`;ChA$1c?{iwq*JcWNW~$8!x09T@5%rHBtJ z68xmT(Q}x^Rkg0*q2O=~vGjNbDYi!r}h-@`|jN0ydXbj z)2QOfb&&^6^I)rC$YvZF#}CginR!6IdwgAC4fnG^D`LQzZpR{K126j@?(~)5N)iD> zU`}~Dcaic@pl4I*jyjI!dNd5h8&5hBq-gi z$vnZq4{SbIs&&g23Vo>YbOA>F?4?q$?dx$7S)nT`8sX8V1gQJO$_U^2*b#As2CJ6ZA)~A{ z?MUAi(Y40rbMQ(5PyJT10u=<<%*Z!y27#lpYi+xJivt@xMVKR;#{_}Xlxl;nzwuzT z$KUDbtzlS`#yDmUukgKh(|N;Y__~0Qqfn6&AGb`aX9>iohpFUw1A5 z2HCCEj8m|*z-;_7f!a=@O)M1-9AZ>%O02!-Q>4LKhTnA~eiYgKvF+>4US!UhRvDM9 zttlL`Vc} z1OmY+Vf$u)Y9V~iZQ_F(pkUU~)inwYZHm^)@3pUqjEXv(jjtjiT!6E!Pn=xP4LY(b z`X|hq#BG#apUD^lET>)oxPTN|$kMRx^Ai5eqb0roI1d(HFYEI7aqc-$%cUk+0)DI< z*l;V~zC9JgA*og4Fz{ox0>DCB?7dj&Y%Pf>hL3KROWon^?d_+5+(3}Rseoqyt?_pz z=5N%&Pu8dIgXfwssM*?}A?y4h%l0w+zX2@9o(j<5@&2>@WA|+$!@yqOPS*SjDurSC z7#`h|Pfy-`Q6}~gd4%UxfJnbtP>_7q;PdzS`O7ceONxrLmY0{iJ3H6^g@*#lE>`LU z%*wvky*===-LIBUti9aiVyW+*^G@+kH^rNetVxMfZN-j_5&hk!G|U=^As=eMHm80J z_OzqXBgc7i>*`YVmpar$1qF4^T)XG!11;}1Hj}tBasocGO4u}pfCuP{E`MU5yC)7o z4)ao?8U}ep`E*ak(oH`a9u8kT<*~7I4-;D<})hv`2cDFSuiJO$ewk!(&?#QoNrkr zdN--S{aS+5^9TtPG9}`{b}+?9 zLc4l}-uPX10*Mo$m-CuE$`9hI*&YFwzQ4r_7h)Y3&Tbj&R-C!0RQus>{C3}`dt*ft zNDOcHa53F(_%j1?b562y^r{)Zw%*RE2MWmd+(Ox)n#rQ|nfFMgfc6Shgb%M_Rjvkj&*MBB$Qa*$IQIgUXTB(CmUapGc zrjGJ<$L|fXbM96Uaj#`J&0j7fclXCnYK}q8WoCZ zl~XJpK{G8|`LymgY+n8MA&>T7pXgy2Qw@84O;cJs{(XXd_wILh_O7pf$%85LTG#tV z2Mu~`<)PjSNl%&tFh>8gCAW@#1T34fG85TzHtU0#EN4su zWZ>i?;zM70A(yz; zG6SMbtXf-Q_2cIU$`#tl!>UfpJx~;jV?GpycCR0mc^fn_Yc7Aw;a67H@kn-|?XTf% zg38KP@%yaavEb@8Yf4dXP(tQ6cgSWad-B{89pvVhnK-w99tx*OPgQyV9>o$^`9Rtc z#uM|}QiPL=1dwed#87W1>PRR-Qu{%+8MCd$aP-aDLRH@cGa(NmKHpKqvwREK_pzjd zkFP3C`+Dnhrasv%Wo;K#TbF{xEQ;)Uk^%Mm>PTyZbZOW9_r%J5D^vQWlZXZKp6vEy znciCVdc%x`{4LX88UT5q|1tS4e?W`jd$!RD|vRleEy??o<$) z-v%l!luObA37mXcteGX$&46_+M{$^2P6S)U9|wpigB4uj#KBQ)E`9-7DK#JOIrk`z z&&cgjs;K|e?DphonvG-iYGadOyp#fwBPQ8)Pk3&Ar(>QkM3`wQ@)jzLM)4o0R-$^A z#ItJLRiL8p0GL(U5^*Ob13VNP#nkB-(n$Ez-g0h%A9j2lN0CilJUn~eG5(=bJAgf0 z-x|uA7k&er3oAKo#}--Bbg;f1D&z(XxQ)z3^DWEn zx2}s)%o^jyeHJbEj%($^pq2Gn^R|tY<}M?}0((2`j)z$+@zKT!KuAzAv!%Q}xzKry z1$=Ow|4YOT^#n+zTmQ`S4 z-h-~gh@a$==`}Yu$72$lU0kGXJKyrkOX4^?|7GoWZ_enay4YQN-((+jVh)K?PSYg7GuI@+cXIRF?*_9g~ zc)X&ez>}pq*MA>ZK8TMk-IMppMurIC7^x?D2Z!o3Q|Leo0rp5&Y*IBDIhm(X->-9Y zDYRL%_t243m9TF(sdS7pZvZhHCa~XP8>N$DFqp+0wVk55quUfkKr{@L{eWtk8zDL} zyA?ZWEbLTW<+aH=SmvTeD|*B zw`EnDA^jm84MXR57!SEgmzr_uDeUMx_Quf0>Gde_?9K#ke7 zAM%Vi+=(T`f5@{&g$MybJ}ETWyVGlLZwwo+3f4^!+36X`F)UEY^V#2SKF-nbgnA`- z-)qXkMdSPBDbvVD^HMhBr$r$9UfK`nLjg-wJzUKmDJkBEF_Hc(v6LLHX;CQs`1xCb z(ud1Pe{0=7idL8`vIS{G0flafvG~BUJh?8UOKz6UxyfvqWEZ#ysbr_6kh>5Gt51l2a_nuHV zc?(fwR?-k2N4$aR)!loT1VC1lq!X7B6LH%3uw)cL)`J-*J#xRFZ6TMYFr%=?J5?e}{ zNMjXiymGrM;8p7gy-{3URq~Nyvl!L_T>ecRb`RP=zje5Hq;}k9{By1CYs?T4)!QhG zHB89P#Q?w&$s~^*Gyv9qcMPPQc>b!k!bm^m6r&oD@@;)~;b1$3(T=Wg@7ohvgB7hp zaD=&suIIDHH3XxI2f8AM(YDUIVLg(e6-jnwoK$AL$m$uS*i8xbAi%EXN)RD7xyenQ zm7j@J#);N1kf3fS?FX%$Cy9dh0#sN5kePeFOvS%rz9PfrEp>9~xk?HyRm2=svRIu* zi2v5dbpqjKovd=Bf7F;NJe1wuaZWc9=GEJ+=USuhB4xMvROBu)iR)YSHooD@pU|lh zvsm?_>>SAtvU(p?XdEEGT;qE)L_KQq=9F@^B&o9oEHyRj*lqHB(cYoc1y#XyWTbMW=QzIA;{eL zA6TL+r^CSo1@T{|m>?H5Fu1fP?zTBI`JRJTp|Ef_0ZETNFlq4fWdKkBAkmj7V__B7 z99HfFB{y(eTjwUmnDtX)@2APkW)LiSX`A;Wt;yAif|K?`KWHV3E17EIl(;4uWdkm* z^6Iuhy76k2=ry*=S0Re2V+_Dd2(Du)ju7y^tLl)eh`D%uGMOEB)gnFO9N~uMb=UD2 zt$g=6$)Dp<@B>#Ll)=CC1!E>3aj+qoSz`(Ku6ChbsGYQ(lCO<5eniPl3C-O{DOyHw z|FBvx$Ht|8h>CESx+d(Gs)aGJ@-WSwXU_Md0ovfj{1B!MG0giV)J~kZ^C;!>=B>EO zSBhw1+t2ES*sW9%<7>jgn+<>TrMKaIK3F4_8p%CuAWMh;$PCXUtI1+H9=Vra$OnKj zdzYsScTnA_i=TDPvh5cskHk#2ciSZDUkbR`r3ud85x6ZP7P~~SYgF|+UOQWu^`k~I z5ZxElP?KagbV!)bHffS8H+YR0;EigkVh5J==*+T$kE$q6)~T|dnW1wz*@V^S?L;rj z(_e0ur6%fKhHj{PZTI!|mlQ^ZXBN3rp>u4Cu>G)i9OkIdjNiViCtg~n6tfb38c-kx zA@xTLVs_I`=O$;?00-bTzt04ski7ftpgw7olBs)l8LjLt$HjSAEY86t;M>)%?cdYk z^6%}!qZ@{T{TtPWn_|p#I23Pbm7fjmljgiWbuzuU;g>%s3WB04-OlbL??s#ZQPbn* zhL*X%J3Axzj#iX5tSvukrlu3=RX(btXQE=fxw}gmx0z~amdJWO{D972Ty$DLZjO!@ zP!3yO^BviVvb4YcUU}ROfF!VDg*rsr=|~$~Sc$39%9@*^XA8&Q{OXq$lOQ>|gnA4w z$^nxG;jO%;YC<6MTnzqBY!WWwp7AAXnhzYOuWtc9^H6r^VSoY%kINn91Z`_rasJTJ z(K#f!dE~t{0DtcU3(FWlsY^pBzJQCo;S7=!3;r%_(a5-exG61=7=QI44o*yzIOISc z{^7-sgtMuXsD(2wFLWg+1g_^I-Dk?y*FF1kRKd@m-#Z70Tz1QJ;r4x9U54}n8p3Jh zT46!K4PoJXz*}2PfO8dq{H|Ky;xT}=>r0o0CC`VQu?M$sG)wxDX#3oAUcM^W6F?j# zC{;*6U}z}+4haC^-H&fNuFW<#EGAoQ&-2kAp{Bi~c2;ME!awCQ@dn-k(%4P3wYAF^ z4wrN?YHib=r?& zJOHG_CnYCe(-ssK9=#H$^gXnqx_Wqz4rDY7iHPVa`me0-?E~{&%EKnvy&)vLETQoL zUlC^IdC)Z}Ms4~y8<^S10J;^iw4GM39>MCgzq=7%fXji-&Z__+k@%}IT(bH=hTcwj zXj|unm|E!ZB7%hL%Lp-8ZLRmb3mJE=bef=-%46y91KZ$*tdxcNXW6*|0WyH*mp?-! zZj5S037~_vT*>~5EtWN~ofeD^eHZHiCqM92g;VulJx$XW8et8cu*&*nX+R}}>C(?u zD*Y7Bq#F+q@=B}o6Yf80=`}FJ3JP9YQsL^K?}%n8mj=Tjo$ZKXdkNZCvY( zahsN#nu;mWv&PT=8hd2i7^d>Lye$MUUSItsT`@8W?%7t0o9!up!B*cCW(jLY(lLHw zgfG1sZcc@jN@N2e+K(!$MUhwwD8Z6swQ1pyqk$z%Eaa_Olt)qZx($?&MSULWOh7FI zSQ%M33(j2EzZ?IWjc?V95A6>G0RSSWwcA5tUwskEmH+LvRiFD=o-8RNbyX1;@%$gl z_C4oD+~WpFB;dUeGe2tzY2K@Gk)Opc2XDE0Q2&S`x46qTEh4x*NE_oG|DuzXXZWfR zEo9QQ#WQ={41k^^3)d}FISQm-UDXDNbaLImOu(FowxFo!c&fO~zF;eY>u!M6b!6DQ z>+-bw!E~0NU!xL9TG9vfY_?)V>{+S`q~UPx7ZhBz3YhT=rYsj9PIkakcHCY6)_}_n zNlZ*EC@Q+oyF2%4xHJ_#go)uQkvqGV;orc#9-mkGQ@9+cK3fhRCugyalrMw> zINEO;llktP+5U}UMA+6e{F>gn=X6NCzXH`ZLAf)S5aQvtF^Z|wkS+z-rS`lvN5&pF z=$UoLP1lK=E>3``!eEoE_2FEUCYOw>=j@ToDk|1MpaXzzz@~+5fhYz%0}YDKx}ReG zI&FtZTYf3J@Ncp(%k=+37J@*;E;Fm34|R2Nx48f`%!F4z4*=Y4%gkKH+&evRNmOvQ zc1XY4k!RU2)Bd}9@1HbR|3wtn@Vo!qk@rYs@+`yPm7CT_F80=c8lz1!dQcmJ{8?QhTeN4?uc?GpveAkg`r0l#8!+~>n-sn5_446X$H;oY6hFm);G7FhKfI%p@GW9k! z^)3LbXC1$OeD3?=Ja9sc?`>HLAnR4(Qxrh9)>7*a!{t}q=y5H+FEVOLb3@0K|BFZR z@17WxuPBZyttimo?}xINDZ4qE%Cj#b6nu{Cyep*0&z#LJQU%hmr(}F6e8z1SC2fhc zuMM)vi4p%nxPy zU?BRf`-;GHX?#3D1!C?%A)CIv>eC1C_n6-tPWdL{T4rd0Io6MR;Fvy$Moz`l^i%u3 z2eizhI}^!_`NW>8V{xwtXj!cNH}1GQdVyMWpQYn7-Znjx^)0GBhW1}waa$n?9r&Zo zBXU-%zq@Yk27Ut0?@b2t)MSb&VZF_eU2iLU--)0?g0mWgS{ztGUu^+kly(DS0pMq^JzPt7Q$2a1U%vIfG3S)_h zrT!WvlAU9T+!#&qeCf-b!D=MCx%CifT%;$hYF$+Mg4@)1fsUJ5W~D`xbM2LC?PNU8 zcZz0#czOqsta1*Hmc6qyHy5TgFUvQ!vqWkj9z2Fkct!XycANBOg_!s|6v`B`VEhcl zoaQ!$|oV&iw`!uDUbSbG|e8CYaam7jr@?Sl(k28;5`^lM9i zwnnshjPlJ{l|n_F_7q~k>VV|d*G7*7UZUSdFGYTXMF>vG18DA6$OWo{b`0nDu#zLd zglk$!_30WLgr@!}hpvOX9>~2P^M*MI5H+W@(sb%;d5}ywNNRm&Ye8x0gF!jVnYUvXWzC<=&7#vQR?2KGIC!m#$$~}= zb{S^&$3PQdmtIB>wvO@axYUp29-P3_Vfs06Q$4e0#`b6=_`>O;12+{+$$H%d7I~|& zo%$eUgaNE8U6~dayjx$>B|J!RX@08e)e6k_#jz<;Pv zf=lq)b+l4x(jMdIFH@TJFR00e8_`g-F|kf(X8#=y8N#v$33gTeehDL9m&e2Zz_Q-i zfXjAi4y<-!c<@`wQihnbZ{Dn?wDS%_WFU#%#KKMO>M}lMyQL?{%;_7wl+CzQMAx;a zTz5Wu&?B_2E^mdLzUX)ILSpC^|SzYhs|dCSAwG z&F#ts#_Z<%g@-HQ4cIY5y1j=ms$A830_1qmBXQ#%An@KPHxqO7I<2wg^P@oRik6VZ zLsIiXs-TWefAR?ZGRN71yrC<`M&26yqExoy6djU;TpT%Ex7*n8LEaPbAx`h-BK12} z*9h6yMaP&tbRbd>0$LAV@W$>x|IFp48(_9Z)6Xf?8+9>6E{+uutOr{?xRHPg6Q!kcDmI5}MG zXBAlILnT)>byHpDcY@`*>qS1lzlOp%O*VQg6=QR8jq?uve`=q!#6U~WS$Px+o-;5F zpSG5gl3FrQ%~;r|T2ZjLn6+;VyXr)RZWp#q7r^NH@wMctOMOU(*PIqaBZCvn%+iM& z_}JkFe&di(!~rkftp>UcG?;KGod3h*$??^J09PSPS@q-u{UU?7 zw2&Z*bt5`@$rqm<6RSzTG;_d^A-;Q88QVD`b509|{LZ^(KOAPGG+O`9WrUPR!PR=qFA*m zSt#Th1%=#=C3`~f#LGP>YNf_DXmPa$=&InJ&-C*h%C0G?Ts#H};L*3CvT@muLwU^?WUg z`K>z;q3X?W^yNEOM|na!jZJElHliDoCU?mTg#-hQ)d+p<2O8~+DdYE^WWcCXrBO;m z+^?SOTDocm-`2VE9tD5~X{;+s_cWw74L$>z5W!?wAhXgVLD`Cc%&FhuBfR^8rz?V8 zpVX>#1f`vJbws3OQiMzs~-=FW^PSLuSG^ekTz)oxW8s0+n&qP}QZ5`oaC=Yfqf1 zHvD&_TKXRzlAfVu8F8}_6}Fu1zKbWUZ$WhsY(P`=8=AKfB$~yIYvJ2{TZ7q%0}a47 zdUk=ADvf#{H|OKvi-e3dW+gS8r=&3-?`865;whWuQ>c*?P>lrE`QOWGeVaC*#rr@( zDk&qSAGC(UOPLZj`*GH{SaK{ww?A&ct-oar_s|U=Gb`v>v*5dj@s{%U%n2B2RD-_# zPHxp}#y5KPjHX2E`;$==>+qwNR->rW%~Fw)^U|JiLK_-a43SSQ^J)%^f);u>VS!!0 zmKWjkVGA5{XYaFWl-%zbkk|(vH@7XEp0J;Ad!Zvl8)>c{NxY1Bymt2y?qdu>W2%gg z4)OhpH3|#m`Ghj(!*Jt!rIjcIX!GHeBuvImPq5N&G%F37Si0*7Q^-&dmX?_LQ zU>pA}mkBaQK_PD;d!aDB)al2ya*lLr_tk?pWX)8oRftr<$}-EP`&j$3VbPEGd3 z_DS#@@%Zr~@vI*_ebCGD@xj~AXP@zZtNniRo8+_qXT#{>nCX~%(N(N`EJv)~Y6jU` zxyk8z>C@ju(=T2I<}MU{%`B74QC}{7sxzYH@@<1+1ie60t&OaM(^2P_fm+GhuS{&K zlEhM-{7KJBDXST)s11sZ#tpP1?~SGOId<|LBw8V=sK z+^JC05!&XqeIcjNr6iZFUNn-$mt&hwl>vEKuYF!h_%^sWDqpo==o?Q);Wx_cq^zm@ zbII^@nX$!0K;vL6 z#D%PlW45x!de7~SZire)3n>x%GTSA4wN{mGV?8c`u1U6e+X5m$kqrH)nRrOCcd~cPC9!^LZ#FF5(CLSuyP%Du;O6ecK<~4m zy@16uMRP?KMFK_6*oSPgT8{1=AIqzFx@sr2w_Z4Xayp%OxmB>-=~(pMdn0$T^?jiW zaK~;bbqh3nSs5G{+`m}SCZiV%k zkqa&mDyaS<=-~!Fe^%^OYlt5G`B!lQ}^8`*f}nF&x5uqDiVlW-ZQmnrRBO z7Y`rTOHuO>#IJWlW8cMb$7yhQlUk7{l1x5$MWFj&lo`TgO-8o_{oiJFP~GuzUd@%Hh_@eZ@uE;t*dzFobj&*>bV{{w4HJ;QHx z+%C(t>Vt(^g^I1l3z-WP3yozjwD`VvxWDpJzrdJ^g2Y{ZUTkGq{=y*06iqLxlL|_TpXC6ODD{YW-JG4zeCVoTodoRs;lJ=K#qP3!Ll z^>s={Puj^o4p9vqXDi{L2UL1dQOf-TRMoz z9hcV4Dljm0JLrO&rA~PyaSHXRUG0sE74QqAlJJwB9^E7wI0!Q_WtHEG*{Ydl8^t+^4 ztJSATheq96ujDQ2RnOO<-993Y8k;uDLV->%S3j*D^eP#)H*!rpUVGRS@BBX7Nqx0N zZXj;Qz`(P1_05kMYfbNBgAGSmokP#*IdFt3r zLG3nO)@)(AgKmw`%Buw`u!ts%duR3$4)q%4mxm1k6<)8s!ku8hFNe?VsZGV=J>$=D z4)W(pyBEuttdy)k0%s6y8zymqExzeX-mUePyYTix32wxRaN_Zo{qI|~D+gy}8l1gh zr(cd5_27<&F>@os?g*&qmB!KJ?$I}i8N^oV$JB@3bY47{u5BVQZZfk|4X|WWMe)-J zxbcQbGgFL`OWJx`eWSFuhj`@*>yGuQK$iVB6unU*Q86i%v?SpB1oMX%Sjq7?Kc?tV zl;5GG!_g$86T4c={Z{rb*nF>kIh}fFymn0Zv=~{7!X<(txq!_jZ4NLsuR|r?!7{S8 z?l=kNzE@PV((tL70=%&CQL&jfcbD(Sq}tkdP237dIz2H#@QgyOW2Vv#~q7 zofF+(A^+q^n>m>{0vwzH_I9+_a*f~FyEuzId2&6_?a$wNnz;l1Gm@Rt&9aaS-QeJ|BB8eg^{ano*b!*1n<`DoicTD3i z%YkYG=7>No?z7&q8kdWtP8C}u@Lr-vM1^EO$RYcB_ZgX9dgOa7Abm?NlsbSM*Y;F_oi)tIY2wvb2-E>#^8=QHcCFb;RcC zgMITXNGmS3auujA2$_LSE<3x7sP?5PxfJ?biYmDr9UULTaPFYt(0)L<{_~^pzWa0Q zOMjXRBSVeUH*|lWqM$+8b~}_nDhP-HR{HjBV-Oi_{1nV0;_RlKq|zPY?xVx?yuF(y zB~Z+*6QjNw#owkOhbAW|h$T>HaTJ@-75^QGrrHu8KKho#%sfunT%Fy+ z?~lqP`O$nX+I-kTFU(XuH*2lDGL95=ozrpwt6wR)y(hbUhKyCIG>+oZu1?e9hVqm` z2n(xR$ZKd}um(;ttjR=cTXV+U)17Zr6B7eX4?F-Xm6Iqc{#m$@50YB5r>J9L8kib; zHd8c*k0kgQ#$fJ&u}!Qr?TKvALh1Tt7>IVUg(0$GYoTXF=&v%#@h-aiF1`$(ca^Ng zmLuTRP3$IMMBXRV6fDO&rJ)L^Z|gdeLv-^T%EgW6{5j%y$+){8Cger6ke6K=KbJ}Kp8Tcq*Q)LYYNtY+gRx0skF zyu%SPK_A6b76#(6W19GD4*f6DD7=cBu6#x@oH-(fyc2U%Ld&@tSlyRoH>?a=qcR#ftwI*hAX___rvz&m&J0-CItwL4UiR3;M^At&6INK) zw{JvC^%Untvyq#sc~%?Z4)d4&>YKa_tj6Ah`lCz!#suSW@&-q?CZTgIH^(v?=L9u{ zu*iIXZuRplU%V6UWgFOQnH9b&SD~p0+~rL#bi@4a^F12Yu|FB@4IIP7B*M z3lC4L4RMxJTPxY`ZHk&*v+_RO%sXTi)oix7o>)!74eYSIQ4>jy1{w@q8uUh5Rxs#!jAb&gkD5dEE>INmn-Oub!T^GdcA;h-gk zWPxg{d-5rGXj8rce`x%1N0*$$dWRO`O2T_L@gludR)Oe8Cx_`a@xNDwezDc8s4 zJY+Mxw93KmZE|RaqcED*c)m0@ICH!#H1F}MdUNF5IH}`4lFu>~T?L#u`iTdwRsfC` z6fEe+P{7rKN_EtqmL9B_o4$J`&8brvQgwCqrJKIzs2sOj`P+8%0aiHW`vH^9iOGgj zqMJ?LVw}Tv6rSE7s@-UG<^0y1jG+HSn75HOyZs!vb_gRv%n@z!dhT~> zIk~Kx5H}061rQe3y-wd) zz$^N>*VmbA(4BsI7$d)1eGk5nP`3T3`pt}g2(B|nk`HPCU@?x>Ws8R@;VqRdN!xNx z&zRrE_JxGKV8v%6Nk#d@S6?>0gsP>wxHoYRmU#mS!3F|XNhK}9PYX#^>LWn~0D_mIb@BU0NjJHQ52S_RlV{-|=ypd4b~ zbkWsh6Rdtz8i}F^+&UcJirawZC)L<-ympsp;O0I5$%1+#ikLZCvWKg1RMEeBWe4(< zKf+0>B+%+{%=5p1iHcFDCK;?v;$O>Q%h~hd_Td{z|Jp?3(PFE|q5o;A_ra*RONpyT z>IQ6gNNM9YcMjw>Z{Rn*3lnFh?gC>-^xF856IioDJr{9GJ6nOdy0HSN{=s{H4%%V2 z%lfAr?VIiCr$obWg1k=!Fx)h8{)W=57niD)_*b(?#_?E^Ym9O=LF36^4k8(cNBn=T zh}{>FiKj}SGu3@oi6fHzMTvcyPN3423MpcZ?v$(#k^5Rbo8uqXk<7rr8{%;@UyIt0 zx!Nk{k5J7p2?nWw7JorG@00$=5I!?1=NoZ^Wr;bP_`qPT0tb)&nUEyyeP(&CHu76b zAht9}=W3oVYLm$Sc4>H(j=>(EIUiG=G=02SYmqr&Ry)g+S zM>F+(q2F`1>T^)d4c|G>^nLVSgmVWi;jnu>@Q&fhgp`7Q!!DiAD&}eA)f^^T?Mxpz z%Pr4)O&evj1MxX5=N365*GA-MQV_0zmh*gGTo{k$2YtVt2~IX%g;@NMfzY;@Q`dO7 z0DS043%1Y45UNKM;kOF%M~lfXY({sL%RQJm+#xv2YVzFs8GhwJJbg;WZCP?0h3zwL zeq`Zu0JeqA*dsd9wqspJK$pJ85R-tF^CX`$i~UduPo2s%rdyGmILKjDD-3IoePmoI zDgbjwp~25fjzX{A3BF%b2kY574~X(b4825`q8jvuwKQd0fZs|EKE5&TF`NqTcs`D- zV~xwst3CYzTE*4DoSA{=t7Gfz5DM)u$VnDo2ckKgCV!$8>z`uNr!cwK6GF1qmGdDw zBS~^(N?CoC*!Gu(m+A`-igrc~CRtbeI-E||`Z;bD-fxXoi{T{f)7ukSi2eQfA19R_!UlI2`LS$b; zYTb89B{cknJQo+9ipt#h2m_LKhInf%b$`JWldE>aGlr1)#a4D=hI5inGC08mW99bUnQGz zD%Thl4=`Fgz$uv!jRYKxyG^#QTEK`s3i|axGKvo;A=K934}7Rm)RaVt&LHWw8jYS=_rw*xZx4c*}&9x$o2>p2v!yVw|+;w+3j zs&L&P65V{ziQyW`{1xlZsqo#x;BHD(FD#az99$c;+|87DwdGflU1;QzbO%1zIclT? z&U87gajw%Rn<;iWSqOoH*56YQw}y|b>cG#e!J{cm`EB(=K6@8OwJTXiN>;i$o^ff^ z=Ya!KvK@(&xu@Bcs+&2QOak0wW#3-Nez{?q3b;%6y4U+n=$aYZ_S|T&_{U4Iy)Mn^Qq-CFvZm2g*!rhhP;B5T&xB#3P zO_n7&F5_Kgx)X^_SjlWRrrR%s+*l#oR6_F6B&A%`Sj2bveX^NcsdBpkI0)h6X&J6g zr>RtJNMqpx=Rpkpa)CI|H~vCzI6-*!RfZM^s|*3^E9@jZE{RO%=Vb;mHbyOB#?Hj7 z|0c!nJB|X_qAMAK2kY4H zbPNf8>7nF7tP{bp>!epd@66=79H1*G(AZaxjuFLQ9C8?5J!5~UfVX?GxKVU2@pG%; z@NHk*tT6j*tEWdP(T(pbBN?9()FU}66H{6F=~pr3y564!$NG()#Q6E+*E8e^be6{L z{*1*qNs{XuVeq`bcib*yw69Ose<=GU5bbjIDZ!fEr3>+#_lC^V=UJnVi>9F`Q9dk4 zAJiU8M)YdY?92>Mvb?e8*)xcbyv*p6*mFZ%t^ri2t}g5m{F6{iu(>nJf2+ZB#kt*n zKKyBm(;lhi?gHa(+p*b^p8q2P4$4cG`(*UBXY`mtbxP<@ebQ)t)S4W<^$B9I9T2S; z;}CbIR05;s)}v`019W*`JBQG$)!K%Na!4Q#&v!m>w$VP#1*CI(=whFuBZ>E)=EZ&W zkV9JTE&3eTZ^G*UyO}=FGq8;9ZvPv5m2)k)k|GG@JIJnmtY>6M5*$OVM9}YyBLo=W zzC;-$(u*1_C%Dz5C6Fsm?D<(94gBme_;~`B)1Hu(tO5mMfTqkhm>OExoP2QLeJB&= zlB(l1korOa77M)?k|;+l#d4+?uT7OEXmoyEOBIqTceP26Z>n6kEtdVZpoD6E;>`%ICh9%~<0A*1_rl31A1X_BW(W6Z33#gDMLupqd zJHpw^c`gTFtPx<+Mt_0Ndq4QYGXQVI!SUvH=XB=OrvCJNtHABrtdt8~287o#kKAE2mp0D6AF=f6`iOWh3xO{6P<~rg$Xw^P z+bMu{yuB~l(vyI9=Dm(4`|22|IJ;0?j;Z&(I;Q(g-iPQ;1z)_X3<32aI4T6og2L$J zpp#e95jEOSfIxZBu4_5ZdbJLoU2DMIqlqrx#MH~#g_&WOgyjhOfaC_1O%khv8(CFK z2M(kl+O@n8@FtbW^zQemyydf&db@h8>}%&ZtxA1kn6xs!-aym!n4*^HXKwR1wWtiBJ&aXmn4gTNE-V1T=m|$+P;eSmL-p#3!MiEO?xp)>2E2E#`PwT^>I4 zme)Ca2!R&P_VE|Z>@8Nv>@fKp2D=qi`y|6_P9Yx<;yz;Hd413};hQMHlxY`+IKO%Y zcj1boA`rSwKmI1`H?o5gmXoH%QQX7>C}JX(`~oD#*?27{1Bob9mN%tWsE zR<#^R)z)&U;@qk>6scPN;-!BHF`T6*NY&oq3B2Xu6FA7-S$y+Mqy#JQ5WkJY7f4^8KV!L9gT{@@z*|#2~I}VFuQ_Y`=S5V%|%i{s5h|oDm7;tU3vN(#hIV7sdD2 zIBf5^XDFPil?n0Ewh+NOg1NOOG!84JR+kapsWIXO(+echQ0?`)+g3^U9;e-lLMG7jkKaDJ|Rbo4`e~)4X zKVx#zYfzLm(~Pn391UZeG-#K0YDx_b>j2a;gX^Ql*2E?BH|o|Wc+7W_$0`ptVZCvw z==G4ZN8%+@dYtba$t$aHS2YekZLC6CD`W;6H2h{ehFeR~|ArOvn3E*k6DZ6VT%#E^ zZoNQnv9tL#qP~>aDKIuoi41AWeQsDgW!!v=MJh^P~4y(8HN1)Fc$k^Lh>Y(Rf2NRqQS{?D*TzAl<>No zr3(=xfi~6+Z63w7#~CE#8)FeEsL|frcuWTV7~sMkTIxhd=~TyruI^HxTEz-G&BVy+ zkX->`x?DyiH(k9}gn}6G>n_rBXB*wc_f~ULW%@n}%{Oyh9_T)?;DuprAax*uUFxJo z&Z5LBl|2d<6B^CW8qocMzqq|{!$(eWDwyIAR=dTT?9rIP`%2KLDI%KA-cLAM%_(GC>e!SrQoR;|f5FJx*2LVZsSWPuKMo>qG>qMfms}4#+ylS~3h!OXC zdOgVLRe_cQl7Tg5E3X*Yj^GURO3-1;%OR)yCZ-;KklG8eMB(7Q3-_?US;=#ZGNKjU zAKYTLRl#zbw!jy9ANbkOcck`Oiqb85cZh;^!`Q^Xc4Z~0#Cm$1JPckM2k>wMS2Ekz zO`4VMXZ9~mNJjaXYu~@>wK?-Oeoxb@pi;=NE|pmgn&>jj7us;xZ$*Sd20VNc`V=Kgwv5I8ON)L zPbVt-`Hvobr{W%%&JSJIi;mYo@I5OZa@7v|xSkx<)6B(ns5({X+82Lj-%%t3(A>$5 z*|w;dI=kzU^)`==rgJo*MA6(`ctR{==F`f^k+3tOaXN7z!?9W)SorhQ?+6ZX6v!$G6uImbpK1MZ zQ^NGOm`eD-@bKMf3C9_ECg?AU9+v%>ZwY2NHy*uwdSTRh_#!2;r^|l0Y1g=^D%|tm z4XP$iKhM~MyvSEKKq|?JhkOuXk-~r50+*|MQavxK^Bx*SFhnP42yNK>zMC*fIm`-8f ztmvdq*Lu|iW(i{4#Hqx@>-8tuMfey_?2e#|y*7604SEJRB?`NcFj>+Dx67J+EF z%DH4RB^p^j$!Iz^ygTQ5L9hJR0i=@5p?yphS>}CsBeYJ|2-ZA3WbJr}1nEhIrwSEj zyApR#;cCk;O3onctF|XiwpCXJ9$!djTwj@TO-7UqzD^8inXF~0R467MdS&aRJ~b_V zOa3)|A=pl}8r52Xfc}F%arXUiaEKSjMU)ToJxu4^I&i|Oi+{CwQuO(i($fL-^<)7^1};>Cr!?U zb@Jd7G4ReLqv}r!!jBg)BI(BCb$;vuV6hnaUz_U(UI*W)1|m6O}Z#()y6Z!f0Y1C0jF5a<%gSve!a`9=PoTKzr%Du;W zV?1Qyh>gg@$Fr6v0*@xe)^kR@K}4Ch{vA$Z`~V7)^jSXa_+B9)tJLy;2EU3i>CU%_ z?s2|QGVKX646{UmcTVlkUEtP|L0#Ew`}e--0WYhPL5F%fNyefBq6STjZL`ldi3H60 zZG4KSdK{N(KfQr>z4L?kP{4b=n-7OyhO8HzSCRW2#Yyl&yg-SDe9z81Fu~8Qg`8s`>C8?=+jCVI zERcjA=A*P!=7H$ZN1Lo@82{_}P|$#6mL^=snfPI|5j@y-?Q6?Ozjo@OTA!y9X3z6{ zGA7$o!duBs!i$;6P>7Z+>oRM9HaPF)E2XYdu80uV?W_j`nFyzCDjrmgig?K`OuzuY z{(CX~mAAkS4l7Ag4&i{pbC-I3d54;%?dqv}VRuxqeP?`F_DSsgY4qxB>qR%Xw)!Aj zn3;^>%~!1T#!&r&7Q4UX-_syHw0Zimkk3`ECC;(Yt6=HA1cSQYleXc5o-2oX7;S1t z^$Bw@*XK$@umsO_u0;)WF;zJz4@661k?+@`<@PAgYK~pkhJZZnG4RTIJj#5dNX$b$ z1RyiR4@kH4B$u#Q*{XdBB%r*ITy6XN%-x% zE$p9!qs6Dc22Z9+wJlYw|E|xI3aT5wa1PUZA9oHdgy^UTzp!4(OklK0m@R~Pw{AY* zLD|96I)11xn4v(3&U&?gE7ENhq_N3?+jhDx;pm&!!L*TaaBtW;im>!E?#ji>At&`h z&Yw5Y=P6zV*kY&O!((;d)`Q^@W2ID)3}HvBm!_ie&D^fxJwMf7dUP z0=N}0w2yWw8SFPbKKu~Bn{HA3n@cT&2e@>X$4+&CH78&}Q zX}sEO9XDAI6klo7m2QTzlDq%fjng2}?R-)6t=zwmmGs2K2I6wPvekJLuQ5m>+j<3FQW`Er8xLPjXzyI+ioF&n_%+t%!l zen0*v`a^qM<6%w}H*t4m`{`aAVn#`~JD}y}jw(G5qpZgNzSD~527~l%KJglI>bAcO zQr}E>jpf=6r|#s9g?0L(V`m~mIpZKDaK`|;%<`lv7-h!wF!3a*0a6d%IdWJ1>7S5Z z{8r43v+`V}qPg^3+4Al+sQ&;xuvFr*K#vRfz$lv&BL12$0=NtZcpP5TidOqnOZPsC zc$0pp%+c5wJjdPvjMBa$p(o13nH_Y0sUa)~64Sj*w?C>0VvSARg-kt(g9>p5XVS}<4iH7Z z;_OpO*k?K ze$1U_o=`~;uxzz__!&?V8|JXQSg~}{I{Ku zpfr~nq1Zluavt7oKhQy7x|P_&R9C5=b`N!dqT5w(#`3&D!(YtKTV~E0%=b342swP4 z#KhTl25)?nq%S6%x|>Sa{6%8OzUKux??rmJxJF@W9wxnUf7BUjA0 z&x#Mfauv=$@J)rM-aYuV-J=AY!QkJMlnNHsT_cw-ut=(+(&lwqUw}9vBUaZMc)W*A zo4jw9fqh!j&c-{xQh}d#eNt_TnrM^~MNK)y`a*0)s!(;) zKwGwuLnw6;plHu7oW)T%5Ymxp7KM2 znCCPB$;kw5|EsE)G3azG=$k`Jbto@aMk?P-c<7Q8#oyB*OxK@l)LVEFN#eLOAFJl_ z)4iTV(;Dq-0MR%hmhC4OeoBQlEj9;&Am5qxJfG=|11D~;#aCv<8ajQ+KFWi27U#oy zzIzVt>8@)$>oua)>;3iXEafe^I>p<@ayTX3)@COQFDEL*-pecnkcWwz1j#7{h=o6C zdABIs({ece@?iRq&vo%j@&K(eI%kqkKb@E9-dnR1jqo9cWV|^J=~6p8Al*?#!Y<9< z`F>_8SvBfa6g|!&qdFU$+lp8R?4gAh5SiEm6(qls;`|biu4OtLmQv3A6W+( z^i(uDXdOSO^**B#vImaoi79x?`zaihKl4oz8eNH2QPRY}DF)a={|BC_Ti*&i1C5u< zHGm_2Le_A%agLx%maME5^kMm*J~B%#0#~wfd{V{XTYcv7g*1i&2bbIQz)NCrIsu!a zSIhf!Jkn&|g7w=gPSEZ&UD1WXI>)0^F`>wThFY-C<>r1R*ju4SpioSR>P)F>wMHs5 zQ|nrfzSPA1z;e*KoZ;7N=&=QCBcsISK-VQxu(00u9$8>5^!_aaK+~aP-Uh72FW)AE0~8uehqye*LW5h!^-z z=>PzUT%^4p6!lDR>q0)$_Qw`#hx8L~+$Px%6F(UA)U84jHu-pOBTk(AvdB`R*B1VD zH)EinDIn{4_;6o2{xv4#OkN{F`lT@C@GT{Xxn z3VxBdg)7Wokt`yz7t7^#hKcuSV}QTc;) z8)dTF^~oapFgCyb7YO{XQ;8%;^R#~gy5r%bjQTcWZSt)U*TD}PAT19zVY}}dEWak( zQ?Ftsm!NF78kod->f@{s_UaVV<5w4$o^b3iK5HzyF4o*|5}t@Ze!I&{oDp(dZl-&& z_=d@0e!K(`xtxSuMZf8cL;5<3R{NG~FY7s1B~18}cs2PsyWF;_VC~C2tj&8w=1cMw zm$B^$2bwkVx zwZ)%yt*oWv|N7mjyYJvG$y-cv0QH>@E>j;}O5*lBJD7*lInM9rPRo5+c}EUfX_#*E z5f|mC3eWpz0YAhaw6nzX2+NQzkM6$oIQ`M(`2HkTI>iz1Sh-r0D0nj6w&dOd0e)Dg z`6=CL_m2|MhRY%c!9%*!(d}T@^I`RTtT^aZL*$LE8p7RSVut z%7wNc)t3yevr=x+r&2EHzH2nnNJqxewH7+%c;-iGz*k?1tr#qA3r<+C6geyF#utsd zqb}pA#LL{^_5;I*tf%#@kel7`)Oyh*%G;r}cR}x)cpiSAOnt5z3=@qzpLf`KJ7jWl zn&aR$>|_bI=Ibfh@nx-p`Ra{i%Vf5ZZE8pdF+w#>dPuTJ%+?zuJ7Ek@$-6jwR$ z`SGJ}0AuI_8xChKh+az^XV-R|h3TBfL!5-UEsy(C-mk=cJk{)ysB1jCB46?l**$xm zK_+Fx$PkA1%OMZJ_Jt%#MTvO*YZhRQ&Ui$D+4q^NFv9NRT6?xi^>7E4yT#mcrG(uEAvmr@4_1M138&V!61d z`UECD;f*dL@jMnom9=|G6H6Cguh-{{R4DjNh2jRTXORvLv)@7&y}F$`XkXA z&k;s`h@Mq9z5I5Mk61#V_XIS<)JPfPl`-;_gPFMBvvV;35VP&fb-X>W$ zlDXYfG;E{&DS=f=6$J>HP(jTawYt0>{R_Www0t$*6Hl>?@s&rqNp52X z)qhWDX^`&AE1BiiJGV+AF0=Yto-Z$k1d4Bx?{kdh2GwS ztCtYZO1-A%p529-IgIL)@Uz-dGT)zg@=3?P53Rm?!o_&l_j>przt4Oi__~ot^-=oc@ z;EGy=)0Nmz+-~ZmjHue5tB&+1{S!uZwy)j{Bn$a)C~Frtnv2&}wLBiTJt&1IN@yw` z_aVR2Fpr4&_9jG2DxDPri+(NnPNtB^FJX_La2*=M0(ph;34>^&#*HR{L5ij+;L~lv zsy_gKUq8LPS#Kn{Hm6gMb~{i@H!4A896dwK-a0q#oybxJ>$2G(^EGQr2DR878>ifTsdk>F24E9*?YJ`50;#C$b~(&_*dh0N+|- z$$aTejbU(lJkMAZ7|LPqEI53o4qWzkGwzq$*Cq?Fwby8ZV~ewL7TJE@{6&fk!H?DA z#rH-rpP1LPR=VdRi7tSYCbyY|c01KU&RV}q~|8wD9Vvlilc7E=bD(W%l7?>so zWW*+-{w{>rwiZ|#Od_+YDn}NBqxr&ouFm&OB;Y0ve@NF7y>hgV+bXo~seQ79=Fmn( zd;w!d_5AL9i%Ng05IFYxZMp>Bu(%)9zz}hHKa#Tqj05-C_-s^ z7FWbsdu<2reeEvY;*2;zxgNJnX^Rfo(%ZQ#|LH%cPK^BKSxCt4E$$ntl~eBMsMDG`K`CK*+e!-vKeEe5!v7DoyqemH&;^&ikW3*{~SNU3M?)zI%{j5!G(dMn2xtNru53km+!q~T{Fi# zWrJGz>ERIOES*U9>(xl!#S|v(?)V{#{7O>oX5C#j<>WP2W_7 zeE23Dpsn{PJSd@+&lk$0>EbnReRs#u)V<&%SZd=wS^hC%cWC3>+*=y!lytGM+H5IxcLJB49RxUUiL+r375gSv*8Vp0K)J z`L%C7uun~)mSCkrvbCu@l;-!JCI?oFvxY0xdXbr$q#948dRD>;TXP{2PeYkE$r8Ud zj>hREB`SA(=DWrUUvIYlW+O%U)nrPmqaZC?rIxzx*q^CF2ga3+cAmRcq5E3nPE5iT z&iahqOR&9qCNtZ%bFOkRuRGjiiVZ{Dt^8Gf^V6lBaBr{Pe9v$k`bLR{Dx&W137q^> z+`N4+iK*{gXCo#1aGiPMLxOZPA&)hHc)5NC0wT@2z`;?|+@-W6)CBE2p5q*1923Tx z#UGBmwP1Lt0>e57h+W-0G51O`l2aC~KXiZ1&bJrK$u8ez*5H&_uOXerD0gf-ETnhq zqI!J9(^Z!%Zs%mMifs+UVY_zdHwdM-GiKMFs!^YY9DkosW!De`{z+1Bc%w-|zGr*4 zAW7KhEE&cD?!t*$fp-YyBwkPS98>sFcc4_!CPMxDb4wsu4S-I~Tpk#xu zZ08wf>Hj22eL3!}ZNgwskNqXtE(K5cR>C7u_mY*9YVb^ioV`K*MDKsf#p5tnZVtax z1gYu>{UQG&aW5_5S)SFAVD*1E|GzNUapsRNcXPz?c{Dz4!FTrdoRRWvl->cAA^uLA zPI~`?1B6IH z>1`MWYg)iA-Lhx=EKcag1l{a)qplR+Lv!`5x!601$HUR4!h6I5l>(3NQ%5vMy40HN zNQj!)EvtJZtwD6#Og*}!J=$g{0TTSN!heu#>t(u=m=ijanTq-HcUOU5WZND*Eydn& z`)T;=`1+8fj3Gb*HBohNOTN04;!%)Q%WT6-`?bz6y}+p~oto9s{Z=wfvuA8T(Sie$ z+J%jw)uX2yr7oMWoY3l&Rh);u`=dc$2x6Xu4ED#{SoUjFMlbK|*L}gi*REc=dwr?7 z_RO~z(Ph=9Bf5MP>L$R&Y2P|P7m zTiehuw%+`sYqEg$Lin5iJ(uhs2&sFM-qM_G;c*cyUnD^qIw75F`de|A5FL`jm+Mu? z4-wH{t&*A^h3SnMy$a`RIhYUnkHQrx`; zAEV+<-N;W4jmhLHDG|HqZ-Napr5UHW3VYM!l1yCnR-B6y>&K0Lb{kuJep-HJ&zLHZ z+;)_2BeGPP9Tk`O&8G!3vSbXS`@vM)EAt#v!zqRYs#aI|8v^HtZjDHU6+)fv4K+_ap~U! z3GbOGgt24^k-f1^mLVkB_jSxj z7%`YEW3r!nderxK{`kq^7H_;~%=48*47{tJ;R8Fno>9&kra>!69`x<%Nby1+Om3Xg;zx|G-(whrF{d`s3Ng*q{(;?%N5vRBEdA7zUD)?k&-LJFeC3 z2Ct0*S)G_CW4=oarZX?zWCZTNcFVL%>4d0P&}hU8K+Y3xre(4YN~bFH_#5vnt{J8Gn}4P-aZtCr6C*{m>;ut;A0~~f ztm3gDLe%GkM6#s7ndj|v8m4Nwy8|WN*c(q`x;?el44YKy;?kp7_a}L(woHZZ5Q+dZ z=6;9>oFLr&ML@_Dc9Qs(Ehuy7wb?Ib+rCD&vs}x$DQpI+#V=O{59H6_FfqD~FL4oH zg0HnB_fR0dVP4i5FrkiZL$N6Hy!qNL*%s6In%*CH%i|WRa%h%p=e=;}lO1p^ zrpbwDx20t2qWfL0gZmfnX~ekZfj;m=ER(RsmTBkGM%vKj_kN_7Z>YN_4E z2@|t3%llfl2&mGEM{Jc6_|}UTT;dEi$d1iKiAqPfENVz6WcQ=?##+XUiJ17EZ4X== zB(hB+sDUwq3oe@(ffKeARYq8|a(rB}^I-V$&>1Ilee=g<4NhV6)2|-rArt$u>0;_~ zB@vG;%?1z21dLPz-=BROF^HJeG(yeE2VhqzaBsO8iEy$J+VgW=&uDHK9J>qUx!mGe z2FqS*XB;J_H`C;+CX5Pr;{faC*iu&~yiUyA(uJo~ z_3eK=uq5?7x<=L~0F_|Rq=w*&8y_87YUd3vsm1}j-HWd>E^$MRF#7R)wH5Dx`L_jLupIl6Kw06} zthyBr-9Lo{AOAajO#t|4k1hZ37*HA*2E1Lxpj~H$<5^ey!s4l*yH&i03_LgNmNDmh zKo}Vi?CfBn;1Qf_m__h8VMk_fQz1_F`2O-qP=0JHS34oJW!Tr$}>h22!0Y{``T*0Bp& zFTr_`FyA_URr6j;1Zb$PE~={+#rXt9>~FR7G&Sr7ESbJK>Vfos0U`Jq-pDZvQ|ul9iNX|3M(kk z=p3HE9y`ab0F2T88B6=6C-Xsp@m6rD{I}LMR}0!0oOE9^i#)dV(wjJ#uqS2lmf?&uac#{AQ(aLNCh7U~?-y zE1jQD_f<*VK_<1EApicxd05C8)uZOkpvTVYW8tvqfT#NLke@-W;Vo6&;^I=qomDSw z4d@Nfpw3LPFPrm%3@UuWdIy`W)idR8Sc&OYtvRw0Ff&>w@G+!EwWmqT& ziIEaeSDPl?zyKaCo)PDpfVXBB;W>d)`anHMqpj_|fX9jpfVapZiav;~7qsJAN3i zEtHBQ_Y_h&Pxk0~{?cadO(PtUk-hQKf({|O_lg17la|i+8e3BAN)S1Vx(_>C6akf` zCDik6=+pQssGT51+9{`x56rWYR-K%ruJtj}rmHwQDb3!>wQ@;HDGV{?b>837z>_sp zgC6q>AvdiN(2peV7w#qO)Wqmi)Yd|Kz~sGjF#01xI770{w;Ge&LN45U5u>6WQRno| zr$+pf3${ZV;;%F1Zv+ex26Vwb0zM1awF+39Qt zud8H82zV<1^2&_Jc~m@puU4v>hYC=Ub4$EpvpC(`mF($l7~{+`EETu{!jY~dw@6cN zU$!p)aHBW=i)N|1PDEUnu7e@2+UVR{)JS>ZIajkERS)#O;lbL*Fg`sjWy;c*}!C0OEv7?+B$;~DHaE+k?2@jIZ*tNW$ z2!{)TN+f>G?o$*ybfwtA@dIMl-p5An>P3whYLlLX6w2l|#)%7^5L!?@w*3U|8R0%} z;A}#ZjOO;`6Q~!GLb_-UE)ZoBz{~yKY!c1dA+mhMZJMV2TfEa*%hEcjvm+U2ENSpH zgM9Id(q3*p>0|+8YyaacnJv=)DQSCkRoA?H9Eirve{G47>SzvHjkXNjyw&UbpB4tF z8$evaC;*5&u!sK#8XZ~(pi!m&0*(G(3-pq4#p)fg!SCu5R&Q4o%?jJVaef?a>KK`( z3)9L{wcSb>NXU?wn_A8fiW=pl206}sz1l-h&tBLyw}k8huMV2c&5u~bp>OsjA#Gl? zE8f5&q`A~uG3#!&$<)NSj4+OrXuw)#vS18~jxm~S?SP>a;7(|h?{zlT={Yn-T_kD56+Dk2d)$_XzUf~@{k_$qU7dR62eZECH z@?TJBxWQ{+n;aB(F++cGq}IgCkzDG0EuU?Y2&4qYjupR&|EZTa zgD$|k-z<<6#GS9e<{k}XK=3%OWOx5DU2bgbkbI~Sy@ zwG>s}j(RnHyrpx){VuWy(=#MvLAi>5Psy_0hWbA7*~p)~j_Yn>EQ<_5(^ZOPOPUDN zjNLVE^%e|1it@_vIFMnrbL*kkn9Pb;-Xi0_k=LzX@V zVNy(+zwym1Etx7!J}X#{*LiwS?)Ic(lU`iu4UNnjRvWtsQ*`eL7JD8ae>r2bU*{^T z=Qd=ZbNsiBbF)5+b^{7vXsiS(0jZd|uuXH0A|ZdJiftfHCh1!(=GV%+;&3K=JvuZ1>i9&r8N=}&^3nz&71ngZPibgrV$!Tc^cn@PbbivwNQzO`+ilzyKiDQ>GiV&R~HeV z5q#;1nbe6Tcii>9p_M14w^?sosg@Gb*32>@Iy-TJZlxi#M+3^clFcf{u?0S?I+Wm_ zwY|yfwsh!9X$hVNZdV7o-RR)V;VG^X?q9*kT-wHgrBjn{#>|FU{D!qZjR|hyR_7Pr zxjP(ct)A(5${~`L?Jkg zE>-4gPEJ9;p`j~_0*Kv-{q3K%&yWu`Eh~={{2}z_#+x(I@!Cb3%iiW_OtZFBJA&No z=vw4|k?lSIE3$po#<)WIzshzYAc;qk?c|>vrFI~sE!bC=!+&h%hpLe6eC=0{04MUF zf6}`MKw#fq)4BXfv5@@lOp-~5+uy55x7hd&30TIGK*I?lW7zvr5SZdK#&Lc zWbO_Lv}nzmfz=SpMqd9iVr8g+D0LCCuBvTYXMwAfW0SVUJa5sypZiSQ`P*`oUT1#H zaPKNjf?jmNK2b^`U>7{JK81@zWnzkoPMbAlaP=-R;O*O|rCOyr8xwGXGEW9z;LiPM zShjn2>*vSJ7t=!_m#3O8pGk%+OWAZu`4vov`G8(NE&e!g&S3L9ws{S~ABOg{OmTY@ z{Bvo0ot${ERY10IW~Q-$c!Z%l(;C6e8Z+JMREAZ&%JC)q3e8#bk0A+3NIP3MeVuxF z?Ik?eW8s{X3Zc_w4PEc8c{hbHw(W%W4xAZ2O~97hoBa~Z*tqpA?3Y2s=O^tv?X0*m zWSj$B)jsp_6TbMcMD|6UlWnTDC8V(%2}0hckqGOuEQZ*kWo@nQ zlwWqJ2+i56sa4!MYWmMYBq{-g{>Zb2*NM zlY{=j44s%)bc-Jyg)PDAgW{&9p5^O=Hz^(ks*^GHr+@M$*8V15&52$IZ+g8 zFRbb8uKKyWAuH4fDzYI^CplMt`#N7$w2B4QJ}IV2S2JNje`HU=dhJoO(5vpZq7y~I zad1L9SFHhi0mGM04ULN~H7M5yIR$Nba^Kjae2E!ek2Q?%PVbRQ6}XDFaB-cPU97qJ zB&X#)|9d$1bW%E_2-=rgF-CBfxvB^BG;q#RÍh3qH>s{NB3kRvrIrL+<4LEUrJ zkniJ$PRjPZd-kd7TFq@kI=8Uf5nioZT9(C0B^~7z-EIOaqk_&NVN0Vg*y<$DZBu@N zNi^n~-N`AVFd{HXfFU=q9B)rp{cN`dVidis3D&-r0|vf9m;E{64&x|L^*sCXbX{Cj zou-JDS7mXTT%=3$Rw`*+z${_A%!9sDo8hCccRc3yYLs?dV*?PUBB0I$Nwt-rnO(Cr)vytz2Sh$xQ?GrnN>mZ4^)Gzaku>r93Y=D)@0SFjOVuW#7gBsWt|}EYB?z`GzwIzbPK-SJ)HCsm z|FTrp!(~Gfky%Wcp{sqdd+){jeJ&JNh)~KNu&mnGi6oY}#h%~-1fmUpH|}-AS8MJ$H71 z=Uyr8A$tI~Yt8DOh(Cb~Je1YRAT~@~NxW!Cz4ucD5WGMSE0MDmErIsajhXiy@zM@T zrafoZtOqZ_fB3O@)423L4ouaU9gPhZEu&z^NWV?ih9GWOF#z<(G`D3AB_};F}wD|!wf+qSdvd)(awgrpm?1X z239b9Cf^SCy4T;N(Z%zoO}LtbuCRYxLt~@*=HUm)AxA7XzkyYORzkJ|ryzL7b}gu~ z+N+~)E_P_#4zw8L*4(3=y1|vPeIt#8t4!*tJ}HEuPOUXt)3manI69`6ist5!#m-k( zh13*a+gglV3Z~F~^tk(%w=yClZZpjs)iH$l*TuU#F$ZXNm-x_APE6?J7Afbg`j}hq zmJ-g)$nweW6%R$d$U6gAf6Ra4I3xT*1;rZQAvYiYe1Fy>b+p79NJSBu(v?(HZ4@OI zUZ%;Xq3^NW2>v0%_u!4ROu#7Q&9aU?8G&=7Jaw}tU0aQmRI=D{8L&r?P}ZLEJu+>kN7cZsR;<_>Nv=Z}qgJhb@ms(Lj3DRJ{ePvC*%F8b9H^1^+2X$Z{FJMO^%_M=Mo78;D_ve98A|P!m}AV!;xX?Q@-HN#@hbA_(($cIcRKo)wgf5P>v^Edp5K|K$NP@px1=20D2e#h{3D~D?_o_>qHwRP%&9)Rd zcU9gjKhYf-Ny>Yw8EZTguZ`y7yijgfBlf|>dqE}MD zD%6|Z4w!ZQAT`(;pCNRgkwPQ;r{%RFsr{_M(&CMKfkC4lF(ul$MyT-``S%5kh)u9j zbLQ7t*dc=0^@J1uc)tx3`0$`Dlek?sSHg*s9sy2XRIv9H5U+Ku&E?eaaJR3nEkNFT zsG7qtZRuv#<4gajhzhVFqC$WHVNd0bYzGuqYMi2yFO zAR7AueqjTDRNX2*=ea-0+(&@AXSM0NpVI)WExt3l0a1KEKS7`)_ORA=3p)8Q{mh2cWfU5fhqI2xqiy%y>xg z5iU}#EIDLuh_T2v+xOnocK*2S4G3o2rxMH1$ zzwF`qzymxtO0Vw%B4W|Kxbe27SRk=ZrhCpn6}i#}K%6VvWw0Q%X!rCj{xTqS;e!uJ zwbq?lO_*v2l7W3nEAya*(=kx$3^HT?^K@)pfsWt8yml41p)8M!5}v9~xh76LOWnBui*m4&|AYibH$n*xcezO^XNc!2Q) z8Fogd7@;DCwHFYL{>BdWs<>Qwc4bgZ$F63Tc;z=ZxKrM=WE?u~Z?q zYu4ukq*}DR#%4-xdU`S>;Pvim(|YCpMfoN!Dz{mH(aM~4BvYgLf4nk~8rVIO;9u#8nC2xF3kW)ldVRF%Ud~r}GW0AcfX9mu+ z;*hxAe%9~TR&VHL6`VRNk$S((J;OJ@S5^a!EqK^T9TrWsq8Hr|s&X_a^=iv!!eD>4 zKN>1Q>%;i`3cU}%$GFFgcz}4iK?+vlJJI}8@vy1r%iza+4ZEtb%8$)u`JK!3Q#hY( z@Skv3F6X3nzoM-#P%pGPQN8NCQ(cb|+vE4rg(=pj-LNr+LBMEy8L>EBeBgG5mA;2R z7E-)7kz=$At8`z}UegK=8Sl*p9pG0>GMuOStgvY37zFCB^${g>J%DZsV>SFbi2+Lq zIe77mU#SqH+Zo+UGtXxoA>g3{*V$sCxQ!lEy!jGnNjnyj7Hb7u*%x$G2}|k^LpaANPv;YSrS2i z#YeAj*N9lMhb@0a+u%a=D`{0Z1iJyQv(!=8ZfV-PQPMW%j(;s zP|dkH{I^s;lJ&E%7F~EV0>P7+t>kQlth3!3T!0LxD@->PuiESgE0atOu9h{7b(A#U zZ{wwaF{dUXGNZn0GdtLUyIWk#mQmKA2!lb6cl86wML!PC+<#SzQJ&J}E&t0RMl)+S z*tG;t=^ zR^4~I82KCgII9Na{9afLGyj8^2mwV;HJ?7K{((!x$i-HVxZY9y#!CkNo#g-FnKTXz zJz(IH1nMWK4HExkZK>p(3+oB5lj+NLeXDda;`jCP3`G9bR;q3Nk{n3+C%uc@NM^8) zhImY5Cn(c_QhQg5*!({iK1jZB-@EUAcb6wm(qhSCdgV`<$TR*IlcS{(5fOJ>1^+YA zsY~x`YDQ}V?auc&GaP*rIn0He)fX^ZO(BSN! z>D&QG&o?&lxF#M5$mIcBh@Uw7yEQpR@JA-$aUpLUZz`TfKI%Aa9_W4WL8VU-Hz^%n zr%)q6cYJ8|Iy_t-+p`@p*5P%fQJvhse>VQeGz|*gS$LOuxb0+nSCA6Q){^)uBb*H5 z#D~(&Pupe*T}|ya$f*41^i^{3l;2KR?gxx9@TYd0r|$peRadGZ3S{-FnF`Qx?~P{G zpPlNEH>PUvyA2S}izr|p=Zoi`{=VUPpwJP{BH8|jf6d5E`~IEc*9rc67XQ)(z$pLn z$iMOe&>P{*l6^LpZofS!b<~TI?`&l$7p7*mD+fo3matnO1D@ zDWBRXm6({g*rn5-7`xb$PDuE44ivc_LFs)h$EnZk$%h`?))Z?Z1F`%pZMqRf1mz)8vh4qL-ZU4x6T1b@;PyCUhxq52sdE@L~zcHu!hv|gk_e*81ZORL3LI2R|$J?|D zA%~6fSy-O&yCy|FUdFLYQoNS1+Wa9oS>?!Ma$`5`0>3^Tc zxwzo(9KW&jV-RIsxImBgijcka@o-5R8tAZRa@@<~1(=?&aepXM7IvCE&k2fQ9-bcU zHY4e~|L}?RL#n1&u1O%rDc9ni?myEqzq|Z{8LI7+nvs@PL{UO}%u?3oRIRPkJ3Bko z>FhGU*(^QO5m)@c_4e_|3(cXTGQkGt{#o@2ic!kQI+qdl<9Abj77CC~ne#?&G1kx}wL+u+f=qmo+ETKao2Ja<)6WB+}6 zd=3A5r}4ERwXztHsG%whVR?CZ><})WgoT9#j{c*VnZw3M4RHboM7%Dq#0L|PtBtE5 zPGi+n4*t0y;Eoi|ghfR~se2U=bvL)Rs)G$UV@`cAi5bd&ux4cA{-H#OOp~H_DB#K= z%6IZmXg!YRqaY;bs!s()R$7BeaPMzA$)lx#=IzL)A78d-1x4#LYQy!IvzRYvtE6)D z_5%(gbEAKz+qQ&`T3*`&sd*LNB364*WTyMFt`4hs_`x~!&Z2+A!z zwEM`AZJwFhx_H?z=81_e)X9`HEO{Z2%RO~@1@_oamz39OOaOh3CL-&xsoEr zX&FBKt);|!sE$d*&mho1U?9$!e(nZuPn>~)5Sh_msO)@f^r_90&A|03y^W=1Cz(cz zH@}p|Ne^>BsJhdEcV5USxZNRM4-+2JBrxeuO@Op}*V1mhExWim&&=_&Z6}D5uVrTB`xS-vIuQchdTwQp--!hTeCCHsm7#e=n7}V@n zV1EzavE>VuI@rjbtXn~(^mh59bxgWPswUlK2o1H+*GP|ox^F&}FL9gnGo8$E+;VU^ zB6G;R={z{G)Ar0M+3^;VjeBy$dLf*XWUhOBE%?`Ygpql36GM@=1 z6m&Z*=5+4XRo7%NcK4X~S*|L#&#m0ZTnO{kn;)OMwiz-+hQHe zG0j>fJ5y!cj_C4Dh8V5g0#%X?8?=dgW_xeiGo+lpUWc`UD?cl(?qq=3>$AWD*HnQ8 zq7-_n6e3cH(OG?NfpQ^P!sfCg$!7Iy&keGS*aNj3)o7!xI?wI*uJ+@67z4bO;X`PX zlg_INx{8k2O{zq3dB3{ssaHAno%Jg|!H z=~msg)}QqE+(*1*>A*pgM;bBsz~?HkvNo14{ei3Ca$NGj24w8ugoM&US{-UFpt-N# zFZr5S!@96YhIBmvZeNzvCH~cYFQT^U?Mky;2HZ>@h6_e>>?ljURKtGmB;GJ`MBm=; zse*EBI#(!u4Nllmz^!^CDpREw%i$*QE-(DUF7};_R(pY6gZ|2Gse2$}A+TOuqnl3T zz&K+r@WtK4sPh~d7`5&oBXNl9*PsbZ8R5F)bLcaZg0IddY-VniSG21A zB!);xNE|)h|G9qYbu5&uQ^P9G-jtKmq@$w)2aIg31P2DDr@-MJ7k@A{A53C{cQ#2f zYcg>hfat?;ZG)Q+B{zOxN@Q5D3m{IzS)it+QykC3M)<8Fxt@lKlI{s74PW`Ct|@8g z&oJYti~JLgMdOcql#fq*due&CP=l;<5fqt=Z4VpX=~(XrBJ-!V5im@}C~V_vwK64F zL?}!OcYR0N^?6D0Ki0utVV);u92l;S9qVfzX2Gv?%!sC97V=I2%DqJuS*HhT|1Fmh z6s?w}70bT|>z%L>PBMA)kLeJqQVN*d_!2o_7}*5pF;q#VTQGWkyijIAo}TvI;@={i z<{UHbR=_#n?teZ1bgKG@i5Vee`1=RuCue>t`A|k{JwpO3aJ{vAQ-HCL%vuIQ;363O@PU1&mrndOxDpxbbHVsx-3PcFAdl~(Lau|9Z$~b@YSFn)~kOhz;SiB<3!$xnQM9 z!?wd`LcwibPr4KXQhj=_Aehm@w~Q*rQ3d=$v1)}9;2_L<1PNZpV{^oJzvqI{ zAFr;SWYr3&(7zYFA%Ey*)mi;%Kq2LPsQt-`Vm&?`eQoAXf%P5 zj>$}bm#4XPMwg&B$%-%HQH6`#`VG@2cQPI!`-pmT-?GcFBpd<|xJF%wAeQ+p4c$-R zo0H4{a64>BW12P^@33xEq&kO4&L_SuXE-9V1l!0}lJ9llpx>jC2gOBb3DeK2#6F_W zY0>JBgRhD5*4-h{p`mE?UTwES5ib}~mJFqsP1)7xrAEeg4dpbD)lqo&ELRQ5nyF&N zIYJE1w=|?*F0{<>zNTKqHrGOj*pF;kRzYA#M*G4#5J|6%W!^Ih(MP;BsXmAWSG8%r zorr=+3}r@)qWtB}D5QTo;?4*%7bNF0(*1i_SQutK3cXhhlCOj--mHHaA|}G{F{pr1 z{_=Ghwcu56JKQMzuusS`O+B3J4+v-2Er52|mQIFdvC&a-htFT_fR)UjHJ& z?!$xk70$$Yhy20kIuf?uyH?mw0ZtiGMdV_%d=z(^)Sh7X>!C>JD9$<7EmXE13mr;v z=k2jU0&-I)q%~JFl$_7_%4aT=MY#A*_T!KBuUlc4d|~vM@8Q!#Au-@`1IL6DGq>N# zE5p)Y#RdYhII`dsj0@f>qZbiO`Zaz9WcPeb{{>{jlod(NOda*yhGoM`4POjg^ez(u zXKIed|8g4b+=e@MLVTU=&-{bS04Kpz2Ji`ql1RzFusfwk>j$EqI5SZNu!M990u*u4 z*`pWzeeXMO#ohOzY2?pDj?lb8oh!=Llw2lSu;G3KT^nncE8(jQ%eOY!_43XD9ds+d zs~^3qH`nynEbgx!`C5sd@CC&pNw(4O;Ygs7^$9WqtrJG&>Sb{#WYCO*-iVqQa4{#= zCj#X@lj@KNkhYRVNzRhPj41*lVx(!P2&lBlkfH^mH~M;vbD~d6X+KqRmmyMi?c8u4dPNmnT^iaI5 zJ+DW6FRt68Y+EjF4{j^&aILg?k_Ks8 zGGz>vfL$qLr8-3vrE&#{jqj&#P7!a6ZiH_PPx(*L;cekL;G^I{m^7Hf)Pa~EgKvWo zyOq01yU~Nc2J6O5#LmY8VrpsGsV`_fly!3U^HMUjGUiM8GVaCv@>WZ~WmQV&s%(6x z(U=4}6z;yAd{v~T+>8B_(N?2NN4a9VD+|WFBI&zE!K`bIi1~tf^zPf;)?KIzkKOo* zUUm%jdA4utAJ~UMp=OHg+H5XKxk=b;x?>ooht^3pjfrIXq0xfU4& znJr>X>UZCfKL(UV7bq2t7qVs+7vkk4XU`Sf2}NW`fY){pCilkf3am1Sa@%CvRG$32 zDc`I3Z|;D2H@nq0n#8Jog+IZ~dt@YRxJGdQMuBYvLPCV2E_yvrvRrgBBON=0;5$L>Q z)Gdc9C$!=|f<1yiq7s-DkP-+JKyR&W-SgnRXYz#fY`XWy*+t~YPGerNI%@mzWDCJf zOqW5rY?fh@!BoKyi+qYQOK|=U$e2Jh{}xIZhonh_kQFImXK*RbAf6>&mB9nc95)Gl z7E>Ha6LSjnl4PE&`Q5#~ufFfQELKGxTNfjb_1<^o1>fG;oUd*p{o*uKHgsmT_+CHV zH$6N3(|B>mf z++F1!dM>&p{vmj+hk7HFf{QAKoKN0fj!w!wYCWZz*DQ3epMEX;jL!wLne(UTPnc-I zJl`CAsYJQ34;FHr`Q5pxD+4D=*YRqg5}l?-c|FoT?7(q?@v9tp*jK(axC%YNp|vtD zh!h+=|){#9C)G*tqnL0WdUrTZF>vxg2nd$r|mX$R2{1Fq+;m$$?Cr71()op|${ z%2vJ{Jy!ekIaSnFMLM^eF9F;%KO6m{GHSwUbo==U}Ox#kelwW zO8+XV7 zKnS2Vf)ye(u-}w+SzUR#l>+FUxi6krn4v^G(EB z766|eq>{PZorGLdA>gc#OY<*~t1*v(I>FnAbHChkd%+BnE zgGc5wmP}jBoT_r?YVXeJ=QQ)(_FXkB=aww@9JVcvG{>A;muj9?3CelZj#v&C@nH$K z@j`K$Ijh|z-6QOdx*sO)tO$+x6I>JSV9yGczYnfeQklz}dve~ksDGvs;M`}Qe_-3+ z=|sEiD;8vVyyi)|3Oy~^Z`eG$#a3k;4!;S#Xw|y3J&#?UoN#_zGI~fs_#vq^ghy5Y>W zI#_zuDwrgfoQ755TQc+Ri}0J21laaDG6)3&h>S}pp_rtBo+_Ws(|bDar!Ko27gb5y z#GtjP1_&lz2%%LNCecr3MxPoXQ4inffj~d616Tm1rJK!?rIKva$!VSeM#3p*5KI1f z`S}|8`E8S=Ljn*PYn@t@=~0jL5J2+v*NC@JV|G8FAu_h-(kLJxAXCkhf%ZUI z86HC`3kH27D+6N&XAA3RObY?Q=gjkbYhi4!PwZ^*+0u^3nVq|9i|xO8mbj z_8@*zpsWJ1h?T7|F*^er0~4tLJTWmbpRLg+9z{{{-`$^o@spa`+gtN6GCDaqF*va@ zSlOB|GIMitGcvI-varxUx1hIkv9#BBrnj^s`@cc{j3a7nXJ~6?ZEt2}N&Mfq`UX}G z_WY!z{|Wm0_kZ&=b~byFWNG(%SZsr>FWqJ=vN6?fK7}-#z&l|69O63;I88{qO0sx&+|)82_qX z0NxQ{p+PTB3O zW7RB(wpDo@xKEb>Ue^I%=L-d|>;$m|Zhp#h)GX$*h})-mfv(SQH6>y;ngP<+_>Gnx zKrgBWgs7XrG5G+^Et6c5a6*KYwLNeEC}`?|6}H$pI=5Iyad=$+$3m`c(TIen&4I%} zhauw;vXhQx;rVi=H4{E8%oV<}W=IbqpFI;DkcrXv2JGm+(ATtr|9c0m7ooA}H73}s zSbt5h8R8Ln?kc6jNAw@p9IAP-$IQvQxrisJ`uoRmci|sSEIlkNgA1Om4ESrWgvw7D1TK_$UwHQCl z)js^0RU5zWs{k5IBE(?$fw)bY>LCl;lfM=v3rD<+Y8zOq^_h}HO@5u7-Wmr5Ph&I9 zc{ONsauO5O=HcOCGVAojK9E1n>(DMeq)bh#q7wn8lXc0NoX;UcvSoj5&)B=aR5NyO zZYv-^?VG_zp!MCt%J@%r|Bd~qe4~8Q$4e$%vu`ShSL=piSk$Qz15j!zmfurm1p_*~ zU!8S281vg7IOxw9M)>untMe$B^e0S~!W*?TF*MKL0WLI``I5R_8O$dTjR!2Z18C4$!`M@riy zU6iMx*@O-to&I3q%C=3yXF2kvdraIKZ@_NVVIu(4SF~$KJWd^V4M+`l-TwOy2YsHAV%bds$td zLS*@HerpZF&`b*bl98+ysu_Y+AEV=AzW&~$NePRSrQgqOt}>q{tF$&}x4waRg`_KmN(2m`_!t(tm=R%m#2l|$o z9$^uwH`5{~k-)ppfzI%#zUM6`<*SZj9vjFXm(Ho5R9B6E;3>*~(=^x{o^$e(NC-WK zB(*LzAQ|jbh^yzbxVhESH=~uX)5Ybi)6A(ZoeM_l$j6vc^xG*UwWmJzQT z5|qdSx^v~Y!&&|pff7)m>Be}T-kverPAtlCf;!<)3+Dp4pz#sl^1FSbE2PbygH0P7 zon{3s--4-BWF~yFAmgCmvGVmtF+l?N%^fZs`cDH?45A2nsU40_@A%lCYW>T=35Hj! zGXUyPHC}~8_M%3Wxls!f13$`-Qm-Pw#56wVQ4gQ{lTiVt7E!AzkDD6sn?XH zJwi`T{1n)1meVmzf&(qV8AHAB$N>mqY=+5dE1*B2-`gMBmL#Bw-Kk+Sn)EFeQwIzZ zz1{wK`}!MS&DObB(S)rxLstHpRxJ*`D!J?RjDm#7=K=tn2yq;oXw`Ynr{a^(NqnQv z#12CeaSW{NLpo4H1Y0NgAnEMugH0E0imwG2a53F{zdbaeGPDj~sl_XQFwSF7%^MB7 zx*l?~GTdYZUJvoE&4+sfrgx*`Q%!})v~jINs%EBB(o|GGX%_N{ao7*WB|aC#{bl}5 ziibgkDoyb)S7pV~qF&DL03JL!^wll4?BD}I%-s2*JjzgRK^@%OtpCmMpUjwn>|Gft zEoJ*2ynAA&oy=)<*mif=q@=wvp!;a6CxefUzd4kQ9Z&kcUO$zL_z-qSU{U!ol9Ar{ zTW{S3Pq-N`swLj~?PpMF_PdlIxKizCON=lZ)!z!liH7zE{SYP(%Wc0For(fYFx+0` zd)?+IEzcyK1V!|C9yl40WVE#ig8CB4p zN2jQt6Zh!sz@J`((Nm0iEDITTUd3VUb^L`q&o{HOdQaZ3GTnao>>?i?l#Og8|0B9O zvc2Oq!u}@<5_xRnm%#|AmYMAcBo5(a|BB9VfTr8j=pCa-{M%iq7Y;b+fZssN_A>7& zw2A}}fpomlzk`jocs)IatL^?XTsyS5JOlx_#d@XVSNuBQ-wE@`K@ga5f_lF<3IEwD zNOV&I$dHDq@AguEQxWB;&9mD6znkPUT(ns)8-3X+4T)#C=s>6a?T`I^fwNEf(yi4S z_5VLH@3bjQ_S+$^^~+CDFX$S6P=_OLiz z^>?pG6SWG!a|54N9pZfjue;o+-Z?rA{4)a)J(-{e+xUvn(nbSM?%AuC#p^*~LK%t= z-h};yvd=f6DeVbpb`j0>RtkG4={$SPc3%trHPbh+q14Rr2#sLmbi}Lsod_tO;U6#3 zWHJQ2nc0&sYRITMivrRSVYy*m^v~p-30K|C(%a>?bUW%mmekB-VlJP+n%gUEx$U%x z@iH+5icu`)tJD$qcc1SQL7kiO9(vP0hu|eIhrWf9Nvzv{y(WXiJ1&H~#1=TC2z1yu zj>BrO`9&x1C^_o>k03B^ofPqi?2UO=i&ijU^6)Rn&wkt5BiM)r|i$$WRL-3TDtaSL1H2<0% ze!Q)FD$^j&LRz_S6Qt{!I`Y`>X)IIwREEr{Kq(ylg{dp|E>+uVu98#hi=4@yQJ6?z zGuAW?Kha0)TTL=PEK@{FMGa%r;TNvoCf&^gcP3Id(PL9??6#aaTCjIm!q;D0uTfdh&F%`P-u+HgGyQaop& z%2o>hDK3Qbl&SX6tJ$%DXASctPOCJu?rhe6sP8uMkEykbQjDT8JB?Fx8wIQgHQ(`v zthw45pQsLpBvi4N$#lP%6E>cAcwj@6kXRRUPnilNh$!xT&#wLf*?j~UrN+KP)b?Rj z?o;TpB$UO6gX~hqW)HSFZ-pTf2$VXR+0(-vR*Ub-V*<#U?*r~QQvRfsS$Vy|poSGk zT$@XnbZ09J?6!*~oq|T)v-?1DN*!XMQ=vt!SE@ci&Bnic@8V9}x}H|O9`_no{aDnu zuhUzOijq!$enl0Dj2jr5Yj@Dlp@@)27wwat6F2aX*42@v@GhcXrzK{7*5||z zmivR!4#-9?XG+*ojYa(N{AqQ7pO;CHZUI||QRgZ`P`b00gfm1b+|)zZrTA-$jM$m(Ix;o@7^yKvjL7txN)ye?dZ zBofMn=zrsAXrPcp7k*jqN+4SaU+MH10+>Rzh);n7ox)VYl364)W_<6H0O8KQOlKiw!--7F-oVQJbv@WU0B z&m3up-rWYB4Wm4|biiC&lCJ}Hlb!P7U@C`Yo}oFP<3g&&-N^{k{%*_-g-w;G%aitw z-UicLB-kuI)Bq62>)Si&r=0+1#!yAxal2tWL3;~N&8ws!vJC|+=Z&qQ!yUs)g>T`W zziN|R+lUD7R}Rfp>yf~&z@hd3gOJZr-a8I$J0U@&+Wn^75m7@T+?h@hzoGrDEQ%eP zaKlDvM}_A`ld=L>r79n#xL+&qmyRzGU=0Mni|0}5qtZc@n6u54y0vXHvtmd%JujTU zpO*}sLU(p){RF-t9Sp)YS;W@NkG-2Np%eT~{GTH~k@v5g74gwB)2Oj7AMrWI71yq} z%2*s^1zAaK*n$n)1(c(&JD{a;gadJNV83TV9SjVJr%WLLq3l4IK8I1Ae(g=>!(U8u zkivE!z7n+oEVbBZr_`{rH+aq(Q8f$0ewt4OzHdmm_dJ~VIXUNQ;eOEfbN6gTgS{B{ zg~X4tKoL|8uAI6Zm&454Z4eUcj6pn}Ryi(^*`mgGYQs|mJSK?}LYEq6fEkIvx#bwMJ z_Q!LD_F(P1SOP#N3rZ$Q8Vjh5_+BRwUX;NBXWuDnkO!`*sj=ISr5TpkR8caW1hC|x z-!iPbdh^&pCL(}ccL@FlsZjwadTcwO57+hdS(HQ!$!5Rd#ID0mkMt+8mG_S!DuWcB z+(cO1pHeiq^{B}`;Qx!4VLmwT11hBBM7yvVHdLV(jRo$o>#n~CU%X*cuz>u#GFhyUpSDvMwd%@$n%wBWoJ~lJwuOWw`^@ zG%*3s+zh4UnOki6?d)C`#KNJp)t5|rXGL-4QPuOFspkaJ;c&vkw*3m^_9cyLzyR`4 zgpEks2>f+#`!pdZuEzYcn((N%XjJw7XyS$x%O8y0wQLhP%++i&Ib3zZC9YGg1P4NK z5Y(*@bsOZC{&ucT7aF>%>2Yx831Z&{BE>ySIJ^m#YbszuKXsx zy<`!iB8Q}Mw}ECrwYJ$}{b%}G(lFRVdc*G1%CgZ95s2`KB!4%KI@B@Mi0A>hyV>8F zn}NpL$Ms!B*TW_P%BjRY%d6@PY-ckqU0WX6@F0wM=qPaQp2AK%(h)0^B%;0B2?K%d!ffE@QF4`=Y|DO( zQycG#U6~y&P8u@)rn_W$lp@ZN5q6*I&te06V%3{h8}~bD#`=nVbFr(tsb`*Gx3u03 zty5>+f6W8@Os?*{_QGBtloukglRJ^e<%^TP-UF0%&jb8nJ6xyV5n;WfQ-Xavw(f14 zp#09B4%pEvy zORM)t*TxXBGmw7s$7p0SJpQ8*uk^J-8ZI+!e*X1BN~TLV;?2fhPu7Kh&^ME}_%r%{ z8)eh{M?=qG^VKu_UR$PU2zu!}8u*Nl$ymZUUkHJX&@fxhSB;dg?{*?WP4E?_e z(}P-zcwWu5n~CN3m(?gg(>Rrn*Z+Xj9-?P8oLmjh8@#Bi0I>Zy>a$zJ_%B!M!G+Y^ z?3qEZvwKkmF_j*3{P=Ori-1tp|4e1yuc6^(9g*l22?J)=e+{x7`gyG9&AsfH*Lo4! z2WNk@)F#+=_0MR}`%9`fFwfd?>gp-H$dYFCs$Gp&YBiqp>$W{bQv3P__Th(Hgy; zuDrZb*e3rO5EA_z`u1bk(sh_^%F&Cqp4ScMorX|jdhA!^l+ujNIsSY5X5})9i;E8& z>U}QJO`j3F0_Z8k4(Yc7nKYm}Z*(+|!{Ti3&aTccF2Wk)R_<{WDafRfPp?1!vEJwW zKLo9L)3iWmai_8UEg3Dr{`P!_(PNV}-7GHeuJR>C?z=?8aYxcuxULDF>7I zrAu+-l47Q|E>WjzKx*4JLreEVXz`0OfwAeaM@q(FtK)Wm5^Xy)10tlT#$&1_`K;vl z_Kcs|O}9E|M6xlpZJJM)+cW3NMZNVer`tyKb~PwTiyUa%Gd_t+i(TU#e+7o})(>eo zuk4>by|+n^d-S!(V6^wyP~)|ADoR0<|K=6D?qa}7`3qegYD7L%Cd z-h9^=!f8t2t>sSPExxnE!!K{rI&@QYUdkXSPcO4G-ZGL(!jzLB&B(w`)g}+#Ng1=2 zvq?GIJFSYL%9Xl$K@8P#LIC}kq_P16`tB{WdbyQTa|Pj z^GCjJ8#$Pfafj!d{QDjC#;d<|qKq17+o;&GGrPvkNblvK`!N!j?1I&N*d!^1Zhj%2i!t5BfPxoRtM$-F(Uf)Li@faaZSmG|& z8{8jpzM4Gw{WqTI@niYUhd1HzYtN>`E3MaMz!1cgl!#Due>>k`=S_zFyoYHVvGK#H z2d$t#Cx0OULIB;A@u-jnsc6b>D_)z65?k&DrMeZC{rv4oyJ(VGv~b+RQuP!h@x$vxA4a46S+1w@D}(H|>Ad|7!m*=; z0haSy;2oD>i3*ZUR2!nlvgW{^*DPQ+~CST;HTBNnL=mPkU;j->T$P=x%T2#%;I_{tKBPuiL4(hNIJ&ev);5C z=1QBSQJlmz>aWB}+CTE;B+#~%GzT?gkO?fDRTBJ-v_06~Mln(yNZ!vhUkWA1j_jo8 zOnjsVJM3h9_J>{gUNwJ9{dwRWMts=~q_wpbbG+oupBS(fAe7Xc;59z(Bp{eih!!7k z>hU-TJ|JVtF=kNF_6)jtwjWOj>hza0p6AS?K1i{KIMqNtF~*rrsP8R(vg7G~Zf{Uy z3yga%M~#OJ=$bZecIR(xxL+JTU9>%dFS3el`05&JgFCT*N2pN_sGr12k9qlSGz_|R zrOXV@)6m1xgCAXQjPvg72^|q)DvI|8^gG8%+!et1bY^`mU;o<87A!e){P0e4TDqBR zqdYhjlnE-5$S6!$GoD0nalhg5`f+i}5$twb>rJ&svF@5)n}kQaO8YyWn+kfLBS{RR z)o<~1=i4<I0&MawAK5U$yekDFT-Yl)qHBnoPS8;s;F^%Kqa>V)xQxpuCqNAspBS`6!!1F{Ym z@P$34$i?ZJcyD$Z&hbfVIeh7Fqq=Jk>Y4A!3me{zsrq8KMjn`+Si>&KjVR#`2x6!0 zd$G7%x&-6waHIQ^4e_L$@Ai5mAHnewYK#-t?CRcWO;>;Qw1nea^3qk=CY^6}T?_B` z$`B(0^Hr10SGf?&%4QBZPm#-TS{%9+^_cvpU{m4c+Br*vp>Rrd#_8;~o8&gQ;=^kg zht~wc;U+m|#*$0N;#;l`Q5=3TjL$Jrpe{m4o0(JDVaGU^b!Xgxhm+%Nqu+?< zWz~v2VVrG|@ADB>+0|FwDZK`(?zJ5qZ4}n|Ge6mthH}af4eIf5?2g(=PJc{ljgEc0 zk7s?PPD>9foAeKv;;&TF^AQc7n$PBvMe4WEGc%{=Z=#RqcilRu41C!27j7+9{0PoL zAm{T2*_D;|G!8D;^VpWiSAq(vHT`3eThm+XSpQ}6c4yKr*Yl6-UPR>E-y+v=%`|Yw zINiy&RHu$Aha=iuo=dPQ7do!ovXwm#!$Q@U%Q`jOT$ru&QvGoJNAS(q%1kFYCOXGxll;vJ0EYV2NV zeGNkEWNXf?$A3xKJ0ws@eY8fY&zs$;3VCZTP3N^40Rz5wTwucr8xdMS#+ox%RbQ0T zT&)FCM6y+@3s-jlJIZ7u3Jgmr9LmKShZb5d)`V%{ya8vVejqJeIA(Gu|1V?ex{Wy0 zRt?N3z-Pu1+L9Q}sQ`;BLE=K;2hEP#ibiX@sRYP?0&`%5lP`Ad0)AP9DyRBHn(wQN zqSX5M^!pS#$6zm@EiyB;K5i{vj;f0Ak=;tq2i@9rALpBkl}!sqU(*D+^`8w!NvsNbkM5?Lgo5JPv4* zm69Zwv*acC@8d*{QTzBzX0wB*6Lf8*!3g6*j<&-b|J^-#X^k#8iCHGi}9Buum? z?oHYIuEA(OE@w*%aQk&*qd~3>(g_^HfRS;hYqcszU580wFW_@}c^^3)@WV|s8yp#9 zt@#fPw8Nz-yeZWZ1(i(hiL>UC_h4&S8dh|R7$;pZVkz=cH#WnHM}*1mUqDk*UsUfZ zN$2Yu-{0+>eC{_^AWIevTRFwBD-RjI%kOnLW&m;&m*xIQh}WGa$ulJE~tF zEIl3^M@6`k6W*uy977$7%K8HbaB4n`UKbZ(vxPIxVW}?l*~8{O_=w6{7LtXO0Cho> z$JT;H=a69Y+%yD78qHCfLzVkBP{@h%KzSSY=ehfX-Rrv2h)XQQ3c^dznhuGzgVtHR zsr>i8He;e3HslxOXe0V|nJs2e{_w{0IyAg#b$&zL%K|MSQK6s`>MqXz(%EyZe_a?k zTjJ1mBk?PoP)4>vIFZid+FYfW;ZKY@9osUePXA-two}@VeI94YOQBX&4+B=B*b(=$)9nof&n@Ity^>kY0Do)<>QRxN9?~3ETY4?TU_S#|^9vie4 zd9g{W+Nlo`6YxPoU0HE>mQtc{itsazxv!=vpb5!*0pg|2ox6kuX`&0X?KD)xNg?fS zg}ZSCU}8EQ&PL*l#ZP%O+nr#&%3%z!gz7)){>Ekl-_M5nP zXKDOy9EADu>Bv;_X^4AMr3iPI2gTH!a1AJ)$6r@;ABw$lnQhyMLGz0VZ%D3oi_3fV zOwwE^-ERhTEpKkQ*~1bgIn89WQuarK!%5(AjX0BPE{5|7Drp=&RM1&?w2yA8CtaSg zPY;6k`2lWGi&_1M!Vb?xiq~;vxK_5~FUHpVon-!5M|z!RuKN?BCz}Kw2lE6L;|~dZ zF1CD>vPl??O---1?1wyfOierqo-%cq2}dap31%gho0c9dx6O1d%LYZ(5(Ys?AZdp*_Xb_h$$p(S{F;^r`Fv7i9lxm~04<$=Th z-%;sWpb!}|+f)-%jAXX1NG|T4hy9&~$g)pRgVzn?lkxr!ba_6sPeZQMI%l2pqs3_U zEj8H%8sn2e+Wn^^{J8$SmDcY7Ai}Zr&`iKh!yoX|omjEPFVwca9?ssL zW3M}Gw&kCq%+xda2JtJ!|5G0!AbT!pFi({Ay;Ki0w`fBbw>n7tsByk;{U=gd8GALL%5;wpbpo6 zqRJ6~Z+v}I=$dAA*>+w1x=NTTF;8p*p26Op z{fq7yETPb~291Rer_tcJyHZ58)4S$#a7j{}H4PB!Xg0Zg@m9-hm(5f8s!%~WJ0IO6 zpb0yWKlbt)SlfzilR&@F1euIZXv*3IUaCF3)q_6$)QEnTe9$VYvBaexlVREFl1lS@ z2`eKto#T7q@}_cUqcxLSk-1#2;Kqp$*l^}r0bqxWoo%ADTo%plZu{P zCfTV*49V#EDw&MHIDTL4#wpw=Y$_$mW!W+IwPP;c-&XUC!GsWCWwca&QSHqpDgo?x zP;IGD;Nt0QqrV3i&S?X;^DtrMrH@ILD<+udFlkI^RwFP>RNko8kMoetqJ9bF69#-y zQs&U_@mb|FD;oP*!)xps#hI4-i0Y+eG(<+cYrU8EWrG1_^2E8bW?hPDjN{WmkK=_O zh2S?+{*el&3ztv!9Dkg~I~+}@R;Kw&q~X{rbOO2l?qDDwp+18XxJkJsc}ek&f-{M^c-*E{*j5M4tSLR)X>Crk_=8 z$Pp~${ls(h-T`h-{msJU28SX>vPv$#MnA~-Nf{eK4q*k-s?9~9+P<-KM&ZLyx=<=* zsyJ~`Z7wfna5aPA-`W%oIy7Zof^?PI_ezo}O0s5h`-HysoB+ckj1wDvZaPx{zgBu2 z#D2W#o+1yO3oH$yy*9u&w2IeWrlVx_Q)&_00>H{7_OZHWRW`M}Dvb=fP+BFx^3(8c zV*p-i1EruziJ#4Us;?$~M812qRq$>oI)lBq`xw@&c*DnOYL9FoK~!6qtHKDF$v2Zk zWmYk>FNIw6FYVBnb^z;oQF%$z)YwR#JSk-0*l^#Nf8YCM`g#^$KQIz3Hzl1YxI`jK8tUF&Rg9sr|X2Zb=9 zGrZ^GuvIwu`Fy~&+ZdE$ZO#kgO=T+#`;?26@6NCd?pb0Ei5SMY+Vx)9fy!<>WDY5c zc(mf}6XY+oDoQNxAnMIq0pth7G}iW%(YbgA367#xrZr1_myml*s~6z75C z6eYxJGOJwGA2K9`9>`=04^MrEYNy=~ra<#IjwEX|a_H#il-;>JqMv2bgo;D`^8i9h-V3M-Ig$o(XB`hZpJ2gWi$ z!rqf!ioKATsw}J=PK`@2sO+K(s%-$sM#nn+8u@@vJ)+;us(GNrCj6q>4{}K7|hPYljBd0dwsuAegYq z*8nOWmEj~kuH-S+yrh+zy4h72({qARIO8svT{C!$Qtk9``WN{|snPFv$fB@N%>iLs}UOtdBvgG0N-D)i`*Z08jX-d zmr1y6w&cEvMK~I)C`D(x)g!#m-vTZx%aTkeV;uym^5&X+o|l0eK&L^kW5}BHk*mP} zog|i5iJ5G=@P)(SU;^<=KG!qIOVcse?)whI<|hI)22s1mYL1S`$BZUtpMrZv7H~Qy zkDfng0h3ohf3j{2Es6#C3wt30ptz6f4eW>wZWrlf#=A)Iogj(zTQ(G@+1aF{>w24I zxrj-lX`wX5_35x)tKoed5A>(%`W<(y0lW^m8!D+jeMln~Xej1j&Kh2gePx)k_3fTq zNO+qA-qh~`q~ar4kAG&{4o%4esodKIM|WkTwf4)}CG8uN@JLGMm><)($RyhLel_7H zRK|sx#KrSXZX!TRlB-$y+*0!Uyl1F^`gTb?P&$S9ki1$hy92{Is3^%mP%ZWQeCFsh zu0dIsW?Llb{dpTs#D?W!Y@_l6v@c1P<)wl8e#}-XKZ%yDHc9*HTSwP$%%~vr!L05i zY(L$>QjY$&@g=@?6RM&FP!WCy+q?s170U2c+J<;EH}3!Uaq2THNQi`{3{TjLH#NYb zS{q+IM63jMOQ8V72Kl;E6MG6;9u!GhE2f7UWuPQiQC8TbvC3a#K2JRyl|hq)MD_dF z$!%_O2kvC&zET|g`-JZ)uuy0=z?yYxWCUX2aIRsq2({tRHbbjvCuPQgaC}!Ki|AP7 z_+2$wJwrTCLiplR?Fy^4F1CW3v79DObrkF5-Z!o)wmh>~(&}dA^he zVK&}$r2s1H0)diHwdQiJ-v0aEKgd!q3q66@KyEc42xY&s-?OBIJ|HkD^GqL(Ty(0r z8=wOa31#h6=?7NV4+iQmt8&*)eBIo3=@0XvrVF$-{-?AW!z06Z{10wcfuRe=(4HUNVA0yeW zI3!R_1;R!&qjnH3REfNT3US!8o-=qqAX2%^JQX2uUQA%7jz(uEW8i#5Kyts)X%3bJ ze6^DDZB?8QR5Bi(CX-Ix?F@7K00W6_xsM$ueR2} zqIYx=`b=N1AuMBd$xlT>zK6dGdbEWj31SpQH-oLG&X*coG2kb?+Qf&WbPU*zcL=+f z1G36>i%a8INvhBK;^qLSaKL$4omxSHTIn$%xyLE9mAXDQN62s-K^!H{GL8vVz%tz+ znW+Xt%FoLRLd(pDD8+AiW${(orVF92j-lZCUkR25%GMMn^O=LWV}tt0nW&+#8Kk4h z^?`gRx_?0=oFoM6@HKKErB-$*yAMu^LmLp7ZU<1#{E zIyKNwrVHbfz8H#uO{V?f=r>!j&aVNrVImAHb7hQ*4VOZ`a~gPiO+cU-yf#BcPP(C( znthvq&#V;JMg5`9UIlF=*#M6j8tR~Qk$fA!2hzJ#Uqnp}*kZQD zWeUnq=K3`)Q~ii|bXDOXqP9I|<=#29l4~VZRElSis!dQ@O+oKOLdj$Rb%1FXY63E8 zhjI}2K|;V0P>6%oUlyF=EHSh*elS4O?HOn}X%3 z^}t`E{1KPdO^*}vruc1@A~yZ6u-)eU*(|y#w`A&-fa@e`G)@)pxWiDR;~CqbMfhR7 zRz3($_*0=yp?my?QEi%&dST&%q$}y;9ldXz1AGT}A3x&2(`IV$VobEBKmkAd~584Wc6P6ZA)su@5$5 z{gwW%U@`5B*WwS3`}5U}s4xJEb=q(w{YU{R(yS!^>S7U(QXMl1X)mgaIYEr5T7K+^ znii6hr7&Hz$@|1zk|Ltt85~ z7nEOxji)lMXoBjnoN5-9VP1ih#=~kRUwxO%B+CFMKhDZUMo1YGqfP18zxlQU0LtWL ze5NE#iETGZ+Sji+m~JwU*j;F9vL2CBb=m(FjI$=IRa;WAeDD}$i7_ojdRSMqXI9zA z>;e_?{2AMKI=aDWekjdgG>sjNjRj_`j|_`qobDUV5n1|cPe;MAfWe4ww^kGr^v+Cbg8P#F#^~|B7fW^sJ+O-xJ4tkK3FW%1vNbQ4o#15tC z9H=Oc^M3aGVTJ`E9vw!deUt3OYW)QvQMOyE9YPajF{mIs-kO zZl{^u{8X`Ahb0{2e5(?9t?Pt1r3f)JH!HGLlJDDrG(C?sZc7zWMyzJ_5b|qJMU0~L zkK5g^gCT8axvD(V}La2VR3>GOv zXZu7t-)1o? z;^`@y3cwS4uJMa6rlY)SnDQMFEbx-K5a7{+3u^{T_wmQ%;%RLrjSTQ$yLM)mI`@7J zaSDYCg@aPWwm_8FKwjr!*pr(SR{KsDmZt%YXgChM3!{)il?`P#Tz#e5zzT2*i7V7; z_+TQH&_bfm25LQA8UxmY*jwdpa5UqvPCX>zDjV#`!^s0b^^Nrms_o*)>fvH^;YsH* zHDO@WsPYZ7l6T}u8ZpFKH?6;201Xm4up*=A3^vM=qIm~wFdaf=o>CTSLE{~+C5D86 z9!i6`C?YJ^aX9-0VJKD?0m&Y#TNzeYNGn)2&K#`W`|dk4sFv#3Q#(I0oO4@A?p(o* z*8a5^6M6B)40p$I=_=aNC;SvnBU2r(Q|3K>VQSeRsI8ixVKO$1S%N z=_al-wBQyAgZr$b3d?JL%hKqG{SfM<=Gj^?&sH^j;QSGwQ_k&`sE*cc+znOp|6}Sa z*y382c7c!t*Wm6pSaA2?5PX2a9fCUqcZZ;X;0}WgHn>A@2^QSl-MQ@VoPD4317@DJ zR##V7)hm6_#YVYIX{Bo4YRcU5L{e~7f9mEx@Rj%@S8D~PZa!lR-PUVSL|*lgTZ*Cn zsQu^182hSwEw!ef?@u+*cLJ+^6**;to%4MMq&%-z6{$}4eavuzOLhU&B zvhx*1;TM>8-c(wZOW_|^lcF%i=v+jA`$!m(Bf7OMFubC=qRdA`F<$<22djQ+!uj6m@F^Oe+EsS9F9{ll0GZ?gf)eaHl><2I|u=c zcsRSM@~r8)w1jpKoU78scIZmkyw0&^UwbWZ=2=d;ZZon?e63|EK0Qs%*#Dbq+!mB& z1^ODFMtGNl$7=J~U%%eRs=4H&YkAjSop-o`(XJm+zBSyQoeOfibTigaZBbt?`{=H| z6d96S075fKJ*anFvzUPbrji~ZKAUY^CKE%~T=uu36(Ff$MUKOz$YjWo;U{b3g}?U| z)!LEvGeYh&HSIIAJk!e#4^wH<&ao0R%L}_W$hr}O>0u7a_EnAo_CAIt^DGptR66ug zuVY(8qrJAn(yTp0bH+!1WQrI;k{80bYeklzudv#nAOp}rc3lZ z@18lPSCR;o3BRg)zh9{7Czja$qTYSP@}cBxu`-{C6L=$V`6J>dV{?1@h6+BKyI?g_ zN6w=mN8ub+Ft-+9cwDAf9+u<^lCkl-#{#irs8mbqg1tF{rOh!fQ& z;|}4qQ2ooVe)E{iWmqmMB^9XS2e%*+^v26V@(ho?<&h3W##i2TGTf)2!ZDE_DXR`q zs&ldS;Qh_&mGiR|Ma3p6=z6B+V;Hgs+RdZfsEE#&ufG!YP5;>}^RG!56_!{Z!f24@ z>-{4zdt=n66G&@pMV-fng%o%$U) zfZskiBy9-kQPAE1GM&_AF}D_lE00ID+`RM&jl`mb^Y`Mj%yU3KV@;i4M<<&c3wE1k z{)FlBXyyEZM*3_#AvX*HkN7#k^+B74q$zyAGFDFS1&(fVG=jE!)Gk%Zq2Dec<#X3l z#bKyfsP{E;_ZgXo$;;r(n4vPQ*r|qsnCk;Cpnuk!>~YVNK^ z|9Sy{8Bb18%elyF1W9YsqQAa9a*|8|+RPbIW{&d*U4rr+;O9WW8pFRBT!4_Zi& zLb;D!yt9Ltqk#IkQ~Nj21h113r!g$6(t6AyU<4QvLYO#X5fkfUZEl!J_InYgHp|Qc z-yOEFuaT8cPTxnS-WhQpnrRIeG9~cHZ-oB@E6`4KEOqNv*^JL*C&MI_NWiefu%Sp54}%?gyyBMe{!rfvSn*}S`4ZL%#NX7TNwKP@S7e*BR& z=J&iUa@N{WQS3T1k581s<(C29`d-iD>M}iBE)Lxq*sJLD8Vi>DU>+f^92yDP2#4POMRH;Rceom%{6P6s}MXNRq^4 zz}!F^K?qb0knZ*^J?dmrqudQ2GU1Dh{192osZCTVO}Q65l*YX7o(spKhBjM8b>*ms z2%@~0DnMztm#b8kv~;PZgqs-%YWV>6Wat=YruMf?Oco8QC0G(-`(o`0JtS@7XFAVi zyij-De#c?igyfU+VTn;2o5-g`1}l5!e$I;uHW^1?Yg=aVZ%Lq((k zJxXjjv~pAQdE5Pc+e^A*Vh{%kRgshr!52jmIn~`pol?);B5y9nZ!`WaT=gYg_MWKk zH05gtrI{8~lTpX-1=`6^i^fEj2)Sp`Sx+?gWGnEfBlpxonf z;UV%!>s$n`8U)Cp*DW9?@fF?LckJ876A`re zFr~$j!kS)ae+C#UV;;?7#uM1`34(-;XemwP{7R{-0pZ=E9+aond4h~Gb!$|D&Xd0` zfIUl~%aQf)OdZJEK8A*l??1I@8lxgTq4TCv}iuUd8d*-SoOVUq!@s*f?bb8h)rhJQ9~vhu(~dz(@oprN;8yO_~W~-i;?bZW3OK(8`^lTte?RL z#2+7eJC;nobL+F*a5bF`aj@}l;xB<%+frD=-?bbHmVd|pX#SANy2fu-UXqzXSfA+i zVf>6HmaD6bh5ZL=dCc_?<>l90C7+?G*5&JA0NAEIm7*@Wa5Y|a8ut;KTjd0a}djdj%$76b42SVze$9N z6Kue_%TaYFJ}0gE$j@SDyBo$I^;@jCe6zim&9=;4o?XbLQ2i~F3T+X2HJ$u&)C{GV z-)cek6L{s$1?1wa&dxhYfh%)nv5h%ZC) z!g+#R$IajLzv*1tsdgV~i24QSaa3+IQIzr<%uTk2#)off?5SjwU-k$q{*t_Br*d1Y zpSQ0E2mGz*QzdR*?Z&nFZ&EFL9}=Y{EYsy$D&F%UcO9!j{ z~aG z9udCZwyY{fCDxbzpkbmJGnLAq6}wqc9>k&(yF6LxmgCl_ocQBptMp?g^4#WIp@trn z;v7e^Me|aAI5+N{Su}A9FWAXq`?J|O2p2(^R(_d_OuY$9Ht9YVo@5`x`lBhTX(%0s z!KH)baT-PL0BIR;8^b5M-X<(Q>bfilxa$Dxz1;Am_>a`UP#jz4un^U+_AzBcMze{N zqoFXQg$)~D0Dj@n{5eBpMn9hiXSVK-6UWQZDXus*tYzx@=Q^W>dVzWt!${DCmTq%=Om=#-MU!Q!59^!LjDA`3iihm2QxmBg-y_YD z-AnL=%yf+_o`5j1=JO@XoJSK4RuE%YC%&-xAO8Q0YU@(`mvT`Duo@bQ7N+n&(z$Qn zaB^4Ol%BplHD-KMd8U{q7yPnoBaYq3GnPf;^EgH8nO+2=_MStNQhBtIiQAzHA_R(1 zxdaA6fbcx%M_q)=HH@j9ca5b7aCS=!PJi2>_4CI@vmotl>X+&rqh)VhV~j&m0pX(+ z+8X!dUK6R`?D}!fD*r_o7Q}P#?dMYRi13Ee_+zYy9|I~nP3Ilh0#yDf?z~rvxipo! zk5BzDy02ez@CV#vC{IG;g3lIKm72$Q2@-DM!EuXfk(2J?t zX%jR9E93+1LwgBRntLD%HHIv;8n+#qP+bv6KLl@mmSAF{Rcy5OLe!J0)UQc2C(#E+ zKe1*@O*+*7KR^nLjc@T!L4+nJ!~7WTrsF{woSOY3BRiF8`bP3Glr-Y3|eT9EJ z%b}KM9UGh$jAOE!2E%?kWE@Q(A4k6OFs(kOP=bKvsKi zd#KuMwXSL5V-~<13;5^LxR;X}O`f^c(}Jn?A6lb?#NWnG#2nh_^duY1I>)9p64QO! z6?90jVU_~SJOD?q2#>Du@k5+7YIt18*^9DufFYtRca=zSzO*Kv*TaKSOlphz^%zqy zF*1U3l|rB;)dxHwc-Vd>%I0C|1sv)#0S8`IILBx34C-vHKowTze@O6#(U@ax*CI_SHCMblXC1Uhk5Ff0&U+Iq+!c)=CeGLpb1;47P=2 zvA@`wZ>Q<;aR{Vb^^U9fjs5QC+;Dy5=OV(;EwuD7eu@G0-Y+&A)P*?YMt%Vq9d*#Z02MMJVeoQi- zkb{^MnAnB>9|5QnO8Yj$3(H9lAy3RP=4Q(1TD=%Fraf?sVBt>cP~V)J&qGEAfynU> ze@Xt;26I7v7nn(W3^ZF)^9^cF?uR!x5fM1hz*X3NCw zg?@1;!6X5F+w}|<%Xh}*#R1dp|HTdiG_ftKet2F>F>kb}<|&xW&JRT$H=}h_a_#yS zzD1py_|e^ZcVz!o$evPS$zh6RVhXYl|8051(Nrfdf5Uz{?c9-RgrpS&O16&~(Y=Y~ zA1;+5^s~T%&Y_P{xkHj@yvnQUjRWC2aQy@Y2n!L~4|utvnFPUb#Ayqr*S}LfY%_{6 z!%~Rb;H{Op0<5&G=n6FG648ciyDwvFTAhyKxzqPt$Q4z@g|28E)|aZCu6Z28s~llA z365!cTc%y}{%aZ#9W3h2>|AwNe!G$AWP3m*sAjTJJ)xK?f0+hg1z)>q8b_TwjmY$o zM74a1A~+eRnX{^zF{1!^$AGH%Q+~e}Q1pzm`M$(7{%KqIQK*9HwzYq*l(gaaAQ69U zGY&s3|6Sw3D4{fueZ-OnRtymCyc|NiOpGWyB>?h(qoe6n9(?Fe4^prcTf%g|V{X!O zt*&2$ZF9%fYmcW`&$zD+}C9Hp+lCtrDF zwwO8&YsO8HCPx;71Dqhcj?ti$)Mvnd6B{jOz)fURGTD^0Hko06d2YV>Af%tPBw9Cv z_75S8I_?V%09dg3xk^yIl(rF~Y&;a$BL&CuOEVKG!4|@A_5;!7{DuYJawZP@}d)?f48>v=O%f+j% zfM*h$h9MIv4X{Txt7_Gv>bK0)sZZYO=7EZ(jrJhS6I6q$q|2`==;BHnwmw-RDMC=x z*#FQS(s=(l-h_(ct{~_`UN?U*e9!0>U^mEYz!_yAa&}jx0T;w3S;&IyW*_IHsgcR~ z+MrYE=-2OY07qw<6Bb=f3=7QlQUp$)y<*wlj%fU!NG!@Xbj+Cfdv#q3hv4uk9KC$y z#slHWXL%cr)4>n{Ty?UOE`~odzA+T)^WLqEzQ+n1qW9J!tq$sNALKWQwOQ0WB%;kr zPJ1^~egQn7S?KLLXNH0l6p*gYdr?O}Qoq~wmqKGm_=Qp%>F-@UrQ_tzlk%-o&5r7B zh=@IiE#0F{jkd6JFB(vyc6G9eJahVSnE4PE!ozxqNO@)+PQh}EjIjZ2TEPoi2^6f* z?a6N|?;aXI^m@-SFQ|WU)P>VynG1HqGAt)u!aOlhy5KTWl!fgd9rDgbWtC;9jIg5j zmY&x%Et$@Zz<1<1XI_W14d9Dz=a2Zm+$1W1uy^>kzmt~_WTK#uR&+=vLYq*CemQd? zJK7{p=AaG2(EoU|M^zCg_*gpjrKCjhJGfZBpc=}`K}et$LX@&CQ@ym7LPc)9GyK_o zk0iMQ-LLTkuSEFM3Z~v|2`IB$dwD#;(l8VdSeY0FPbK;`#a*J|bjF(^14XORaAR^Q zp#AJ9*n8)R-bNFU580bzs4)`~PPu}D6b$^*KlO2p;fM`vdxq@SMtw8pF*8%~S|2PLJn8H0!Hn5ZDJW%s0$>oep;y0B(h?1q& zAI&U3ICSL1)%4=PMYB6`;2j24S^y2rWv;3#mofxqczurU^J?|*0?{afL+l#B8g!<8 zKfOah4p_k>cE^9DNw@oP^^T6JOR59=NGUylfx(vr0Ab;8mt?^MF7+ZMaZnE{iG0yl z3_pk5S0LTr8aT|JEq|8l%WI1nzw5_e0QXu}H7_9(i|AWlRl9wAyzY9Hd#VVF7B0BT z3kSf+)7F#2&Z%582M24S6vi>}gsMio&fYHiN{);%Q>Z@pgZDWLg%DqY4h)$cS7uLw!Scvr+I z6qcDmEG>&`%+oJ9gF5c2WG^QC(y7!Y`RW+m)$(NC!K9l-u^Pc6>vNHgPQX(oM$%MM zr@}AE`A6{Z8on$i{FgjPXxDg$RI~jhBZTUs1sES5Suyg35mU6XSu59nLu;5;nDiMB z>pK$Jev#ll9T?1fa@kpEx8$ROoFX8dJ@o|oHPa0PD2mwbg{VYWJ;vp=`MhG(F!tW< zriXFyNW0uRDJs-vxa&U{*A6gyg<2x#YN_cow$l%~j>iu5&Tg+)dTWNnBzxS8F;P~j z)Q5O$$W_iV4;{_ZZ#8HvRmNNh{3`@U`Uht|I>Rs(I!xU!Q4WmVmN1TI6JV;rrABF{ zSsEKU_^f8NsRV;%4?q)?)+8|J*f8#)>`?#?2~Z4=1j;9C9(-V$g^TFnCD-p`Zwh4F znT<{K5L2KP)2@TOtO_I6a~u$L$3;*A3-EQ_RJ*^WSH=ychx8rv*Asf&ZcYdx*Mcw~ zVsST^o5a_@@+102Sb|GQ}~)tS}+aD;PD7g#DhWEz00zF z9QnzP#t1mUgo{4x<_D_VW(|zB>cui8>{)L-<1l~uWFbA}-(EfVWf9d;Z;t-ve~sG& zDCKvkuW=4(jnW@@B}VYWJnmvJd>!(LVmG%H);*x3UTbUy z#MunPXKi#=gKBNATQ8RK6RU#gc<=nLdAm1g9y_bqAV)fZ!K9o8AY{+ycc^0*Jmn?G2(E%m^q zzs_Ar_xyAh+sre+^fG{(>6YpR%dPJ9#IiI=rz2Ydh^e|{^Yl%$TE`3Dgm`C@Ofs9^ z&|zC0rQky8NY|ZqEKOm28>ZyXcW$E+&$+;U>f}dD;BKMphajiue-gU_8{DyLErbRS zmji48Rr*=tu#ba9jb-Em>93J|KWrnDA8e=n7sD}}>#Z;C^BYq$ouR6h2!{0Kpc^d5 zXU+NWqER~bjOpZ@`#aH)sjO-ndWK3aBQXS@K1cL_ki#%=tLH@k{^G?*c3h5i9X}zx zPHSp@AGa+7NGAEY-dxlbi#FWzyvS)~gpp6_6ZysES|sV@;MbgB!S$v!_L2c}T?5$Z z#LMi~U1l?7al`xn$R+_}7?vGRMyhZp-G8u16_nB_Yx*Id5Sr{Fgi^{n6^De&!<(V@ zWx>Rn-0&pE@j-}ay^bimhmy_b_)5Qx`Sb!~^%#}p>mW)if{xy=8P@d)0kCqCgy1Rh+Z9bQIck`1&dk}{MYEKT}gM52o9g!)PY zxDc*QOKlqM?{q37F>5BvD_MQC_1nrWMCEU$sIyK~5Yx~3$+ndbGzYk=U%#m|oEBoN zyjU$CX!8dnV&IwaI+ffFh&oLgBw;LB{pTH{VnoO7+wEl^AEMu)nPLc`)*NrwCU@eXRr%=@0(eb=Riia$?ClOYLb-FF7z@$oz>2YHlTXo zxVta}YVrdfTlOG0%4vi+FZH;?K~Xsvk==ErJpaFp%NzyK9SHXac*4B5>l0-1SdN1+ zs25a0{CEseg7?5|P!fCW+l2x$0u|^USY8bFzNGfzEcHH>v{An%e*gfrQ^kX5YSiYK zZbwO?X|cLGwZ5AN&Fn=x<5GO)CrRLzuH=aT!%e>{0C9t;{~| z?2IQD9N3N0Ns;ei@Qi#XVN9y=gfLx1&5_j)BiSz@4HYq2&Rn0{g*~e0Clp1yuiEx}zZ+ z)>{KBVNno)3flehsQkvI=69870xhl{wqBF8wU-Qxh^1Fdj1784#GBB?&W93kzbbM;X_9FLjy z65zBh{x8iifL$!7&2H99PcodHA~1e7jp+pGkZ3%yCHW3QgHDl_b%}Baa%w#I>|5t3 zb#eY>YkS;7A8m^@s>dmv-MK1sfJCiR|4IOS_T6_qQxQ3-=3=V(%FY3^STqB%PC)74D?e_s@2x9yd~2RZzrk$0 ziJrI{n&&QEI)alFLTZU~Vx8o$X)>Q;i)rg6S+X<;S{&`Gy^B`X%2Knp9=7>!n!t_| z-R%SYq*!%@*Fd`Ga=gx>+F*?MVEW$W1osb=^S5rCMp=^c5ziDybMv(y1Qb!q@0jcf_zA?(hKbhe zlK2;Y9(#*D-s=~&L+SYZ$Ri*TQ`5GPZ<+BK*C-nZQ8V=2la179G+P)Ft_Blq!}{ds ze7_t(DbUigsNGY+c0w&q8_A<}QCV zh~*9(Uz75*!1@1bBy1e=0RB^>`i-Ebi4efko{z<#OSg2N~?#nYMy9&;L)Y*@YbNbtEqA9X#{V4^oH z6EfRYT8974I>$vqde{Hrf!G@tJ$vfq5owx)rK31U!(QwM(nxw_-l@3 zp9^Ax=OxX7X@IFyUu(Hp=3}g{Nn|$Qa2W-$ZPTf?@<|G@-N%Wqy!B81FO;dlmll@) z@=Wnz18#0!&zvh3JT@e;1jr&C_Hi zf=YQ0nAt|iAHB{!wefnmu<0>mgk%}qOa9cF#t1M`L`2o;vOXr!3WFNu?9>oBS4d71 zo~;NB2D&?$%rbjaZ>Rl!Xegg(f+mE#`XwVgwQvGiM!y|@#RL88Ugr|&-=1QN0_7>T zBF3vHPHAzC6`n$1@74W#n5;Yb!|it;$l5%MrLWML5sxC&-?TLLg5SB|XJZL)2X1(s zQ#%vG9%`hvR~kORlk!~$hjm)BSfyXQJk%_~drZo}{E<|2nK z%9qL~Lj-|W@kGiS{pw2SzfMP%bpK3;_#i1~?B=;zvDAAQPNS0A2aZ_ZucwME7;O2; zgj7+2<6LEuYCMkA5tBbvA5`lTq>#XwQEgqA2^Z}V-1qC^Taz?@c{WlYHjceMOoQdu z7Ksu@T&LP_&uvW%Z^FMK1!l91P0tLssE8krzgA)RZodLZ$3^R`RW{uH2)n~x8!=u6 zdMH}!>M>jZStIZfM025MSAGmrk5&I3=4^2LQGc`SjLy3V!@^B`IN?bWDe-$awaz~y zp+Y7KQ^=bMk3R)`HMx(p(~d`YhAhRCVs=MM9~cI?9?)G4D-Hk|;WT;8wTvglsuJRy z@$iy6YjXte7p#xI`u`r57|I^d`)vdNwbpeny`EY7>UUgqMPs#n?bERr_pYio;`Jk6 z=`FW(p6#shsPXd*#>>WP*qMAst`_yMb>qvV!xs_S*+SiGWr@3Tk?Ax6?ZX{|yw$7~ zrb-~KB=3K@>7DS@ZzJB1)nz$}A*Rhseo$^c3~Q@s5W%-8jYJN2i%5B^znSDh%9_oV z$r2^9fUJsXiRbCJw>969)&8Y)*rS}I0I%IPQN>wHO}bI}t~rZp?g$a=%P69KGh|z) zr9`(GsuNaer8`XkPn=h2@YJtrh_d`idu_!>?Np=NC-x0a;R!h#!EMqqbIr)(zSK2l zoz4F!4ul8>XTPuoFVd`qn}mhuW4->*@m^;z0*fk!qgRRL0=*ncq@2R%o1%;dk^v&x z?WD-Fs+(2Na;4``oajhZ+?67uyB@-upQ{cwStjS{h8JGukh-MXsqgaoWbmMiPc?DX>YJi=CiZ70`5( z2+{-Xj#&AWL!E7xa^K#~?@dqm>V99|4LUpxfLUSZLKxfS%gCtc(fH{?(5@Rwr>Jx>lf_UsQ$%;o45E3{# zA4ktjG(uI4)~fgYZZnNn1;R7U3dpsSs&YWuw)Lfv`rdxD1#@IA7WFxPg{9@ zJVi1(d=>bLCto`9v+DNzt;x+sSwG(8s*w=)EdzM}Ph82A*0EE&lcey7Lpoc0T!Zjt@SB{5DS6mqmnVLmG%vJxqkygYg2RukNgVc6q2)askYt zyE1VZb%g3;)Y~SPuKml3a;RWxUaEw*AQl>+nRnP$(jvl0vPepmg)8PQN3Dx$pt^a} zQdLt^0DjWQ^SKD#RJB2w>XnbMPlIa$60bImJM?hT+g~iWbgy;Ox5$lnG{%DfE&#!& zBKX%bRHw!l*&4sYUfRu-|IGG41@Qd&ECn59;vXlbg!=$m5tW<_l(E;Uf<5!Gzo(=K zK`F&FL%imD?_yvM=cIoL3C79fjJ`o8a%8q(PC%jKr`%$1^Sq6$zOZ2!kCZCI?@Ok= z_&D@gwz;%Sq*}}@E!JPX;3>NkzK~;$8(k-sM0Km!rZc!RJ!Vl-jx#WGI4e(n(LPq9 zf3`{bP{BQdf%5*?h|eS4-au0kCZ%d~rXS zKP|Z+UJ1A5+aVs9$OSDvSNR%znpLL8I*Iyk&Xt4{QWm~9z1uc;*}hrpTnmYp*J0rC z&rQac2pfJ=YR}g8V2Lkd$?IVWiRGa*TDw%0!kDvD24lP_(7|JJf+Xq>YFIi)xShN$ zwOH1`o+3FxcBNR@%kYLzK!|B5;2S)rURx)wW?fk45m0g~U>VDDn%PKH;N}S`^4TLC@v%Bl}vb(rgp&+jzrB{|Ww1uS~c{0G!x%HF*YuWw?aXtA>&~xecsVZeoa*fzRT+0`aeai2@LkhzUjJ**& zv`Jc$PXhy)@vf-y1RR);G+>7+V;=!J*j^wfz}_cP{qcyC1LPDh)FN)QFDZnL5JX$uN}KxLV$B68eVH@X^uK zA%Hb*hvJeAHV%;xWoa!X=k(8cE5!!V-NK`ov~UwXPRBl5zY+;(WcN};p^qnpXD}Ff zh*R1}1|Lz>Cw%@p2AnDF|$C>v}{_buBdBASJH4%aeJB2>MF z+5yP81r5f?$fG(FhPuHtU1{*r1h^@MD5~*6MQ?v&^`|>O8ccEk>=?u1gs@R*8BlFz z*k5Ax`z;_xiiw7TrToA|miN8$l-j@3w)_!##lyIclQuTzdFp?f$=ujiOy_@Q@SZh; zR5Ppw+9XNKD$4=C&ce-fi5Z%o#2$OmPJZ#T7_66DMW~Bl+}J`&=Fx@={+q7$i7X)D zHwBiAc&zpyU@AKPaMFI)f5nGoOJ=0S`!?P~PPF4p$PsVRF73Z$khIQTstI5AFmt&@ z!?s#wN*S`5d{s7%Yj$B;*id?YMy6p|?J|77{s$+K%eX6wl!u;@{-dw(xRhb&yb0qX zrFGs{Dydw^Oayrcs)#fxls|LPd2^M=@#6*x5J4@IKj@GNkWrLVq`-tFlAb@`3rJaj z&7ddE)E~^TSr5mwGcon)W*YFPOVz@sw4&UOUQQV|keJmU#Ucb|SQT;mXs&DHj}^%@ zpRw=-lF`_QfgJ>lRp>@?+GQDBXBciH^BV4(H%2uquMysTlvB2BIzKoAqb=k)JAR*TZDX*s$ad7UefZa+6Z?n%CpDsX;%HHF@eW3<#JE^X(SWrD z*2&Kjl>5+=TcN5xz1!c(4=Wfa&=w4*?_hL!!S$kFlmWdTANEg!tB+s*)C-S5S*lva zJnd2+FZ(w(g-)#tlj}nXiXDvu%1#mXVLPGCz0n&9SVhNH|M50U5d}E04TXSAd+on$ zw8#s-zC04zH_5knv=)2B*~?GYQyndR(yUtf z#u2*vcx1f4dw=2B&i;R35c+vnqp9PMi3kC%y>uz}Vp(E}qIv1$>HYItO(Mf6V@jp6LN2`aM01EdL2L$9~w-pU1lLJBNkNbDkWPfT&5h>ur<7lMt z=>~$|HJnqjaihwU+jR6X_gwv=k(vrfM#r-oDd*^p{9CDDndTk=j$l;#kms;>EdITQ zi@Rnb@75hu>K0N-_xnUhjgD<5=z9=6|QW`91<#>3?^is48jpc>$J9bqYcO%eFY&dR zpQxw!##~IKXV2QcgdMT!u_ymT;vSOz8hhcUl~w#2Ycuuc@AJ5N8(Q(MW3DwiV18XM zhW7N#+JO<<^0E`)6PC|w+{W9juB`yHk1-S1_tdQAGni^N%tl<-i69d02fqvB%_!gm z*1ue=W9X|9rrbcqHCu+0(C}zDBna?a?{b1u;mHJeB`FFoFkO}(x=r@QsXwR1ki5fi za0FydDP$G8G>@YLgbTW8h81)!DDW*~|W zOMO>eql%1%eg|GunNAs9=6glRRI{ zr=73TlYMX(#Mi9wVmn&X8E6=~xQeff^^LG1Wc71D)*w_j+`LrEFet1FD&Ae!U zQreKYx&U7Oy!Es4OY5gBz535!ps(M2!|_YbD;$Y};dcyRz3>v`e&vXaw)AhztM_7) zmFu1kQFqFa-`rDU8;u}gnNy|SD+vnCRj5~1^UkG|a!yMHywcO_QJZIy-c06cW4T|)Z(+;%JYl= zkFfV$rrN^l!%LA5pz>Q$o9ZziT)a8yAD;}~4`75XfEP9C$KIck%Rt*I*o~Jzjh?a2 z8tLXtEf0{POW&0;IJL!kq6!YT+iu^Z zEr1B5$3~M3Z_K_6bj<`*M929iPQw!v!|1>b{q@%N9pXnBPhAw!8LULGcJC& zerrhSr{mv@eN|ksHvKmwe_%w{@E13%CX8FC+T^Ay_1Y;uxzrlrOtc`j3QbE2E^SFn zdMqK8X-|Jho8M<2hsBO2hNI^w@17O1SF!oWSwFm+O23OIX`K&F-bQrE&LepNt@^J~ z7%9)_&$b7Kl<^!d+0jc6TH?@i=a4j)f}g$KY)q10-71(^g=fbXG+uLV$u<}dHO{|tBXyfK7#UIxA4Z4`

{%{xQxudH>TkY+(UaxKs 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
  • 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 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_wizard_06.png b/doc/images/icinga2-client/icinga2_windows_setup_wizard_06.png new file mode 100644 index 0000000000000000000000000000000000000000..14be938cf8886d97b2298528b4af11eff643fe7e GIT binary patch literal 20242 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 Wl<)kfYx}bxw{(qeR9v%v@_zudpINd1 literal 0 HcmV?d00001 diff --git a/doc/images/icinga2-client/icinga2_windows_setup_wizard_examine_config.png b/doc/images/icinga2-client/icinga2_windows_setup_wizard_examine_config.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe917556e41fbf9400232416d7b5724981be92a GIT binary patch literal 22755 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 Date: Wed, 20 Apr 2016 10:21:49 +0200 Subject: [PATCH 86/86] Release version 2.4.5 --- ChangeLog | 64 +++++++++++++++++++++++++++++++++++++ RELEASE.md | 6 ++-- doc/1-about.md | 64 +++++++++++++++++++++++++++++++++++++ icinga2.nuspec | 2 +- icinga2.spec | 2 +- tools/chocolateyInstall.ps1 | 4 +-- 6 files changed, 135 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9114b8fae..b4b5d1e00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,70 @@ Please check [doc/1-about.md]. ## What's New +### What's New in Version 2.4.5 + +#### Changes + +* Windows Installer changed from NSIS to MSI +* New configuration attribute for hosts and services: check_timeout (overrides the CheckCommand's timeout when set) +* ITL updates +* Lots of bugfixes + +#### Feature + +* Feature 9283: Implement support for overriding check command timeout +* Feature 9618: Add Windows setup wizard screenshots +* Feature 11098: Add --method parameter for check_{oracle,mysql,mssql}_health CheckCommands +* Feature 11194: Add --units, --rate and --rate-multiplier support for the snmpv3 check command +* Feature 11399: Update .mailmap for Markus Frosch +* Feature 11437: Add silent install / reference to NSClient++ to documentation +* Feature 11449: Build 64-bit packages for Windows +* Feature 11473: Update NSClient++ to version 0.4.4.19 +* Feature 11474: Install 64-bit version of NSClient++ on 64-bit versions of Windows +* Feature 11585: Make sure to update the agent wizard banner +* Feature 11587: Update chocolatey uninstall script for the MSI package + +#### Bugfixes + +* Bug 9249: logrotate fails since the "su" directive was removed +* Bug 10624: Add application manifest for the Windows agent wizard +* Bug 10843: DB IDO: downtime is not in effect after restart +* Bug 11106: Too many assign where filters cause stack overflow +* Bug 11224: Socket Exceptions (Operation not permitted) while reading from API +* Bug 11227: Downtimes and Comments are not synced to child zones +* Bug 11258: Incorrect base URL in the icinga-rpm-release packages for Fedora +* Bug 11336: Use retry_interval instead of check_interval for first OK -> NOT-OK state change +* Bug 11347: Symlink subfolders not followed/considered for config files +* Bug 11382: Downtimes are not always activated/expired on restart +* Bug 11384: Remove dependency for .NET 3.5 from the chocolatey package +* Bug 11387: IDO: historical contact notifications table column notification_id is off-by-one +* Bug 11402: Explain how to use functions for wildcard matches for arrays and/or dictionaries in assign where expressions +* Bug 11407: Docs: Remove the migration script chapter +* Bug 11434: Config validation for Notification objects should check whether the state filters are valid +* Bug 11435: Icinga 2 Windows Agent does not honor install path during upgrade +* Bug 11438: Remove semi-colons in the auto-generated configs +* Bug 11439: Update the CentOS installation documentation +* Bug 11440: Docs: Cluster manual SSL generation formatting is broken +* Bug 11455: ConfigSync broken from 2.4.3. to 2.4.4 under Windows +* Bug 11462: Error compiling icinga2 targeted for x64 on Windows +* Bug 11475: FatalError() returns when called before Application.Run +* Bug 11482: API User gets wrongly authenticated (client_cn and no password) +* Bug 11484: Overwriting global type variables causes crash in ConfigItem::Commit() +* Bug 11494: Update documentation URL for Icinga Web 2 +* Bug 11522: Make the socket event engine configurable +* Bug 11534: DowntimesExpireTimerHandler crashes Icinga2 with +* Bug 11542: make install overwrites configuration files +* Bug 11559: Segfault during config validation if host exists, service does not exist any longer and downtime expires +* Bug 11564: Incorrect link in the documentation +* Bug 11567: Navigation attributes are missing in /v1/objects/ +* Bug 11574: Package fails to build on *NIX +* Bug 11577: Compiler warning in NotifyActive +* Bug 11582: icinga2 crashes when a command_endpoint is set, but the api feature is not active +* Bug 11586: icinga2-installer.exe doesn't wait until NSIS uninstall.exe exits +* Bug 11592: Remove instance_name from Ido*Connection example +* Bug 11610: Windows installer does not copy "features-enabled" on upgrade +* Bug 11617: Vim Syntax Highlighting does not work with assign where + ### What's New in Version 2.4.4 #### Feature diff --git a/RELEASE.md b/RELEASE.md index 4c563d88f..950017b5d 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -30,15 +30,15 @@ the changelog.py script. Also generate HTML for the wordpress release announceme Changelog: - $ ./changelog.py --version 2.4.4 --project i2 + $ ./changelog.py --version 2.4.5 --project i2 Docs: - $ ./changelog.py --version 2.4.4 --project i2 --links + $ ./changelog.py --version 2.4.5 --project i2 --links Wordpress: - $ ./changelog.py --version 2.4.4 --project i2 --html --links + $ ./changelog.py --version 2.4.5 --project i2 --html --links ## Git Tag diff --git a/doc/1-about.md b/doc/1-about.md index 3dcd56a6c..e326122d9 100644 --- a/doc/1-about.md +++ b/doc/1-about.md @@ -54,6 +54,70 @@ More details in the [Icinga FAQ](https://www.icinga.org/icinga/faq/). ## What's New +### What's New in Version 2.4.5 + +#### Changes + +* Windows Installer changed from NSIS to MSI +* New configuration attribute for hosts and services: check_timeout (overrides the CheckCommand's timeout when set) +* ITL updates +* Lots of bugfixes + +#### Feature + +* Feature [9283](https://dev.icinga.org/issues/9283 "Feature 9283"): Implement support for overriding check command timeout +* Feature [9618](https://dev.icinga.org/issues/9618 "Feature 9618"): Add Windows setup wizard screenshots +* Feature [11098](https://dev.icinga.org/issues/11098 "Feature 11098"): Add --method parameter for check_{oracle,mysql,mssql}_health CheckCommands +* Feature [11194](https://dev.icinga.org/issues/11194 "Feature 11194"): Add --units, --rate and --rate-multiplier support for the snmpv3 check command +* Feature [11399](https://dev.icinga.org/issues/11399 "Feature 11399"): Update .mailmap for Markus Frosch +* Feature [11437](https://dev.icinga.org/issues/11437 "Feature 11437"): Add silent install / reference to NSClient++ to documentation +* Feature [11449](https://dev.icinga.org/issues/11449 "Feature 11449"): Build 64-bit packages for Windows +* Feature [11473](https://dev.icinga.org/issues/11473 "Feature 11473"): Update NSClient++ to version 0.4.4.19 +* Feature [11474](https://dev.icinga.org/issues/11474 "Feature 11474"): Install 64-bit version of NSClient++ on 64-bit versions of Windows +* Feature [11585](https://dev.icinga.org/issues/11585 "Feature 11585"): Make sure to update the agent wizard banner +* Feature [11587](https://dev.icinga.org/issues/11587 "Feature 11587"): Update chocolatey uninstall script for the MSI package + +#### Bugfixes + +* Bug [9249](https://dev.icinga.org/issues/9249 "Bug 9249"): logrotate fails since the "su" directive was removed +* Bug [10624](https://dev.icinga.org/issues/10624 "Bug 10624"): Add application manifest for the Windows agent wizard +* Bug [10843](https://dev.icinga.org/issues/10843 "Bug 10843"): DB IDO: downtime is not in effect after restart +* Bug [11106](https://dev.icinga.org/issues/11106 "Bug 11106"): Too many assign where filters cause stack overflow +* Bug [11224](https://dev.icinga.org/issues/11224 "Bug 11224"): Socket Exceptions (Operation not permitted) while reading from API +* Bug [11227](https://dev.icinga.org/issues/11227 "Bug 11227"): Downtimes and Comments are not synced to child zones +* Bug [11258](https://dev.icinga.org/issues/11258 "Bug 11258"): Incorrect base URL in the icinga-rpm-release packages for Fedora +* Bug [11336](https://dev.icinga.org/issues/11336 "Bug 11336"): Use retry_interval instead of check_interval for first OK -> NOT-OK state change +* Bug [11347](https://dev.icinga.org/issues/11347 "Bug 11347"): Symlink subfolders not followed/considered for config files +* Bug [11382](https://dev.icinga.org/issues/11382 "Bug 11382"): Downtimes are not always activated/expired on restart +* Bug [11384](https://dev.icinga.org/issues/11384 "Bug 11384"): Remove dependency for .NET 3.5 from the chocolatey package +* Bug [11387](https://dev.icinga.org/issues/11387 "Bug 11387"): IDO: historical contact notifications table column notification_id is off-by-one +* Bug [11402](https://dev.icinga.org/issues/11402 "Bug 11402"): Explain how to use functions for wildcard matches for arrays and/or dictionaries in assign where expressions +* Bug [11407](https://dev.icinga.org/issues/11407 "Bug 11407"): Docs: Remove the migration script chapter +* Bug [11434](https://dev.icinga.org/issues/11434 "Bug 11434"): Config validation for Notification objects should check whether the state filters are valid +* Bug [11435](https://dev.icinga.org/issues/11435 "Bug 11435"): Icinga 2 Windows Agent does not honor install path during upgrade +* Bug [11438](https://dev.icinga.org/issues/11438 "Bug 11438"): Remove semi-colons in the auto-generated configs +* Bug [11439](https://dev.icinga.org/issues/11439 "Bug 11439"): Update the CentOS installation documentation +* Bug [11440](https://dev.icinga.org/issues/11440 "Bug 11440"): Docs: Cluster manual SSL generation formatting is broken +* Bug [11455](https://dev.icinga.org/issues/11455 "Bug 11455"): ConfigSync broken from 2.4.3. to 2.4.4 under Windows +* Bug [11462](https://dev.icinga.org/issues/11462 "Bug 11462"): Error compiling icinga2 targeted for x64 on Windows +* Bug [11475](https://dev.icinga.org/issues/11475 "Bug 11475"): FatalError() returns when called before Application.Run +* Bug [11482](https://dev.icinga.org/issues/11482 "Bug 11482"): API User gets wrongly authenticated (client_cn and no password) +* Bug [11484](https://dev.icinga.org/issues/11484 "Bug 11484"): Overwriting global type variables causes crash in ConfigItem::Commit() +* Bug [11494](https://dev.icinga.org/issues/11494 "Bug 11494"): Update documentation URL for Icinga Web 2 +* Bug [11522](https://dev.icinga.org/issues/11522 "Bug 11522"): Make the socket event engine configurable +* Bug [11534](https://dev.icinga.org/issues/11534 "Bug 11534"): DowntimesExpireTimerHandler crashes Icinga2 with +* Bug [11542](https://dev.icinga.org/issues/11542 "Bug 11542"): make install overwrites configuration files +* Bug [11559](https://dev.icinga.org/issues/11559 "Bug 11559"): Segfault during config validation if host exists, service does not exist any longer and downtime expires +* Bug [11564](https://dev.icinga.org/issues/11564 "Bug 11564"): Incorrect link in the documentation +* Bug [11567](https://dev.icinga.org/issues/11567 "Bug 11567"): Navigation attributes are missing in /v1/objects/ +* Bug [11574](https://dev.icinga.org/issues/11574 "Bug 11574"): Package fails to build on *NIX +* Bug [11577](https://dev.icinga.org/issues/11577 "Bug 11577"): Compiler warning in NotifyActive +* Bug [11582](https://dev.icinga.org/issues/11582 "Bug 11582"): icinga2 crashes when a command_endpoint is set, but the api feature is not active +* Bug [11586](https://dev.icinga.org/issues/11586 "Bug 11586"): icinga2-installer.exe doesn't wait until NSIS uninstall.exe exits +* Bug [11592](https://dev.icinga.org/issues/11592 "Bug 11592"): Remove instance_name from Ido*Connection example +* Bug [11610](https://dev.icinga.org/issues/11610 "Bug 11610"): Windows installer does not copy "features-enabled" on upgrade +* Bug [11617](https://dev.icinga.org/issues/11617 "Bug 11617"): Vim Syntax Highlighting does not work with assign where + ### What's New in Version 2.4.4 #### Feature diff --git a/icinga2.nuspec b/icinga2.nuspec index e26d167a4..09d9efe2b 100755 --- a/icinga2.nuspec +++ b/icinga2.nuspec @@ -6,7 +6,7 @@ icinga2 Icinga2 - 2.4.4 + 2.4.5 2016 - The Icinga Project Icinga Development Team icinga2 - Monitoring Agent for Windows diff --git a/icinga2.spec b/icinga2.spec index 261d85e96..e9eca6761 100644 --- a/icinga2.spec +++ b/icinga2.spec @@ -66,7 +66,7 @@ Summary: Network monitoring application Name: icinga2 -Version: 2.4.4 +Version: 2.4.5 Release: %{revision}%{?dist} License: GPL-2.0+ Group: Applications/System diff --git a/tools/chocolateyInstall.ps1 b/tools/chocolateyInstall.ps1 index 9aab98bb7..f0a8b0a03 100755 --- a/tools/chocolateyInstall.ps1 +++ b/tools/chocolateyInstall.ps1 @@ -1,7 +1,7 @@ $packageName = 'icinga2' $installerType = 'msi' -$url32 = 'http://packages.icinga.org/windows/Icinga2-snapshot-x86.msi' -$url64 = 'http://packages.icinga.org/windows/Icinga2-snapshot-x86_64.msi' +$url32 = 'http://packages.icinga.org/windows/Icinga2-v2.4.5-x86.msi' +$url64 = 'http://packages.icinga.org/windows/Icinga2-v2.4.5-x86_64.msi' $silentArgs = '/silent' $validExitCodes = @(0)