]> granicus.if.org Git - icinga2/commitdiff
Implement support for default templates
authorGunnar Beutner <gunnar.beutner@netways.de>
Sun, 28 Aug 2016 08:27:43 +0000 (10:27 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sun, 28 Aug 2016 08:27:43 +0000 (10:27 +0200)
fixes #12575

41 files changed:
doc/10-icinga-template-library.md
doc/17-language-reference.md
doc/22-migrating-from-icinga-1x.md
doc/3-monitoring-basics.md
doc/5-service-monitoring.md
doc/6-distributed-monitoring.md
doc/7-agent-based-monitoring.md
doc/8-advanced-topics.md
doc/9-object-types.md
etc/icinga2/conf.d/commands.conf
itl/command-nscp-local.conf
itl/command-plugins-manubulon.conf
itl/command-plugins-windows.conf
itl/command-plugins.conf
itl/plugins-contrib.d/databases.conf
itl/plugins-contrib.d/hardware.conf
itl/plugins-contrib.d/icingacli.conf
itl/plugins-contrib.d/ipmi.conf
itl/plugins-contrib.d/metrics.conf
itl/plugins-contrib.d/network-components.conf
itl/plugins-contrib.d/network-services.conf
itl/plugins-contrib.d/operating-system.conf
itl/plugins-contrib.d/virtualization.conf
itl/plugins-contrib.d/vmware.conf
itl/plugins-contrib.d/web.conf
lib/base/configwriter.cpp
lib/config/config_lexer.ll
lib/config/config_parser.yy
lib/config/configitem.cpp
lib/config/configitem.hpp
lib/config/configitembuilder.cpp
lib/config/configitembuilder.hpp
lib/config/expression.cpp
lib/config/expression.hpp
lib/config/vmops.hpp
lib/icinga/dependency-apply.cpp
lib/icinga/icinga-itl.conf
lib/icinga/notification-apply.cpp
lib/icinga/scheduleddowntime-apply.cpp
lib/icinga/service-apply.cpp
lib/methods/methods-itl.conf

index 5195745ddd35b24ee7b50b426c38129bf640ab58..ae5efd9b635ea5c3445663d78f45e4c5e8db1d03 100644 (file)
@@ -27,24 +27,32 @@ Command template for check plugins executed by Icinga 2.
 
 The `plugin-check-command` command does not support any vars.
 
+By default this template is automatically imported into all CheckCommand definitions.
+
 ### <a id="itl-plugin-notification-command"></a> plugin-notification-command
 
 Command template for notification scripts executed by Icinga 2.
 
 The `plugin-notification-command` command does not support any vars.
 
+By default this template is automatically imported into all CheckCommand definitions.
+
 ### <a id="itl-plugin-event-command"></a> plugin-event-command
 
 Command template for event handler scripts executed by Icinga 2.
 
 The `plugin-event-command` command does not support any vars.
 
+By default this template is automatically imported into all CheckCommand definitions.
+
 ### <a id="itl-legacy-timeperiod"></a> legacy-timeperiod
 
 Timeperiod template for [Timeperiod objects](9-object-types.md#objecttype-timeperiod).
 
 The `legacy-timeperiod` timeperiod does not support any vars.
 
+By default this template is automatically imported into all CheckCommand definitions.
+
 ## <a id="itl-check-commands"></a> Check Commands
 
 These check commands are embedded into Icinga 2 and do not require any external
index 8fa430ee8f1d288077225658ec95bff412fe43ec..b29d96de0c856d0d15d9e98e49c79af683d247ad 100644 (file)
@@ -344,6 +344,19 @@ custom attributes and the custom attribute `colour` has the value `"blue"`.
 Parent objects are resolved in the order they're specified using the
 `import` keyword.
 
+Default templates which are automatically imported into all object definitions
+can be specified using the `default` keyword:
+
+    template CheckCommand "plugin-check-command" default {
+      // ...
+    }
+
+Default templates are imported before any other user-specified statement in an
+object definition is evaluated.
+
+If there are multiple default templates the order in which they are imported
+is unspecified.
+
 ## <a id="constants"></a> Constants
 
 Global constants can be set using the `const` keyword:
index 47588802696683d6dd69c6fb5effda6aeada8ad9..ab352e8557a6476059b5f16a9e3d7e8dd9b8b908 100644 (file)
@@ -153,8 +153,6 @@ are referenced as `$ARGn$` where `n` is the argument counter.
 While you could manually migrate this like (please note the new generic command arguments and default argument values!):
 
     object CheckCommand "my-ping-check" {
-      import "plugin-check-command"
-
       command = [
         PluginDir + "/check_ping", "-4"
       ]
@@ -233,7 +231,6 @@ Custom variables from Icinga 1.x are available as Icinga 2 custom attributes.
 Can be written as the following in Icinga 2:
 
     object CheckCommand "test_customvar" {
-      import "plugin-check-command"
       command = "echo "Host CV: $host.vars.CVTEST$ Service CV: $service.vars.CVTEST$\n""
     }
 
index 4a0117d8262e05947234c90bdbea70b04319a3dc..a6aa6bb86b0884a139c832a448925a3309f4463f 100644 (file)
@@ -163,8 +163,6 @@ The special case here is that whenever Icinga 2 needs the value for such a custo
 the function and uses whatever value the function returns:
 
     object CheckCommand "random-value" {
-      import "plugin-check-command"
-
       command = [ PluginDir + "/check_dummy", "0", "$text$" ]
 
       vars.text = {{ Math.random() * 100 }}
@@ -229,8 +227,6 @@ are used in command definitions to figure out which IP address a check should be
 run against:
 
     object CheckCommand "my-ping" {
-      import "plugin-check-command"
-
       command = [ PluginDir + "/check_ping", "-H", "$ping_address$" ]
 
       arguments = {
@@ -1238,9 +1234,6 @@ using the `check_command` attribute.
 
 #### <a id="command-plugin-integration"></a> Integrate the Plugin with a CheckCommand Definition
 
-[CheckCommand](9-object-types.md#objecttype-checkcommand) objects require the [ITL template](10-icinga-template-library.md#itl-plugin-check-command)
-`plugin-check-command` to support native plugin based check methods.
-
 Unless you have done so already, download your check plugin and put it
 into the [PluginDir](4-configuring-icinga-2.md#constants-conf) directory. The following example uses the
 `check_mysql` plugin contained in the Monitoring Plugins package.
@@ -1299,8 +1292,6 @@ can also be inherited from a parent template using additive inheritance (`+=`).
     # vim /etc/icinga2/conf.d/commands.conf
 
     object CheckCommand "my-mysql" {
-      import "plugin-check-command"
-
       command = [ PluginDir + "/check_mysql" ] //constants.conf -> const PluginDir
 
       arguments = {
@@ -1426,8 +1417,6 @@ at command execution. Or making arguments optional -- only set if the
 macro value can be resolved by Icinga 2.
 
     object CheckCommand "check_http" {
-      import "plugin-check-command"
-
       command = [ PluginDir + "/check_http" ]
 
       arguments = {
@@ -1490,8 +1479,6 @@ This is useful for example for hiding sensitive information on the command line
 when passing credentials to database checks:
 
     object CheckCommand "mysql-health" {
-      import "plugin-check-command"
-
       command = [
         PluginDir + "/check_mysql"
       ]
@@ -1520,9 +1507,6 @@ interfaces (email, XMPP, IRC, Twitter, etc.).
 [NotificationCommand](9-object-types.md#objecttype-notificationcommand) objects are referenced by
 [Notification](9-object-types.md#objecttype-notification) objects using the `command` attribute.
 
-`NotificationCommand` objects require the [ITL template](10-icinga-template-library.md#itl-plugin-notification-command)
-`plugin-notification-command` to support native plugin-based notifications.
-
 > **Note**
 >
 > Make sure that the [notification](11-cli-commands.md#enable-features) feature is enabled
@@ -1536,8 +1520,6 @@ If you want to specify default values for some of the custom attribute definitio
 you can add a `vars` dictionary as shown for the `CheckCommand` object.
 
     object NotificationCommand "mail-service-notification" {
-      import "plugin-notification-command"
-
       command = [ SysconfDir + "/icinga2/scripts/mail-notification.sh" ]
 
       env = {
@@ -1618,9 +1600,6 @@ Common use case scenarios are a failing HTTP check requiring an immediate
 restart via event command, or if an application is locked and requires
 a restart upon detection.
 
-`EventCommand` objects require the ITL template `plugin-event-command`
-to support native plugin based checks.
-
 #### <a id="event-command-restart-service-daemon"></a> Use Event Commands to Restart Service Daemon
 
 The following example will trigger a restart of the `httpd` daemon
@@ -1647,8 +1626,6 @@ which can be used for all event commands triggered using ssh:
 
     /* pass event commands through ssh */
     object EventCommand "event_by_ssh" {
-      import "plugin-event-command"
-
       command = [ PluginDir + "/check_by_ssh" ]
 
       arguments = {
index 9ce56f491569deebcb0a03221dc9b2aca5d323d5..d1a96d86faccfdbc02a2acda962c08053cffef44 100644 (file)
@@ -58,7 +58,6 @@ into your host and service objects.
 
 Please make sure to follow these conventions when adding a new command object definition:
 
-* Always import the `plugin-check-command` template.
 * Use [command arguments](3-monitoring-basics.md#command-arguments) whenever possible. The `command` attribute
 must be an array in `[ ... ]` for shell escaping.
 * Define a unique `prefix` for the command's specific arguments. That way you can safely
@@ -69,8 +68,6 @@ set them on host/service level and you'll always know which command they control
 This is an example for a custom `my-snmp-int` check command:
 
     object CheckCommand "my-snmp-int" {
-      import "plugin-check-command"
-
       command = [ CustomPluginDir + "/check_snmp_int.pl" ]
 
       arguments = {
index 6c75b5a516f7e1f1d942c8627da4dc33f8e6dc02..ffa7d96674bc5ddb1af7e03f732c572f0b21c5ae 100644 (file)
@@ -658,8 +658,6 @@ If you have your own custom `CheckCommand` definition, add it to the global zone
     [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/global-templates/commands.conf
 
     object CheckCommand "my-cmd" {
-      import "plugin-check-command"
-
       //...
     }
 
@@ -1565,8 +1563,6 @@ Next, add a new check command, for example:
     [root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/global-templates/commands.conf
 
     object CheckCommand "my-cmd" {
-      import "plugin-check-command"
-
       //...
     }
 
index 70fbd23b1a660be3ed737594a54228911f787e4d..ebeb8884be04972ef18005e4c1a1932b47633838 100644 (file)
@@ -211,8 +211,6 @@ match your Icinga convention.
 Add an `EventCommand` configuration object for the passive service auto reset event.
 
     object EventCommand "coldstart-reset-event" {
-      import "plugin-event-command"
-
       command = [ SysconfDir + "/icinga2/conf.d/custom/scripts/coldstart_reset_event.sh" ]
 
       arguments = {
index 68a4c02657aa0a6af58f6c0389726e5e0a3fc9e0..45d1b4e8c4a5eebcc18cb725ce529b54ce0b4508 100644 (file)
@@ -323,7 +323,6 @@ and evaluating the host custom attribute `compellent` containing the `disks` thi
 solved like this:
 
     object CheckCommand "check_compellent" {
-      import "plugin-check-command"
       command   = [ "/usr/bin/check_compellent" ]
       arguments   = {
         "--disks"  = {
@@ -410,7 +409,6 @@ returned.
 You can omit the `log()` calls, they only help debugging.
 
     object NotificationCommand "mail-host-notification-test" {
-      import "plugin-notification-command"
       command = {{
         log("command as function")
         var mailscript = "mail-host-notification-long.sh"
index 6656362621fc811436dd78c85a9bbc6edc05ef8a..fbcd8e1ce9279af8186d9591cb26b4a5bda48839 100644 (file)
@@ -84,8 +84,6 @@ defined here.
 Example:
 
     object CheckCommand "check_http" {
-      import "plugin-check-command"
-
       command = [ PluginDir + "/check_http" ]
 
       arguments = {
@@ -122,7 +120,7 @@ Configuration Attributes:
 
   Name            |Description
   ----------------|----------------
-  execute         |**Required.** The "execute" script method takes care of executing the check. In virtually all cases you should import the "plugin-check-command" template to take care of this setting.
+  execute         |**Required.** The "execute" script method takes care of executing the check. The default template "plugin-check-command" which is imported into all CheckCommand objects takes care of this setting.
   command         |**Required.** The command. This can either be an array of individual command arguments. Alternatively a string can be specified in which case the shell interpreter (usually /bin/sh) takes care of parsing the command. When using the "arguments" attribute this must be an array. Can be specified as function for advanced implementations.
   env             |**Optional.** A dictionary of macros which should be exported as environment variables prior to executing the command.
   vars            |**Optional.** A dictionary containing custom attributes that are specific to this command.
@@ -441,8 +439,6 @@ An event command definition.
 Example:
 
     object EventCommand "restart-httpd-event" {
-      import "plugin-event-command"
-
       command = "/opt/bin/restart-httpd.sh"
     }
 
@@ -451,7 +447,7 @@ Configuration Attributes:
 
   Name            |Description
   ----------------|----------------
-  execute         |**Required.** The "execute" script method takes care of executing the event handler. In virtually all cases you should import the "plugin-event-command" template to take care of this setting.
+  execute         |**Required.** The "execute" script method takes care of executing the event handler. The default template "plugin-event-command" which is imported into all CheckCommand objects takes care of this setting.
   command         |**Required.** The command. This can either be an array of individual command arguments. Alternatively a string can be specified in which case the shell interpreter (usually /bin/sh) takes care of parsing the command.
   env             |**Optional.** A dictionary of macros which should be exported as environment variables prior to executing the command.
   vars            |**Optional.** A dictionary containing custom attributes that are specific to this command.
@@ -1087,8 +1083,6 @@ A notification command definition.
 Example:
 
     object NotificationCommand "mail-service-notification" {
-      import "plugin-notification-command"
-
       command = [
         SysconfDir + "/icinga2/scripts/mail-notification.sh"
       ]
@@ -1113,7 +1107,7 @@ Configuration Attributes:
 
   Name            |Description
   ----------------|----------------
-  execute         |**Required.** The "execute" script method takes care of executing the notification. In virtually all cases you should import the "plugin-notification-command" template to take care of this setting.
+  execute         |**Required.** The "execute" script method takes care of executing the notification. The default template "plugin-notification-command" which is imported into all CheckCommand objects takes care of this setting.
   command         |**Required.** The command. This can either be an array of individual command arguments. Alternatively a string can be specified in which case the shell interpreter (usually /bin/sh) takes care of parsing the command.
   env             |**Optional.** A dictionary of macros which should be exported as environment variables prior to executing the command.
   vars            |**Optional.** A dictionary containing custom attributes that are specific to this command.
index f39cfcd53dfe81f06ce90ed62c381b4871ac630e..e97b087afeb89767d225ebfdcfdfbe4766d87b93 100644 (file)
@@ -1,8 +1,6 @@
 /* Command objects */
 
 object NotificationCommand "mail-host-notification" {
-  import "plugin-notification-command"
-
   command = [ SysconfDir + "/icinga2/scripts/mail-host-notification.sh" ]
 
   env = {
@@ -20,8 +18,6 @@ object NotificationCommand "mail-host-notification" {
 }
 
 object NotificationCommand "mail-service-notification" {
-  import "plugin-notification-command"
-
   command = [ SysconfDir + "/icinga2/scripts/mail-service-notification.sh" ]
 
   env = {
index f38f1830f6ff3139ca5ee62603c0bdb0c8d57d2a..68b7ff91116faa2774490049d93807c705d321ba 100644 (file)
@@ -22,8 +22,6 @@ if (!globals.contains("NscpPath")) {
 }
 
 object CheckCommand "nscp-local" {
-       import  "plugin-check-command"
-
        command = [ NscpPath + "\\nscp.exe", "client" ]
 
        arguments = {
index 1ddb81db3711cf6b4c00f44d1ae616f083d32df1..73dd4bcc64ae732b086d4f733c3f67d46bcb99b6 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 template CheckCommand "snmp-manubulon-command" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        arguments = {
index 3fb9aa3cd4c834673424eca70b4d89be1d95f71f..77dcec3c089198f704a82a3a45e586cc33d31d9e 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "disk-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_disk.exe" ]
        
        arguments = {
@@ -51,8 +49,6 @@ object CheckCommand "disk-windows" {
 }
        
 object CheckCommand "load-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_load.exe" ]
        
        arguments = {
@@ -68,8 +64,6 @@ object CheckCommand "load-windows" {
 }
 
 object CheckCommand "memory-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_memory.exe" ]
        
        arguments = {
@@ -91,8 +85,6 @@ object CheckCommand "memory-windows" {
 }
 
 object CheckCommand "network-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_network.exe" ]
        
        arguments = {
@@ -108,8 +100,6 @@ object CheckCommand "network-windows" {
 }
 
 object CheckCommand "perfmon-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_perfmon.exe" ]
        
        arguments = {
@@ -143,8 +133,6 @@ object CheckCommand "perfmon-windows" {
 
 
 template CheckCommand "ping-common-windows" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_ping.exe" ]
 
        arguments = {
@@ -200,8 +188,6 @@ object CheckCommand "ping6-windows" {
 }
 
 object CheckCommand "procs-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_procs.exe" ]
        
        arguments = {
@@ -221,8 +207,6 @@ object CheckCommand "procs-windows" {
 }
 
 object CheckCommand "service-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_service.exe" ]
        
        arguments = {
@@ -239,8 +223,6 @@ object CheckCommand "service-windows" {
 }
 
 object CheckCommand "swap-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_swap.exe" ]
        
        arguments = {
@@ -263,8 +245,6 @@ object CheckCommand "swap-windows" {
 }
 
 object CheckCommand "update-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_update.exe" ]
        
        arguments = {
@@ -286,8 +266,6 @@ object CheckCommand "update-windows" {
 }
 
 object CheckCommand "uptime-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_uptime.exe" ]
        
        arguments = {
@@ -310,8 +288,6 @@ object CheckCommand "uptime-windows" {
 }
 
 object CheckCommand "users-windows" {
-       import "plugin-check-command"
-       
        command = [ PluginDir + "/check_users.exe" ]
        
        arguments = {
index a0c10926534a896e12355892c24e57e8b9e4b22b..445e6d5107dfca1ff7cc61a040475f8734f79a59 100644 (file)
@@ -34,8 +34,6 @@ template CheckCommand "ipv4-or-ipv6" {
 }
 
 template CheckCommand "ping-common" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_ping" ]
 
        arguments = {
@@ -99,8 +97,6 @@ object CheckCommand "hostalive6" {
 }
 
 template CheckCommand "fping-common" {
-       import "plugin-check-command"
-
        command = [
                PluginDir + "/check_fping",
                "$fping_address$"
@@ -142,8 +138,6 @@ object CheckCommand "fping6" {
 }
 
 object CheckCommand "dummy" {
-       import "plugin-check-command"
-
        command = [
                PluginDir + "/check_dummy",
                "$dummy_state$",
@@ -162,7 +156,6 @@ object CheckCommand "passive" {
 }
 
 object CheckCommand "tcp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_tcp" ]
@@ -266,7 +259,6 @@ object CheckCommand "tcp" {
 }
 
 object CheckCommand "ssl" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_tcp" ]
@@ -283,7 +275,6 @@ object CheckCommand "ssl" {
 }
 
 object CheckCommand "udp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [
@@ -318,7 +309,6 @@ object CheckCommand "udp" {
 }
 
 object CheckCommand "http" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_http" ]
@@ -477,7 +467,6 @@ object CheckCommand "http" {
 }
 
 object CheckCommand "ftp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ftp" ]
@@ -581,7 +570,6 @@ object CheckCommand "ftp" {
 }
 
 object CheckCommand "smtp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_smtp" ]
@@ -622,7 +610,6 @@ object CheckCommand "smtp" {
 }
 
 object CheckCommand "ssmtp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ssmtp" ]
@@ -670,7 +657,6 @@ object CheckCommand "ssmtp" {
 }
 
 object CheckCommand "imap" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_imap" ]
@@ -718,7 +704,6 @@ object CheckCommand "imap" {
 }
 
 object CheckCommand "simap" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_simap" ]
@@ -766,7 +751,6 @@ object CheckCommand "simap" {
 }
 
 object CheckCommand "pop" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_pop" ]
@@ -814,7 +798,6 @@ object CheckCommand "pop" {
 }
 
 object CheckCommand "spop" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_spop" ]
@@ -862,7 +845,6 @@ object CheckCommand "spop" {
 }
 
 object CheckCommand "ntp_time" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ntp_time" ]
@@ -894,7 +876,6 @@ object CheckCommand "ntp_time" {
 }
 
 object CheckCommand "ntp_peer" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ntp_peer" ]
@@ -927,7 +908,6 @@ object CheckCommand "ntp_peer" {
 }
 
 object CheckCommand "ssh" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ssh" ]
@@ -956,8 +936,6 @@ object CheckCommand "ssh" {
 }
 
 object CheckCommand "disk" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_disk" ]
 
        arguments = {
@@ -1115,8 +1093,6 @@ object CheckCommand "disk" {
 }
 
 object CheckCommand "disk_smb" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_disk_smb" ]
 
        arguments = {
@@ -1163,8 +1139,6 @@ object CheckCommand "disk_smb" {
 }
 
 object CheckCommand "users" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_users" ]
 
        arguments = {
@@ -1177,8 +1151,6 @@ object CheckCommand "users" {
 }
 
 object CheckCommand "procs" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_procs" ]
 
        arguments = {
@@ -1251,8 +1223,6 @@ object CheckCommand "procs" {
 }
 
 object CheckCommand "swap" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_swap" ]
 
        arguments = {
@@ -1287,8 +1257,6 @@ object CheckCommand "swap" {
 }
 
 object CheckCommand "load" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_load" ]
 
        arguments = {
@@ -1318,8 +1286,6 @@ object CheckCommand "load" {
 }
 
 object CheckCommand "snmp" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_snmp" ]
 
        arguments = {
@@ -1370,7 +1336,6 @@ object CheckCommand "snmp" {
 }
 
 object CheckCommand "snmpv3" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_snmp" ]
@@ -1467,8 +1432,6 @@ object CheckCommand "snmp-uptime" {
 }
 
 object CheckCommand "apt" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_apt" ]
 
        arguments = {
@@ -1506,8 +1469,6 @@ object CheckCommand "apt" {
 }
 
 object CheckCommand "dhcp" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_dhcp" ]
 
        arguments = {
@@ -1525,7 +1486,6 @@ object CheckCommand "dhcp" {
 }
 
 object CheckCommand "dns" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_dns" ]
@@ -1570,7 +1530,6 @@ object CheckCommand "dns" {
 }
 
 object CheckCommand "dig" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_dig" ]
@@ -1605,7 +1564,6 @@ object CheckCommand "dig" {
 }
 
 object CheckCommand "nscp" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_nt" ]
@@ -1638,7 +1596,6 @@ object CheckCommand "nscp" {
 }
 
 object CheckCommand "by_ssh" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_by_ssh" ]
@@ -1689,7 +1646,6 @@ object CheckCommand "by_ssh" {
 }
 
 object CheckCommand "ups" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ups" ]
@@ -1736,7 +1692,6 @@ object CheckCommand "ups" {
 }
 
 object CheckCommand "nrpe" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_nrpe" ]
@@ -1779,7 +1734,6 @@ object CheckCommand "nrpe" {
 }
 
 object CheckCommand "hpjd" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_hpjd" ]
@@ -1794,8 +1748,6 @@ object CheckCommand "hpjd" {
 }
 
 object CheckCommand "icmp" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_icmp" ]
 
        arguments = {
@@ -1823,7 +1775,6 @@ object CheckCommand "icmp" {
 }
 
 object CheckCommand "ldap" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_ldap" ]
@@ -1896,8 +1847,6 @@ object CheckCommand "ldap" {
 }
 
 object CheckCommand "clamd" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_clamd" ]
 
        arguments = {
@@ -2000,8 +1949,6 @@ object CheckCommand "clamd" {
 }
 
 object CheckCommand "mailq" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_mailq" ]
 
        arguments = {
@@ -2035,7 +1982,6 @@ object CheckCommand "mailq" {
 }
 
 object CheckCommand "pgsql" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_pgsql" ]
@@ -2059,7 +2005,6 @@ object CheckCommand "pgsql" {
 }
 
 object CheckCommand "mysql" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_mysql" ]
@@ -2095,8 +2040,6 @@ object CheckCommand "mysql" {
 }
 
 object CheckCommand "negate" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/negate" ]
 
        arguments = {
@@ -2132,8 +2075,6 @@ object CheckCommand "negate" {
 }
 
 object CheckCommand "file_age" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_file_age" ]
 
        arguments = {
@@ -2167,8 +2108,6 @@ object CheckCommand "file_age" {
 }
 
 object CheckCommand "smart" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_ide_smart" ]
 
        arguments = {
@@ -2181,7 +2120,6 @@ object CheckCommand "smart" {
 }
 
 object CheckCommand "breeze" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_breeze" ]
@@ -2214,8 +2152,6 @@ object CheckCommand "breeze" {
 }
 
 object CheckCommand "flexlm" {
-       import "plugin-check-command"
-
        command = [ PluginDir + "/check_flexlm" ]
 
        arguments = {
@@ -2232,7 +2168,6 @@ object CheckCommand "flexlm" {
 }
 
 object CheckCommand "game" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_game" ]
@@ -2282,7 +2217,6 @@ object CheckCommand "game" {
 }
 
 object CheckCommand "mysql_query" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginDir + "/check_mysql_query" ]
index 24b128bd541232c6d076df81a649e891746e5c77..9f3358cf0246b51f1ef0bf91655ee78c0fceb3cc 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "mssql_health" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_mssql_health" ]
 
        arguments = {
@@ -95,7 +93,6 @@ object CheckCommand "mssql_health" {
 }
 
 object CheckCommand "mysql_health" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_mysql_health" ]
@@ -247,8 +244,6 @@ object CheckCommand "mysql_health" {
 }
 
 object CheckCommand "db2_health" {
-        import "plugin-check-command"
-
         command = [ PluginContribDir + "/check_db2_health" ]
 
         arguments = {
@@ -338,8 +333,6 @@ object CheckCommand "db2_health" {
 }
 
 object CheckCommand "oracle_health" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_oracle_health" ]
 
        arguments = {
@@ -416,7 +409,6 @@ object CheckCommand "oracle_health" {
 }
 
 object CheckCommand "postgres" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_postgres.pl" ]
@@ -504,8 +496,6 @@ object CheckCommand "postgres" {
 }
 
 object CheckCommand "mongodb" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_mongodb.py" ]
 
        arguments = {
@@ -585,8 +575,6 @@ object CheckCommand "mongodb" {
 }
 
 object CheckCommand "elasticsearch" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_elasticsearch" ]
 
        arguments = {
@@ -621,8 +609,6 @@ object CheckCommand "elasticsearch" {
 }
 
 object CheckCommand "redis" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_redis.pl" ]
 
        arguments = {
index e3700a9b0e54ea8bcf5473c9718aa7b706f36cfa..9d8c0167c98dfd22b34532682e8e5ba676fa1c84 100644 (file)
@@ -18,7 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "hpasm" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_hpasm" ]
index 38d47a0af5861c9793e8a934a2cfbc66fa0dcc4b..52b948614e2e75f3e72c3c84753205c1367bcc52 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 template CheckCommand "icingacli" {
-       import "plugin-check-command"
-
        command = [ PrefixDir + "/bin/icingacli" ]
 }
 
index 6bb6d98124b22e9fe7120dd81b7bedf9b5ebf23e..a64b59ef5982e66571d1565e434ac1c1f0d87f78 100644 (file)
@@ -18,7 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "ipmi-sensor" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_ipmi_sensor" ]
index acfbf2f0ef202c22debe81f477b3ea2c95bf8fe9..4d3860890a5633f991acea8db196048d61806223 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "graphite" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_graphite" ]
 
        arguments = {
index 9c87296be464b903870c72d6d7b334233c1c1051..3cba2c7a64e4699d0eb983ed8c4e1184b4056eb1 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "interfacetable" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_interface_table_v3t" ]
 
        arguments = {
@@ -302,7 +300,6 @@ object CheckCommand "interfacetable" {
 }
 
 object CheckCommand "iftraffic" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_iftraffic.pl"]
@@ -351,7 +348,6 @@ object CheckCommand "iftraffic" {
 }
 
 object CheckCommand "iftraffic64" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_iftraffic64.pl"]
@@ -400,7 +396,6 @@ object CheckCommand "iftraffic64" {
 }
 
 object CheckCommand "interfaces" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_interfaces" ]
@@ -503,7 +498,6 @@ object CheckCommand "interfaces" {
 }
 
 object CheckCommand "nwc_health" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_nwc_health" ]
index 00cdf0984c2a4b70bfd336effa64ccdea1faa039..168f1fa4597cac01ece87ff0bf72f15fe863d68f 100644 (file)
@@ -18,7 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "kdc" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_kdc" ]
@@ -48,7 +47,6 @@ object CheckCommand "kdc" {
 }
 
 object CheckCommand "rbl" {
-       import "plugin-check-command"
        import "ipv4-or-ipv6"
 
        command = [ PluginContribDir + "/check_rbl" ]
index 5d47f5cba6fc77e54ea25e40861ac34560bdeac2..0fce013a69d46c60730db72e311561ecf5e399ef 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "mem" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_mem.pl" ]
 
        arguments = {
@@ -51,8 +49,6 @@ object CheckCommand "mem" {
 }
 
 object CheckCommand "running_kernel" {
-       import "plugin-check-command"
-
        command = {{
                var use_sudo = macro("$running_kernel_use_sudo$")
 
@@ -75,8 +71,6 @@ object CheckCommand "running_kernel" {
 }
 
 object CheckCommand "yum" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_yum" ]
 
        arguments = {
@@ -128,8 +122,6 @@ object CheckCommand "yum" {
 }
 
 object CheckCommand "iostat" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_iostat" ]
 
        arguments = {
index 035e4cad800b9675c095ee4052405b1bd8cec369..fa63432cf8caa3eeab3e3e38d5d3f54f4f4be9c9 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "esxi_hardware" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_esxi_hardware.py" ]
 
        arguments = {
index 406e6e4e85079115c1a716d89f8c1dbeec70ba40..caf7647f1b9b7cc5f220d7cc67fc13d1b90113f4 100644 (file)
@@ -22,8 +22,6 @@
  */
 
 template CheckCommand "vmware-esx-command" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_vmware_esx" ]
 
        arguments = {
index 9e2a785eff78113311d64808a07b764c67288508..e8999c0abac6f113ffa62c58e9d25b4c3f1f68bd 100644 (file)
@@ -18,8 +18,6 @@
  ******************************************************************************/
 
 object CheckCommand "webinject" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_webinject" ]
 
        arguments = {
@@ -63,8 +61,6 @@ object CheckCommand "webinject" {
 }
 
 object CheckCommand "jmx4perl" {
-       import "plugin-check-command"
-
        command = [ PluginContribDir + "/check_jmx4perl" ]
 
        arguments = {
index 5cd6013df0abcf91f676a909f7f225c4b0067ac9..124d5d79b0bd240bcae086222e48ee1ab0eeeaf6 100644 (file)
@@ -243,6 +243,7 @@ const std::vector<String>& ConfigWriter::GetKeywords(void)
                keywords.push_back("locals");
                keywords.push_back("use");
                keywords.push_back("__using");
+               keywords.push_back("default");
                keywords.push_back("ignore_on_error");
                keywords.push_back("current_filename");
                keywords.push_back("current_line");
index 8cac9f15772db2ba48886d4200343867b033c722..50614d18fa74cf2375ea2b1d3221d0384afa1570 100644 (file)
@@ -182,6 +182,7 @@ locals                              return T_LOCALS;
 use                            return T_USE;
 __using                                return T_USING;
 apply                          return T_APPLY;
+default                                return T_DEFAULT;
 to                             return T_TO;
 where                          return T_WHERE;
 import                         return T_IMPORT;
index 5d4d2b6f13ce89e39555a74a789bc6ffe70ac0b0..a7c9bc573152778f6a871f59a2104db9b0bbcbbc 100644 (file)
@@ -144,6 +144,7 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
 %token T_GLOBALS "globals (T_GLOBALS)"
 %token T_LOCALS "locals (T_LOCALS)"
 %token T_CONST "const (T_CONST)"
+%token T_DEFAULT "default (T_DEFAULT)"
 %token T_IGNORE_ON_ERROR "ignore_on_error (T_IGNORE_ON_ERROR)"
 %token T_CURRENT_FILENAME "current_filename (T_CURRENT_FILENAME)"
 %token T_CURRENT_LINE "current_line (T_CURRENT_LINE)"
@@ -199,6 +200,7 @@ static void MakeRBinaryOp(Expression** result, Expression *left, Expression *rig
 %type <expr> apply
 %type <expr> optional_rterm
 %type <text> target_type_specifier
+%type <boolean> default_specifier
 %type <boolean> ignore_specifier
 %type <cvlist> use_specifier
 %type <cvlist> use_specifier_items
@@ -370,7 +372,7 @@ object:
                context->m_Assign.push(0);
                context->m_Ignore.push(0);
        }
-       object_declaration identifier optional_rterm use_specifier ignore_specifier
+       object_declaration identifier optional_rterm use_specifier default_specifier ignore_specifier
        {
                BeginFlowControlBlock(context, FlowControlReturn, false);
        }
@@ -381,6 +383,10 @@ object:
                context->m_ObjectAssign.pop();
 
                bool abstract = $2;
+               bool defaultTmpl = $6;
+
+               if (!abstract && defaultTmpl)
+                       BOOST_THROW_EXCEPTION(ScriptError("'default' keyword is invalid for object definitions", DebugInfoRange(@2, @4)));
 
                String type = *$3;
                delete $3;
@@ -416,7 +422,7 @@ object:
                                BOOST_THROW_EXCEPTION(ScriptError("object rule 'ignore' is missing 'assign' for type '" + type + "'", DebugInfoRange(@2, @4)));
                }
 
-               $$ = new ObjectExpression(abstract, type, $4, filter, context->GetZone(), context->GetPackage(), $5, $6, $8, DebugInfoRange(@2, @6));
+               $$ = new ObjectExpression(abstract, type, $4, filter, context->GetZone(), context->GetPackage(), $5, $6, $7, $9, DebugInfoRange(@2, @7));
        }
        ;
 
@@ -1044,6 +1050,16 @@ target_type_specifier: /* empty */
        }
        ;
 
+default_specifier: /* empty */
+       {
+               $$ = false;
+       }
+       | T_DEFAULT
+       {
+               $$ = true;
+       }
+       ;
+
 ignore_specifier: /* empty */
        {
                $$ = false;
index 8b4f93ce3c2b9b1e2425c7bd252e473b797cd33b..19773843882ef1eea95826169df7f65ae80565d1 100644 (file)
@@ -59,11 +59,12 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, run_with_activation_context, &ConfigItem::R
  */
 ConfigItem::ConfigItem(const String& type, const String& name,
     bool abstract, const boost::shared_ptr<Expression>& exprl,
-    const boost::shared_ptr<Expression>& filter, bool ignoreOnError,
+    const boost::shared_ptr<Expression>& filter, bool defaultTmpl, bool ignoreOnError,
     const DebugInfo& debuginfo, const Dictionary::Ptr& scope,
     const String& zone, const String& package)
        : m_Type(type), m_Name(name), m_Abstract(abstract),
-         m_Expression(exprl), m_Filter(filter), m_IgnoreOnError(ignoreOnError),
+         m_Expression(exprl), m_Filter(filter),
+         m_DefaultTmpl(defaultTmpl), m_IgnoreOnError(ignoreOnError),
          m_DebugInfo(debuginfo), m_Scope(scope), m_Zone(zone),
          m_Package(package)
 {
@@ -99,6 +100,16 @@ bool ConfigItem::IsAbstract(void) const
        return m_Abstract;
 }
 
+bool ConfigItem::IsDefaultTemplate(void) const
+{
+       return m_DefaultTmpl;
+}
+
+bool ConfigItem::IsIgnoreOnError(void) const
+{
+       return m_IgnoreOnError;
+}
+
 /**
  * Retrieves the debug information for the configuration item.
  *
@@ -649,6 +660,26 @@ std::vector<ConfigItem::Ptr> ConfigItem::GetItems(const String& type)
        return items;
 }
 
+std::vector<ConfigItem::Ptr> ConfigItem::GetDefaultTemplates(const String& type)
+{
+       std::vector<ConfigItem::Ptr> items;
+
+       boost::mutex::scoped_lock lock(m_Mutex);
+
+       auto it = m_Items.find(type);
+
+       if (it == m_Items.end())
+               return items;
+
+       for (const ItemMap::value_type& kv : it->second)
+       {
+               if (kv.second->IsDefaultTemplate())
+                       items.push_back(kv.second);
+       }
+
+       return items;
+}
+
 void ConfigItem::RemoveIgnoredItems(const String& allowedConfigPath)
 {
        boost::mutex::scoped_lock lock(m_Mutex);
index 96e5e6ea487785f8c96d3aecc00ff75606516f6b..6cd80aa641ed2c0d8819aa604ecaef415abaa0e8 100644 (file)
@@ -43,14 +43,15 @@ public:
        ConfigItem(const String& type, const String& name, bool abstract,
            const boost::shared_ptr<Expression>& exprl,
            const boost::shared_ptr<Expression>& filter,
-           bool ignoreOnError, const DebugInfo& debuginfo,
+           bool defaultTmpl, bool ignoreOnError, const DebugInfo& debuginfo,
            const Dictionary::Ptr& scope, const String& zone,
            const String& package);
 
        String GetType(void) const;
        String GetName(void) const;
        bool IsAbstract(void) const;
-       bool GetIgnoreOnError(void) const;
+       bool IsDefaultTemplate(void) const;
+       bool IsIgnoreOnError(void) const;
 
        std::vector<ConfigItem::Ptr> GetParents(void) const;
 
@@ -74,6 +75,7 @@ public:
        static bool RunWithActivationContext(const Function::Ptr& function);
 
        static std::vector<ConfigItem::Ptr> GetItems(const String& type);
+       static std::vector<ConfigItem::Ptr> GetDefaultTemplates(const String& type);
 
        static void RemoveIgnoredItems(const String& allowedConfigPath);
 
@@ -84,6 +86,7 @@ private:
 
        boost::shared_ptr<Expression> m_Expression;
        boost::shared_ptr<Expression> m_Filter;
+       bool m_DefaultTmpl;
        bool m_IgnoreOnError;
        DebugInfo m_DebugInfo; /**< Debug information. */
        Dictionary::Ptr m_Scope; /**< variable scope. */
index f45128b1c53c6249f05b69ad90040a20ee8e7e0b..9f7637ddfc9e643a1357198b6d5b19c374110406 100644 (file)
@@ -79,6 +79,11 @@ void ConfigItemBuilder::SetFilter(const boost::shared_ptr<Expression>& filter)
        m_Filter = filter;
 }
 
+void ConfigItemBuilder::SetDefaultTemplate(bool defaultTmpl)
+{
+       m_DefaultTmpl = defaultTmpl;
+}
+
 void ConfigItemBuilder::SetIgnoreOnError(bool ignoreOnError)
 {
        m_IgnoreOnError = ignoreOnError;
@@ -119,10 +124,25 @@ ConfigItem::Ptr ConfigItemBuilder::Compile(void)
        dexpr->MakeInline();
        exprs.push_back(dexpr);
 
+#ifdef I2_DEBUG
+       if (!m_Abstract) {
+               bool foundDefaultImport = false;
+
+               for (Expression *expr : m_Expressions) {
+                       if (dynamic_cast<ImportDefaultTemplatesExpression *>(expr)) {
+                               foundDefaultImport = true;
+                               break;
+                       }
+               }
+
+               ASSERT(foundDefaultImport);
+       }
+#endif /* I2_DEBUG */
+
        boost::shared_ptr<DictExpression> exprl = boost::make_shared<DictExpression>(exprs, m_DebugInfo);
        exprl->MakeInline();
 
        return new ConfigItem(m_Type, m_Name, m_Abstract, exprl, m_Filter,
-           m_IgnoreOnError, m_DebugInfo, m_Scope, m_Zone, m_Package);
+           m_DefaultTmpl, m_IgnoreOnError, m_DebugInfo, m_Scope, m_Zone, m_Package);
 }
 
index 621699054f9f4e8db42afd3f67585a7534e25f0d..e4dbab17dcfa899a4dc99baec7c686f6bce3d02d 100644 (file)
@@ -48,6 +48,7 @@ public:
        void SetScope(const Dictionary::Ptr& scope);
        void SetZone(const String& zone);
        void SetPackage(const String& package);
+       void SetDefaultTemplate(bool defaultTmpl);
        void SetIgnoreOnError(bool ignoreOnError);
 
        void AddExpression(Expression *expr);
@@ -65,6 +66,7 @@ private:
        Dictionary::Ptr m_Scope; /**< variable scope. */
        String m_Zone; /**< The zone. */
        String m_Package; /**< The package name. */
+       bool m_DefaultTmpl;
        bool m_IgnoreOnError; /**< Whether the object should be ignored when an error occurs in one of the expressions. */
 };
 
index 392db1d6d8b06e8e57ad5e5bed13858d21e82bf0..c078c33f1671227917e607b942b4d89a687db24c 100644 (file)
@@ -761,6 +761,26 @@ ExpressionResult ImportExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhi
        return Empty;
 }
 
+ExpressionResult ImportDefaultTemplatesExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
+{
+       if (frame.Sandboxed)
+               BOOST_THROW_EXCEPTION(ScriptError("Imports are not allowed in sandbox mode.", m_DebugInfo));
+
+       String type = VMOps::GetField(frame.Self, "type", frame.Sandboxed, m_DebugInfo);
+
+       for (const ConfigItem::Ptr& item : ConfigItem::GetDefaultTemplates(type)) {
+               Dictionary::Ptr scope = item->GetScope();
+
+               if (scope)
+                       scope->CopyTo(frame.Locals);
+
+               ExpressionResult result = item->GetExpression()->Evaluate(frame, dhint);
+               CHECK_RESULT(result);
+       }
+
+       return Empty;
+}
+
 ExpressionResult FunctionExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
 {
        return VMOps::NewFunction(frame, m_Name, m_Args, m_ClosedVars, m_Expression);
@@ -793,7 +813,7 @@ ExpressionResult ObjectExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhi
        }
 
        return VMOps::NewObject(frame, m_Abstract, m_Type, name, m_Filter, m_Zone,
-           m_Package, m_IgnoreOnError, m_ClosedVars, m_Expression, m_DebugInfo);
+           m_Package, m_DefaultTmpl, m_IgnoreOnError, m_ClosedVars, m_Expression, m_DebugInfo);
 }
 
 ExpressionResult ForExpression::DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const
index 84cf464c7d07f7ad3a9469de188ab80e2308b050..dcde002cd2a4f4423a31942cb6bb174ba94c1f51 100644 (file)
@@ -800,6 +800,17 @@ private:
        Expression *m_Name;
 };
 
+class I2_CONFIG_API ImportDefaultTemplatesExpression : public DebuggableExpression
+{
+public:
+       ImportDefaultTemplatesExpression(const DebugInfo& debugInfo = DebugInfo())
+               : DebuggableExpression(debugInfo)
+       { }
+
+protected:
+       virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
+};
+
 class I2_CONFIG_API FunctionExpression : public DebuggableExpression
 {
 public:
@@ -879,9 +890,9 @@ class I2_CONFIG_API ObjectExpression : public DebuggableExpression
 public:
        ObjectExpression(bool abstract, const String& type, Expression *name, Expression *filter,
            const String& zone, const String& package, std::map<String, Expression *> *closedVars,
-           bool ignoreOnError, Expression *expression, const DebugInfo& debugInfo = DebugInfo())
+           bool defaultTmpl, bool ignoreOnError, Expression *expression, const DebugInfo& debugInfo = DebugInfo())
                : DebuggableExpression(debugInfo), m_Abstract(abstract), m_Type(type),
-                 m_Name(name), m_Filter(filter), m_Zone(zone), m_Package(package),
+                 m_Name(name), m_Filter(filter), m_Zone(zone), m_Package(package), m_DefaultTmpl(defaultTmpl),
                  m_IgnoreOnError(ignoreOnError), m_ClosedVars(closedVars), m_Expression(expression)
        { }
 
@@ -909,6 +920,7 @@ private:
        boost::shared_ptr<Expression> m_Filter;
        String m_Zone;
        String m_Package;
+       bool m_DefaultTmpl;
        bool m_IgnoreOnError;
        std::map<String, Expression *> *m_ClosedVars;
        boost::shared_ptr<Expression> m_Expression;
index 948cce1da7b4eb0b7ac9153fcdced9a94d79b7e3..fe557d07b388240cac62677d21f24e4354db31d0 100644 (file)
@@ -129,7 +129,7 @@ public:
        }
 
        static inline Value NewObject(ScriptFrame& frame, bool abstract, const String& type, const String& name, const boost::shared_ptr<Expression>& filter,
-               const String& zone, const String& package, bool ignoreOnError, std::map<String, Expression *> *closedVars, const boost::shared_ptr<Expression>& expression, const DebugInfo& debugInfo = DebugInfo())
+               const String& zone, const String& package, bool defaultTmpl, bool ignoreOnError, std::map<String, Expression *> *closedVars, const boost::shared_ptr<Expression>& expression, const DebugInfo& debugInfo = DebugInfo())
        {
                ConfigItemBuilder::Ptr item = new ConfigItemBuilder(debugInfo);
 
@@ -157,12 +157,16 @@ public:
                item->SetType(type);
                item->SetName(name);
 
+               if (!abstract)
+                       item->AddExpression(new ImportDefaultTemplatesExpression());
+
                item->AddExpression(new OwnedExpression(expression));
                item->SetAbstract(abstract);
                item->SetScope(EvaluateClosedVars(frame, closedVars));
                item->SetZone(zone);
                item->SetPackage(package);
                item->SetFilter(filter);
+               item->SetDefaultTemplate(defaultTmpl);
                item->SetIgnoreOnError(ignoreOnError);
                item->Compile()->Register();
 
index 7615776afca77e8866c5a565ed14ee5cb553ffe8..ec0548c931ae373c390f2d6a6d1c66cff763c381 100644 (file)
@@ -71,7 +71,9 @@ bool Dependency::EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, cons
                builder->AddExpression(new SetExpression(MakeIndexer(ScopeThis, "zone"), OpSetLiteral, MakeLiteral(zone), di));
 
        builder->AddExpression(new SetExpression(MakeIndexer(ScopeThis, "package"), OpSetLiteral, MakeLiteral(rule.GetPackage()), di));
-       
+
+       builder->AddExpression(new ImportDefaultTemplatesExpression());
+
        builder->AddExpression(new OwnedExpression(rule.GetExpression()));
 
        ConfigItem::Ptr dependencyItem = builder->Compile();
index 9c94dd06891ee6f7b8f4d54c0e2d25b5120f5302..769dba4904bc8658e82c074b140c0aa70cf9609e 100644 (file)
@@ -20,7 +20,7 @@
 System.assert(Internal.run_with_activation_context(function() {
        var _Internal = Internal.clone()
 
-       template TimePeriod "legacy-timeperiod" use (_Internal) {
+       template TimePeriod "legacy-timeperiod" use (_Internal) default {
                update = _Internal.LegacyTimePeriod
        }
 }))
index af77c2285662e1a56d900da40dabbbc0a7aac191..6f5fc2a8d96e36316102e544b5470ec3be67a89e 100644 (file)
@@ -73,6 +73,8 @@ bool Notification::EvaluateApplyRuleInstance(const Checkable::Ptr& checkable, co
 
        builder->AddExpression(new OwnedExpression(rule.GetExpression()));
 
+       builder->AddExpression(new ImportDefaultTemplatesExpression());
+
        ConfigItem::Ptr notificationItem = builder->Compile();
        notificationItem->Register();
 
index 6729587e590c66776c292a668a9001c2b5a43633..5bafe404e3fa52631d89ea130e45e5b2b6297bc0 100644 (file)
@@ -72,6 +72,8 @@ bool ScheduledDowntime::EvaluateApplyRuleInstance(const Checkable::Ptr& checkabl
 
        builder->AddExpression(new OwnedExpression(rule.GetExpression()));
 
+       builder->AddExpression(new ImportDefaultTemplatesExpression());
+
        ConfigItem::Ptr downtimeItem = builder->Compile();
        downtimeItem->Register();
 
index ac34327a2b16c1c7fcdede55e511d1668048946e..352bb49a83cf3d57fa85a9651617fcbaf88c6ec5 100644 (file)
@@ -66,6 +66,8 @@ bool Service::EvaluateApplyRuleInstance(const Host::Ptr& host, const String& nam
 
        builder->AddExpression(new OwnedExpression(rule.GetExpression()));
 
+       builder->AddExpression(new ImportDefaultTemplatesExpression());
+
        ConfigItem::Ptr serviceItem = builder->Compile();
        serviceItem->Register();
 
index 4e0c8929148346f0e907ef8346678acfdf82e855..c19bae311af30ac5476208724539d74a43c3788e 100644 (file)
@@ -32,7 +32,7 @@ System.assert(Internal.run_with_activation_context(function() {
                execute = _Internal.ClusterZoneCheck
        }
 
-       template CheckCommand "plugin-check-command" use (_Internal) {
+       template CheckCommand "plugin-check-command" use (_Internal) default {
                execute = _Internal.PluginCheck
        }
 
@@ -44,11 +44,11 @@ System.assert(Internal.run_with_activation_context(function() {
                }
        }
 
-       template NotificationCommand "plugin-notification-command" use (_Internal) {
+       template NotificationCommand "plugin-notification-command" use (_Internal) default {
                execute = _Internal.PluginNotification
        }
 
-       template EventCommand "plugin-event-command" use (_Internal) {
+       template EventCommand "plugin-event-command" use (_Internal) default {
                execute = _Internal.PluginEvent
        }