]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Use nix expressions to build monitoring list
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Mon, 2 Dec 2019 00:33:08 +0000 (01:33 +0100)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Mon, 2 Dec 2019 00:33:08 +0000 (01:33 +0100)
14 files changed:
modules/private/monitoring/conf/contacts.cfg [deleted file]
modules/private/monitoring/conf/hosts.cfg [deleted file]
modules/private/monitoring/conf/local_services.cfg [deleted file]
modules/private/monitoring/conf/notify.cfg [deleted file]
modules/private/monitoring/conf/objects.cfg [deleted file]
modules/private/monitoring/conf/services.cfg [deleted file]
modules/private/monitoring/conf/specific_backup-2.cfg [deleted file]
modules/private/monitoring/conf/specific_eldiron.cfg [deleted file]
modules/private/monitoring/conf/timeperiods.cfg [deleted file]
modules/private/monitoring/default.nix
modules/private/monitoring/objects_backup-2.nix [new file with mode: 0644]
modules/private/monitoring/objects_common.nix [new file with mode: 0644]
modules/private/monitoring/objects_eldiron.nix [new file with mode: 0644]
modules/private/monitoring/to_objects.nix [new file with mode: 0644]

diff --git a/modules/private/monitoring/conf/contacts.cfg b/modules/private/monitoring/conf/contacts.cfg
deleted file mode 100644 (file)
index b6ea84d..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-# vim: filetype=nagios
-
-# CONTACT GROUPS
-define contactgroup {
-  contactgroup_name              admins
-  alias                          Naemon Administrators
-#  members                        immae
-}
-
-# No contact, we go through master
-# define contact {
-#   contact_name                   immae
-#   alias                          Immae
-#   use                            generic-contact
-#   email                          xxxxxxxxxxxxxxxx
-# }
-# 
-# define contact {
-#   name                           generic-contact
-#   host_notification_commands     notify-host-by-email
-#   host_notification_options      d,u,r,f,s
-#   host_notification_period       24x7
-#   register                       0
-#   service_notification_commands  notify-service-by-email
-#   service_notification_options   w,u,c,r,f,s
-#   service_notification_period    24x7
-# }
-# 
-# define command {
-#   command_name                   notify-host-by-email
-#   command_line                   SERVICENOTIFICATIONID="$SERVICENOTIFICATIONID$" HOSTSTATE="$HOSTSTATE$" HOSTOUTPUT="$HOSTOUTPUT$" $USER2$/notify_by_email host "$NOTIFICATIONTYPE$" "$HOSTALIAS$" "$LONGDATETIME$" "$CONTACTEMAIL$" $OVE
-# #$OVE is to force naemon to run via shell instead of execve which fails here
-# }
-# 
-# # 'notify-service-by-email' command definition
-# define command {
-#   command_name                   notify-service-by-email
-#   command_line                   SERVICENOTIFICATIONID="$SERVICENOTIFICATIONID$" SERVICEDESC="$SERVICEDESC$" SERVICESTATE="$SERVICESTATE$" SERVICEOUTPUT="$SERVICEOUTPUT$" $USER2$/notify_by_email service "$NOTIFICATIONTYPE$" "$HOSTALIAS$" "$LONGDATETIME$" "$CONTACTEMAIL$" $OVE
-# #  command_line                   sudo /usr/bin/strace -o /tmp/foo -vf -s 256 -u naemon $USER2$/notify_by_email
-# #$OVE is to force naemon to run via shell instead of execve which fails here
-# }
diff --git a/modules/private/monitoring/conf/hosts.cfg b/modules/private/monitoring/conf/hosts.cfg
deleted file mode 100644 (file)
index d903b0a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# vim: filetype=nagios
-
-define host {
-  name                           generic-host
-  event_handler_enabled          1
-  flap_detection_enabled         1
-  notification_period            24x7
-  notifications_enabled          1
-  process_perf_data              1
-  register                       0
-  retain_nonstatus_information   1
-  retain_status_information      1
-}
-
-define host {
-  name                           linux-server
-  use                            generic-host
-  check_command                  check-host-alive
-  check_interval                 5
-  check_period                   24x7
-  contact_groups                 admins
-  max_check_attempts             10
-  notification_interval          120
-  notification_options           d,u,r,f
-  register                       0
-  retry_interval                 1
-}
-
-define command {
-  command_name                   check-host-alive
-  command_line                   $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
-}
diff --git a/modules/private/monitoring/conf/local_services.cfg b/modules/private/monitoring/conf/local_services.cfg
deleted file mode 100644 (file)
index 56bc8f6..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-# vim: filetype=nagios
-
-# System usage
-define service {
-  service_description            Size on root partition
-  use                            local-service
-  check_command                  check_local_disk!20%!10%!/
-}
-define command {
-  command_line                   $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
-  command_name                   check_local_disk
-}
-
-define service {
-  service_description            Total number of process
-  use                            local-service
-  check_command                  check_local_procs!250!400!RSZDT
-}
-define command {
-  command_line                   $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
-  command_name                   check_local_procs
-}
-
-define service {
-  service_description            Average load
-  use                            local-service
-  check_command                  check_local_load!8.0,8.0,8.0!10.0,10.0,10.0
-}
-define command {
-  command_line                   $USER1$/check_load -w $ARG1$ -c $ARG2$
-  command_name                   check_local_load
-}
-
-define service {
-  service_description            Swap usage
-  use                            local-service
-  check_command                  check_local_swap!20!10
-}
-define command {
-  command_line                   $USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$
-  command_name                   check_local_swap
-}
-
-define service {
-  service_description            Memory usage
-  use                            local-service
-  check_command                  check_memory!80!90
-}
-define command {
-  command_line                   $USER2$/check_mem.sh -w $ARG1$ -c $ARG2$
-  command_name                   check_memory
-}
-
-define command {
-  command_line                   $USER2$/check_command -c "$ARG1$" -s 0 -o "$ARG2$" $ARG3$
-  command_name                   check_command_output
-}
-
-# Network dependent local services
-define service {
-  service_description            NTP is activated and working
-  use                            local-service
-  check_command                  check_ntp
-}
-define command {
-  command_line                   $USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org
-  command_name                   check_ntp
-}
diff --git a/modules/private/monitoring/conf/notify.cfg b/modules/private/monitoring/conf/notify.cfg
deleted file mode 100644 (file)
index 63b380d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# vim: filetype=nagios
-
-define command {
-  command_line                   /etc/naemon/send_nrdp.sh -H "$HOSTADDRESS$" -s "$SERVICEDESC$" -S "$SERVICESTATEID$" -o "$SERVICEOUTPUT$"
-  command_name                   notify-master
-}
-
-
diff --git a/modules/private/monitoring/conf/objects.cfg b/modules/private/monitoring/conf/objects.cfg
deleted file mode 100644 (file)
index 653477f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-# vim: filetype=nagios
-
-define command {
-       command_line                   $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
-       command_name                   check-host-alive
-}
-
-define command {
-       command_line                   $USER2$/check_md_raid
-       command_name                   check_md_raid
-}
-
-define command {
-       command_line                   $USER2$/check_command -c "$ARG1$" -o "$ARG2$" $ARG3$
-       command_name                   check_command_output
-}
-
-
-define command {
-       command_line                   /usr/bin/sudo -u postgres $USER2$/check_postgres_replication "$ARG1$" "$ARG2$" "$ARG3$"
-       command_name                   check_postgresql_replication
-}
-
-define service {
-       ## --PUPPET_NAME-- (called '_naginator_name' in the manifest)                Databases are present in postgresql
-       active_checks_enabled          1
-       check_command                  check_command_output!psql -c 'select nspname from pg_catalog.pg_namespace'!public!-r postgres
-       check_freshness                0
-       check_interval                 5
-       check_period                   24x7
-       contact_groups                 admins
-       event_handler_enabled          1
-       flap_detection_enabled         1
-       host_name                      caldance-1.v.immae.eu
-       is_volatile                    0
-       max_check_attempts             4
-       notification_interval          60
-       notification_options           w,u,c,r
-       notification_period            24x7
-       notifications_enabled          0
-       obsess_over_service            1
-       passive_checks_enabled         1
-       process_perf_data              1
-       retain_nonstatus_information   1
-       retain_status_information      1
-       retry_interval                 1
-       service_description            Databases are present in postgresql
-}
-
-define command {
-       command_line                   $USER2$/check_last_file_date "$ARG1$" "$ARG2$" "$ARG3$"
-       command_name                   check_last_file_date
-}
-
-define command {
-       command_line                   $USER2$/check_date "$ARG1$" "$ARG2$" "$ARG3$"
-       command_name                   check_date
-}
-
-define service {
-       ## --PUPPET_NAME-- (called '_naginator_name' in the manifest)                Postgresql replication for backup-1 is up to date
-       active_checks_enabled          1
-       check_command                  check_postgresql_replication!backup-1!/run/postgresql!5432
-       check_freshness                0
-       check_interval                 5
-       check_period                   24x7
-       contact_groups                 admins
-       event_handler_enabled          1
-       flap_detection_enabled         1
-       host_name                      caldance-1.v.immae.eu
-       is_volatile                    0
-       max_check_attempts             4
-       notification_interval          60
-       notification_options           w,u,c,r
-       notification_period            24x7
-       notifications_enabled          0
-       obsess_over_service            1
-       passive_checks_enabled         1
-       process_perf_data              1
-       retain_nonstatus_information   1
-       retain_status_information      1
-       retry_interval                 1
-       service_description            Postgresql replication for backup-1 is up to date
-}
diff --git a/modules/private/monitoring/conf/services.cfg b/modules/private/monitoring/conf/services.cfg
deleted file mode 100644 (file)
index 0740dc7..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-# vim: filetype=nagios
-
-define service {
-  name                           generic-service
-  active_checks_enabled          1
-  check_freshness                0
-  check_interval                 10
-  check_period                   24x7
-  contact_groups                 admins
-  event_handler_enabled          1
-  flap_detection_enabled         1
-  is_volatile                    0
-  max_check_attempts             3
-  notification_interval          60
-  notification_options           w,u,c,r,f
-  notification_period            24x7
-  # no notification since we send them to master
-  notifications_enabled          0
-  obsess_over_service            1
-  passive_checks_enabled         1
-  process_perf_data              1
-  register                       0
-  retain_nonstatus_information   1
-  retain_status_information      1
-  retry_interval                 2
-}
-
diff --git a/modules/private/monitoring/conf/specific_backup-2.cfg b/modules/private/monitoring/conf/specific_backup-2.cfg
deleted file mode 100644 (file)
index ff91322..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# vim: filetype=nagios
-
-define service {
-  service_description    Size on /backup2 partition
-  check_command          check_local_disk!10%!5%!/backup2
-  use                    local-service
-}
-
-define command {
-  command_line           /run/wrappers/bin/sudo -u "$ARG3$" $USER2$/check_last_file_date "$ARG1$" "$ARG2$"
-  command_name           check_last_file_date
-}
-
-define service {
-  service_description    Last backup in /backup2/phare is not too old
-  check_command          check_last_file_date!/backup2/phare!14!backup
-  use                    local-service
-}
-
-define service {
-  service_description    Last backup in /backup2/immae_eu is not too old
-  check_command          check_last_file_date!/backup2/immae_eu!14!backup
-  use                    local-service
-}
-
-define service {
-  service_description    Last backup in /backup2/immae_fr is not too old
-  check_command          check_last_file_date!/backup2/immae_fr!14!backup
-  use                    local-service
-}
-
-define service {
-  service_description    Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old
-  check_command          check_last_file_date!/backup2/eldiron/postgresql_backup!7!postgres
-  use                    local-service
-}
diff --git a/modules/private/monitoring/conf/specific_eldiron.cfg b/modules/private/monitoring/conf/specific_eldiron.cfg
deleted file mode 100644 (file)
index fd5a43d..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# vim: filetype=nagios
-#
-define command {
-  command_line  /run/wrappers/bin/sudo -u postgres $USER2$/check_postgres_replication "$ARG1$" "$ARG2$" "$ARG3$"
-  command_name  check_postgresql_replication
-}
-
-define service {
-  service_description   Postgresql replication for backup-1 is up to date
-  check_command         check_postgresql_replication!backup-1!/run/postgresql!5432
-  use                   local-service
-}
-
-define service {
-  service_description   Postgresql replication for backup-2 is up to date
-  check_command         check_postgresql_replication!backup-2!/run/postgresql!5432
-  use                   local-service
-}
-
-define service {
-  service_description  mailq is empty
-  use                  local-service
-  check_command        check_mailq
-}
-
-define command {
-  command_name        check_mailq
-  command_line        $USER1$/check_mailq -s -w 1 -c 2
-}
diff --git a/modules/private/monitoring/conf/timeperiods.cfg b/modules/private/monitoring/conf/timeperiods.cfg
deleted file mode 100644 (file)
index 5ffe4ca..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# vim: filetype=nagios
-
-define timeperiod {
-  alias                          24 Hours A Day, 7 Days A Week
-  friday                         00:00-24:00
-  monday                         00:00-24:00
-  saturday                       00:00-24:00
-  sunday                         00:00-24:00
-  thursday                       00:00-24:00
-  timeperiod_name                24x7
-  tuesday                        00:00-24:00
-  wednesday                      00:00-24:00
-}
-
-
index 6062abab2e1689e5c02eb57983ad84f0c49e5273..0259cbfbc7623d1ee6cad9c5b0acaf7553999780 100644 (file)
@@ -17,42 +17,26 @@ let
       pkgs.postgresql
     ]}
     '';
-  defaultObjects =
-    let specific_file = ./conf + "/specific_" + name + ".cfg";
+  toObjects = pkgs.callPackage ./to_objects.nix {};
+  commonConfig = {
+    eldiron = {
+      processWarn = "250"; processAlert = "400";
+      loadWarn = "8.0"; loadAlert = "10.0";
+    };
+    backup-2 = {
+      processWarn = "50"; processAlert = "60";
+      loadWarn = "1.0"; loadAlert = "2.0";
+    };
+  };
+  commonObjects = pkgs.callPackage ./objects_common.nix ({
+    inherit hostFQDN;
+    sudo = "/run/wrappers/bin/sudo";
+  } // builtins.getAttr name commonConfig);
+  hostObjects =
+    let
+      specific_file = ./. + "/objects_" + name + ".nix";
     in
-        builtins.readFile ./conf/local_services.cfg
-      + builtins.readFile ./conf/timeperiods.cfg
-      + builtins.readFile ./conf/services.cfg
-      + builtins.readFile ./conf/contacts.cfg
-      + builtins.readFile ./conf/hosts.cfg
-      + ''
-        define command {
-          command_line       ${myplugins}/send_nrdp.sh -u "$USER200$" -t "$USER201$" -H "$HOSTADDRESS$" -s "$SERVICEDESC$" -S "$SERVICESTATEID$" -o "$SERVICEOUTPUT$"
-          command_name       notify-master
-        }
-        define service {
-          service_description  No mdadm array is degraded
-          use                  local-service
-          check_command        check_command_output!${pkgs.mdadm}/bin/mdadm --monitor --scan -1!^$!-s 0 -r root
-        }
-
-        define service {
-          name                local-service
-          use                 generic-service
-          host_name           ${hostFQDN}
-          check_interval      5
-          max_check_attempts  4
-          register            0
-          retry_interval      1
-        }
-        define host {
-          host_name           ${hostFQDN}
-          alias               ${hostFQDN}
-          address             ${hostFQDN}
-          use                 linux-server
-        }
-        ''
-      + lib.strings.optionalString (builtins.pathExists specific_file) (builtins.readFile specific_file);
+      lib.attrsets.optionalAttrs (builtins.pathExists specific_file) (pkgs.callPackage specific_file {});
 in
 {
   options = {
@@ -122,7 +106,7 @@ in
         $USER200$=${myconfig.env.monitoring.status_url}
         $USER201$=${myconfig.env.monitoring.status_token}
       '';
-      objectDefs = defaultObjects;
+      objectDefs = toObjects commonObjects + toObjects hostObjects;
     };
   };
 }
diff --git a/modules/private/monitoring/objects_backup-2.nix b/modules/private/monitoring/objects_backup-2.nix
new file mode 100644 (file)
index 0000000..b8ecb81
--- /dev/null
@@ -0,0 +1,30 @@
+{ ... }:
+{
+  service = [
+    {
+      service_description = "Size on /backup2 partition";
+      use = "local-service";
+      check_command = ["check_local_disk" "10%" "5%" "/backup2"];
+    }
+    {
+      service_description = "Last backup in /backup2/phare is not too old";
+      use = "local-service";
+      check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
+    }
+    {
+      service_description = "Last backup in /backup2/immae_eu is not too old";
+      use = "local-service";
+      check_command = ["check_last_file_date" "/backup2/immae_eu" "14" "backup"];
+    }
+    {
+      service_description = "Last backup in /backup2/immae_fr is not too old";
+      use = "local-service";
+      check_command = ["check_last_file_date" "/backup2/immae_fr" "14" "backup"];
+    }
+    {
+      service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
+      use = "local-service";
+      check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
+    }
+  ];
+}
diff --git a/modules/private/monitoring/objects_common.nix b/modules/private/monitoring/objects_common.nix
new file mode 100644 (file)
index 0000000..8466fdb
--- /dev/null
@@ -0,0 +1,179 @@
+{ hostFQDN
+, processWarn ? "250"
+, processAlert ? "400"
+, loadWarn ? "8.0"
+, loadAlert ? "10.0"
+, mdadm
+, sudo
+, ...
+}:
+{
+  host = {
+    "${hostFQDN}" = {
+      alias = hostFQDN;
+      address = hostFQDN;
+      use = "linux-server";
+    };
+  };
+  service = [
+    {
+      service_description = "Size on root partition";
+      use = "local-service";
+      check_command = ["check_local_disk" "20%" "10%" "/"];
+    }
+    {
+      service_description = "Total number of process";
+      use = "local-service";
+      check_command = [
+        "check_local_procs"
+        processWarn
+        processAlert
+        "RSZDT"
+      ];
+    }
+    {
+      service_description = "Average load";
+      use = "local-service";
+      check_command = [
+        "check_local_load"
+        "${loadWarn},${loadWarn},${loadWarn}"
+        "${loadAlert},${loadAlert},${loadAlert}"
+      ];
+    }
+    {
+      service_description = "Swap usage";
+      use = "local-service";
+      check_command = ["check_local_swap" "20" "10"];
+    }
+    {
+      service_description = "Memory usage";
+      use = "local-service";
+      check_command = ["check_memory" "80" "90"];
+    }
+    {
+      service_description = "NTP is activated and working";
+      use = "local-service";
+      check_command = ["check_ntp"];
+    }
+    {
+      service_description = "No mdadm array is degraded";
+      use = "local-service";
+      check_command = [
+        "check_command_output"
+        "${mdadm}/bin/mdadm --monitor --scan -1"
+        "^$"
+        "-s 0 -r root"
+      ];
+    }
+  ];
+  command = {
+    check_local_disk = "$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$";
+    check_local_procs = "$USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$";
+    check_local_load = "$USER1$/check_load -w $ARG1$ -c $ARG2$";
+    check_local_swap = "$USER1$/check_swap -n ok -w $ARG1$ -c $ARG2$";
+    check_memory = "$USER2$/check_mem.sh -w $ARG1$ -c $ARG2$";
+    check_command_output = "$USER2$/check_command -c \"$ARG1$\" -s 0 -o \"$ARG2$\" $ARG3$";
+    check_ntp = "$USER1$/check_ntp_time -t 30 -q -H 0.arch.pool.ntp.org";
+    check_postgresql_replication = "${sudo} -u postgres $USER2$/check_postgres_replication \"$ARG1$\" \"$ARG2$\" \"$ARG3$\"";
+    check_mailq = "$USER1$/check_mailq -s -w 1 -c 2";
+
+    check_host_alive = "$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5";
+    check_last_file_date = "${sudo} -u \"$ARG3$\" $USER2$/check_last_file_date \"$ARG1$\" \"$ARG2$\"";
+
+    #  No notify commands, we go through master
+    #  notify_host_by_email = "SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" HOSTSTATE=\"$HOSTSTATE$\" HOSTOUTPUT=\"$HOSTOUTPUT$\" $USER2$/notify_by_email host \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
+    #  #$OVE is to force naemon to run via shell instead of execve which fails here
+    #  notify_service_by_email = "SERVICENOTIFICATIONID=\"$SERVICENOTIFICATIONID$\" SERVICEDESC=\"$SERVICEDESC$\" SERVICESTATE=\"$SERVICESTATE$\" SERVICEOUTPUT=\"$SERVICEOUTPUT$\" $USER2$/notify_by_email service \"$NOTIFICATIONTYPE$\" \"$HOSTALIAS$\" \"$LONGDATETIME$\" \"$CONTACTEMAIL$\" $OVE";
+    #  #sudo /usr/bin/strace -o /tmp/foo -vf -s 256 -u naemon $USER2$/notify_by_email
+    #  #$OVE is to force naemon to run via shell instead of execve which fails here
+
+    notify-master = "$USER2$/send_nrdp.sh -u \"$USER200$\" -t \"$USER201$\" -H \"$HOSTADDRESS$\" -s \"$SERVICEDESC$\" -S \"$SERVICESTATEID$\" -o \"$SERVICEOUTPUT$\"";
+  };
+  timeperiod = {
+    "24x7" = {
+      alias = "24 Hours A Day, 7 Days A Week";
+      monday = "00:00-24:00";
+      tuesday = "00:00-24:00";
+      wednesday = "00:00-24:00";
+      thursday = "00:00-24:00";
+      friday = "00:00-24:00";
+      saturday = "00:00-24:00";
+      sunday = "00:00-24:00";
+    };
+  };
+  contactgroup = {
+    admins = { alias = "Naemon Administrators"; };
+  };
+  # No contact, we go through master
+  # contact = {
+  #   immae = {
+  #     alias = "Immae";
+  #     use = "generic-contact";
+  #     email = "xxxxxxxxxxxxxxxx";
+  #   };
+  # };
+  templates = {
+    service = {
+      generic-service = {
+        active_checks_enabled = "1";
+        check_freshness = "0";
+        check_interval = "10";
+        check_period = "24x7";
+        contact_groups = "admins";
+        event_handler_enabled = "1";
+        flap_detection_enabled = "1";
+        is_volatile = "0";
+        max_check_attempts = "3";
+        notification_interval = "60";
+        notification_options = "w,u,c,r,f,s";
+        notification_period = "24x7";
+        notifications_enabled = "0"; # no notification since we send them to master
+        obsess_over_service = "1";
+        passive_checks_enabled = "1";
+        process_perf_data = "1";
+        retain_nonstatus_information = "1";
+        retain_status_information = "1";
+        retry_interval = "2";
+      };
+      local-service = {
+        use = "generic-service";
+        host_name = hostFQDN;
+        check_interval = "5";
+        max_check_attempts = "4";
+        retry_interval = "1";
+      };
+    };
+    # No contact, we go through master
+    # contact = {
+    #   generic-contact = {
+    #     host_notification_commands = "notify_host_by_email";
+    #     host_notification_options = "d,u,r,f,s";
+    #     host_notification_period = "24x7";
+    #     service_notification_commands = "notify_service_by_email";
+    #     service_notification_options = "w,u,c,r,f,s";
+    #     service_notification_period = "24x7";
+    #   };
+    # };
+    host = {
+      generic-host = {
+        event_handler_enabled = "1";
+        flap_detection_enabled = "1";
+        notification_period = "24x7";
+        notifications_enabled = "1";
+        process_perf_data = "1";
+        retain_nonstatus_information = "1";
+        retain_status_information = "1";
+      };
+      linux-server = {
+        check_command = "check_host_alive";
+        check_interval = "5";
+        check_period = "24x7";
+        contact_groups = "admins";
+        max_check_attempts = "10";
+        notification_interval = "120";
+        notification_options = "d,u,r,f";
+        retry_interval = "1";
+      };
+    };
+  };
+}
diff --git a/modules/private/monitoring/objects_eldiron.nix b/modules/private/monitoring/objects_eldiron.nix
new file mode 100644 (file)
index 0000000..897fc15
--- /dev/null
@@ -0,0 +1,15 @@
+{ ... }:
+{
+  service = [
+    {
+      service_description = "Postgresql replication for backup-2 is up to date";
+      use = "local-service";
+      check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
+    }
+    {
+      service_description = "mailq is empty";
+      use = "local-service";
+      check_command = ["check_mailq"];
+    }
+  ];
+}
diff --git a/modules/private/monitoring/to_objects.nix b/modules/private/monitoring/to_objects.nix
new file mode 100644 (file)
index 0000000..5ad76e0
--- /dev/null
@@ -0,0 +1,67 @@
+{ lib }:
+  with lib.attrsets;
+  with lib.strings;
+  with lib.lists;
+  with lib.trivial;
+let
+  pad = width: str: let
+      padWidth = width - stringLength str;
+      padding = concatStrings (genList (const " ") padWidth);
+    in str + optionalString (padWidth > 0) padding;
+  toStr = k: v:
+    if k == "check_command" && builtins.isList v
+    then builtins.concatStringsSep "!" v
+    else v;
+
+  toService = service: ''
+    define service {
+    ${builtins.concatStringsSep "\n" (mapAttrsToList (k: v:
+      "  ${pad 30 k}   ${toStr k v}"
+    ) service)}
+    }
+    '';
+  toServices = services: builtins.concatStringsSep "\n" (map toService services);
+
+  toCommand = k: v: ''
+    define command {
+      ${pad 30 "command_name"}   ${k}
+      ${pad 30 "command_line"}   ${v}
+    }
+    '';
+  toCommands = a: builtins.concatStringsSep "\n" (mapAttrsToList toCommand a);
+
+  toOther = keyname: k: v: ''
+    define ${keyname} {
+      ${pad 30 "${keyname}_name"}   ${k}
+    ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
+      "  ${pad 30 kk}   ${vv}"
+    ) v)}
+    }
+    '';
+  toOthers = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toOther keyname) a);
+
+  toTemplate = keyname: k: v: ''
+    define ${keyname} {
+      ${pad 30 "name"}   ${k}
+      ${pad 30 "register"}   0
+    ${builtins.concatStringsSep "\n" (mapAttrsToList (kk: vv:
+      "  ${pad 30 kk}   ${vv}"
+    ) v)}
+    }
+    '';
+  toTemplates' = keyname: a: builtins.concatStringsSep "\n" (mapAttrsToList (toTemplate keyname) a);
+  toTemplates = v: builtins.concatStringsSep "\n" (mapAttrsToList toTemplates' v);
+
+  toObjects' = keyname: v:
+    if keyname == "service"
+      then toServices v
+    else if keyname == "command"
+      then toCommands v
+    else if keyname == "templates"
+      then toTemplates v
+    else if builtins.elem keyname ["host" "contactgroup" "contact" "timeperiod"]
+      then toOthers keyname v
+    else "";
+  toObjects = v: builtins.concatStringsSep "\n" (mapAttrsToList toObjects' v);
+in
+  toObjects