浏览代码

Transfer commit

Lukas Cerny 2 年之前
父节点
当前提交
61f8ecdc1b

+ 1 - 1
README.md

@@ -1,7 +1,7 @@
 ## Docker build
 ## Docker build
 
 
 * Docker build
 * Docker build
-```docker build -t watchdog --build-arg config_file=./config/foodie.yaml .```
+```docker build -t watchdog --build-arg config_file=./config/config.yaml .```
 
 
 * Docker save
 * Docker save
 ```docker save -o watchdog.tar watchdog```
 ```docker save -o watchdog.tar watchdog```

+ 105 - 25
config/config.yaml

@@ -1,9 +1,12 @@
+__variables:
+  &email_subject_format "[Watchdog] $group.name - $result - Report"
+
 general:
 general:
   firstStartAt: "00:20:00" # hh:mm:ss
   firstStartAt: "00:20:00" # hh:mm:ss
 
 
 emailServers:
 emailServers:
   lspEmail:
   lspEmail:
-    smtpHost: "10.0.0.100" # "mail.lesprojekt.cz"
+    smtpHost: "mail.lesprojekt.cz"
     smtpPort: 465
     smtpPort: 465
     authUsername: "watchdog@senslog.org"
     authUsername: "watchdog@senslog.org"
     authPassword: "5jspdD"
     authPassword: "5jspdD"
@@ -23,10 +26,10 @@ messageBrokers:
       messageTemplate: "default"
       messageTemplate: "default"
       senderEmail: "watchdog@senslog.org"
       senderEmail: "watchdog@senslog.org"
       recipientEmail:
       recipientEmail:
-#        - "luccerny@ntis.zcu.cz"
+        - "luccerny@ntis.zcu.cz"
         - "fialar@kgm.zcu.cz"
         - "fialar@kgm.zcu.cz"
         - "kepka@ccss.cz"
         - "kepka@ccss.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
   mikeEmail:
   mikeEmail:
     type: EMAIL
     type: EMAIL
@@ -37,7 +40,7 @@ messageBrokers:
       recipientEmail:
       recipientEmail:
         - "luccerny@ntis.zcu.cz"
         - "luccerny@ntis.zcu.cz"
         - "kepka@ccss.cz"
         - "kepka@ccss.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
   krivanekEmail:
   krivanekEmail:
     type: EMAIL
     type: EMAIL
@@ -46,9 +49,9 @@ messageBrokers:
       messageTemplate: "default"
       messageTemplate: "default"
       senderEmail: "watchdog@senslog.org"
       senderEmail: "watchdog@senslog.org"
       recipientEmail:
       recipientEmail:
-#        - "luccerny@ntis.zcu.cz"
+        - "luccerny@ntis.zcu.cz"
         - "krivanek@lesprojekt.cz"
         - "krivanek@lesprojekt.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
   lspServisEmail:
   lspServisEmail:
     type: EMAIL
     type: EMAIL
@@ -60,7 +63,7 @@ messageBrokers:
         - "luccerny@ntis.zcu.cz"
         - "luccerny@ntis.zcu.cz"
         - "servis@lesprojekt.cz"
         - "servis@lesprojekt.cz"
         - "kepka@ccss.cz"
         - "kepka@ccss.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
   lspInnovarEmail:
   lspInnovarEmail:
     type: EMAIL
     type: EMAIL
@@ -74,8 +77,9 @@ messageBrokers:
         - "kubicek@lesprojekt.cz"
         - "kubicek@lesprojekt.cz"
         - "charvat_junior@lesprojekt.cz"
         - "charvat_junior@lesprojekt.cz"
         - "maria.ruiperezgonzalez@wur.nl"
         - "maria.ruiperezgonzalez@wur.nl"
+        - "hazel.brown@afbini.gov.uk"
         - "luccerny@ntis.zcu.cz"
         - "luccerny@ntis.zcu.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
   lspOnlyServisEmail:
   lspOnlyServisEmail:
     type: EMAIL
     type: EMAIL
@@ -86,7 +90,7 @@ messageBrokers:
       recipientEmail:
       recipientEmail:
         - "luccerny@ntis.zcu.cz"
         - "luccerny@ntis.zcu.cz"
         - "servis@lesprojekt.cz"
         - "servis@lesprojekt.cz"
-      subject: "[Watchdog] Report SensLog (CZ) - $group.name"
+      subject: *email_subject_format
 
 
 dataProviders:
 dataProviders:
   wsSensLogKynsperk:
   wsSensLogKynsperk:
@@ -167,15 +171,13 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogKynsperk
     dataProvider: wsSensLogKynsperk
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
-    period: 86400
+#    period: 86400
 
 
   rostenice:
   rostenice:
     name: "Rostěnice"
     name: "Rostěnice"
     active: true
     active: true
     dataProvider: wsSensLogRostenice
     dataProvider: wsSensLogRostenice
     messageBroker: mikeEmail
     messageBroker: mikeEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   zcu:
   zcu:
@@ -183,7 +185,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogZcu
     dataProvider: wsSensLogZcu
     messageBroker: zcuOnlyEmail
     messageBroker: zcuOnlyEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   osek:
   osek:
@@ -191,7 +192,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogOsek
     dataProvider: wsSensLogOsek
     messageBroker: mikeEmail
     messageBroker: mikeEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   latviaSmiltene:
   latviaSmiltene:
@@ -199,7 +199,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogSmiltene
     dataProvider: wsSensLogSmiltene
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   latviaMengele:
   latviaMengele:
@@ -207,7 +206,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogMengele
     dataProvider: wsSensLogMengele
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   zabcice:
   zabcice:
@@ -215,7 +213,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogZabcice
     dataProvider: wsSensLogZabcice
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   innovar:
   innovar:
@@ -223,15 +220,13 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogInnovar
     dataProvider: wsSensLogInnovar
     messageBroker: lspInnovarEmail
     messageBroker: lspInnovarEmail
-    resultType: FAIL
-    period: 86400
+#    period: 86400
 
 
   zelenec:
   zelenec:
     name: "Zeleneč"
     name: "Zeleneč"
     active: true
     active: true
     dataProvider: wsSensLogZelenec
     dataProvider: wsSensLogZelenec
     messageBroker: krivanekEmail
     messageBroker: krivanekEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   cepirohy:
   cepirohy:
@@ -239,7 +234,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogCepirohy
     dataProvider: wsSensLogCepirohy
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   sanJuan:
   sanJuan:
@@ -247,7 +241,6 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogSanJuan
     dataProvider: wsSensLogSanJuan
     messageBroker: lspServisEmail
     messageBroker: lspServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
   svsmpSadky:
   svsmpSadky:
@@ -255,21 +248,18 @@ groups:
     active: true
     active: true
     dataProvider: wsSensLogSVSMP
     dataProvider: wsSensLogSVSMP
     messageBroker: lspOnlyServisEmail
     messageBroker: lspOnlyServisEmail
-    resultType: FAIL
     period: 86400
     period: 86400
 
 
 superGroups:
 superGroups:
 #  osek&zcu:
 #  osek&zcu:
 #    name: "Osek & ZČU Robčice"
 #    name: "Osek & ZČU Robčice"
 #    messageBroker: mikeEmail
 #    messageBroker: mikeEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #    groups: [ osek, zcu ]
 #    groups: [ osek, zcu ]
 
 
 #  lspService:
 #  lspService:
 #    name: "Latvia, Žabčice, InnoVar"
 #    name: "Latvia, Žabčice, InnoVar"
 #    messageBroker: lspServisEmail
 #    messageBroker: lspServisEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #    groups: [ latviaSmiltene, latviaMengele, zabcice, innovar ]
 #    groups: [ latviaSmiltene, latviaMengele, zabcice, innovar ]
 
 
@@ -278,8 +268,98 @@ monitoredObjects:
   1305167562258386:
   1305167562258386:
     period: 86400
     period: 86400
     groups: [ zcu ]
     groups: [ zcu ]
+    sensors: [340420000,410180000,460080000,460090000,340230001,470160000,
+              470170000,480080000,690020001,700020001,820010000,830010000,
+              840010000,840020000,470180000,620030000, 560030000]
+
+  1305167549144045:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
+
+  1305167549158198:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
+
+  1305167549180936:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
+
+  1305167549167886:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
+
+  1305167549167050:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
+
+  1305167549149707:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [ 540090004, 340370004 ]
   
   
   1305167549174391:
   1305167549174391:
     period: 86400
     period: 86400
     groups: [ osek ]
     groups: [ osek ]
     sensors: [ 470020001, 340070001, 490010001, 410050001, 470010001, 560030000, 360200000, 460010001, 480020001 ]
     sensors: [ 470020001, 340070001, 490010001, 410050001, 470010001, 560030000, 360200000, 460010001, 480020001 ]
+
+  866425039195757:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039158029:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039161742:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039158144:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039314978:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039304722:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039313046:
+    period: 86400
+    groups: [ innovar ]
+    sensors: [ 620030000, 480080000, 820010000, 830010000, 470160000, 470180000, 470170000, 340420000, 460080000, 460090000, 410180000, 840010000, 840020000, 580030001, 340500001, 700050002, 340520002, 700050003, 340520003, 700050004, 340520004, 710040005, 340540005, 530030000, 360200000 ]
+
+  866425039313665:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039195682:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039313509:
+    period: 259200  # 3 days
+    groups: [ innovar ]
+
+  862061046044177:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039194974:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039313202:
+    period: 86400
+    groups: [ innovar ]
+
+  866425039194545:
+    period: 86400
+    groups: [ innovar ]

+ 106 - 26
config/test-foodie.yaml

@@ -1,3 +1,6 @@
+__variables:
+  &email_subject_format "[Watchdog] $group.name - $result - Report"
+
 general:
 general:
   firstStartAt: "00:20:00" # hh:mm:ss
   firstStartAt: "00:20:00" # hh:mm:ss
 
 
@@ -24,7 +27,8 @@ messageBrokers:
       senderEmail: "watchdog@senslog.org"
       senderEmail: "watchdog@senslog.org"
       recipientEmail:
       recipientEmail:
         - "luccerny@ntis.zcu.cz"
         - "luccerny@ntis.zcu.cz"
-      subject: "[Watchdog] Test Report SensLog (CZ) - $group.name"
+     #   - "wopixe@volny.cz"
+      subject: *email_subject_format
 
 
 dataProviders:
 dataProviders:
   wsSensLogKynsperk:
   wsSensLogKynsperk:
@@ -106,15 +110,13 @@ groups:
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogKynsperk
 #    dataProvider: wsSensLogKynsperk
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
-#    period: 86400
+##    period: 86400
 
 
 #  rostenice:
 #  rostenice:
 #    name: "Rostěnice"
 #    name: "Rostěnice"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogRostenice
 #    dataProvider: wsSensLogRostenice
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #
 #
 #  zcu:
 #  zcu:
@@ -122,15 +124,13 @@ groups:
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogZcu
 #    dataProvider: wsSensLogZcu
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
-#
+
 #  osek:
 #  osek:
 #    name: "Osek"
 #    name: "Osek"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogOsek
 #    dataProvider: wsSensLogOsek
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #
 #
 #  latviaSmiltene:
 #  latviaSmiltene:
@@ -138,31 +138,34 @@ groups:
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogSmiltene
 #    dataProvider: wsSensLogSmiltene
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #
 #
 #  latviaMengele:
 #  latviaMengele:
-#    name: "Latvia Meņģele"
+#    name: "Latvia Meņgele"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogMengele
 #    dataProvider: wsSensLogMengele
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
-
+#
 #  zabcice:
 #  zabcice:
 #    name: "Žabčice"
 #    name: "Žabčice"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogZabcice
 #    dataProvider: wsSensLogZabcice
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 
 
+  innovar:
+    name: "InnoVar"
+    active: true
+    dataProvider: wsSensLogInnovar
+    messageBroker: testEmail
+#    period: 86400  # period is defined individually
+
 #  zelenec:
 #  zelenec:
 #    name: "Zeleneč"
 #    name: "Zeleneč"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogZelenec
 #    dataProvider: wsSensLogZelenec
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #
 #
 #  cepirohy:
 #  cepirohy:
@@ -170,7 +173,6 @@ groups:
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogCepirohy
 #    dataProvider: wsSensLogCepirohy
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #
 #
 #  sanJuan:
 #  sanJuan:
@@ -178,30 +180,19 @@ groups:
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogSanJuan
 #    dataProvider: wsSensLogSanJuan
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
-
-  innovar:
-    name: "InnoVar"
-    active: true
-    dataProvider: wsSensLogInnovar
-    messageBroker: testEmail
-    resultType: FAIL
-    period: 86400
-
+#
 #  svsmpSadky:
 #  svsmpSadky:
 #    name: "SVSMP Sádky"
 #    name: "SVSMP Sádky"
 #    active: true
 #    active: true
 #    dataProvider: wsSensLogSVSMP
 #    dataProvider: wsSensLogSVSMP
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 
 
 superGroups:
 superGroups:
 #  osek&zcu:
 #  osek&zcu:
 #    name: "ZČU Robčice"
 #    name: "ZČU Robčice"
 #    messageBroker: testEmail
 #    messageBroker: testEmail
-#    resultType: FAIL
 #    period: 86400
 #    period: 86400
 #    groups: [ zcu, osek ]
 #    groups: [ zcu, osek ]
 
 
@@ -215,6 +206,95 @@ monitoredObjects:
 #    period: 86400
 #    period: 86400
 #    groups: [ sanJuan ]
 #    groups: [ sanJuan ]
 
 
+  1305167549144045:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
+  1305167549158198:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
+  1305167549180936:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
+  1305167549167886:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
+  1305167549167050:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
+  1305167549149707:
+    period: 172800
+    groups: [ kynsperk ]
+    sensors: [540090004, 340370004]
+
 #  1305167562258386:
 #  1305167562258386:
 #    period: 86400
 #    period: 86400
 #    groups: [ zcu ]
 #    groups: [ zcu ]
+#    sensors: [340420000,410180000,460080000,460090000,340230001,470160000,
+#              470170000,480080000,690020001,700020001,820010000,830010000,
+#              840010000,840020000,470180000,620030000, 560030000]
+#
+#  866425039195757:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039158029:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039161742:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039158144:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039314978:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039304722:
+#    period: 86400
+#    groups: [ innovar ]
+#
+  866425039313046:
+    period: 86400
+    groups: [ innovar ]
+#
+#  866425039313665:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039195682:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039313509:
+#    period: 259200  # 3 days
+#    groups: [ innovar ]
+#
+#  862061046044177:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039194974:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039313202:
+#    period: 86400
+#    groups: [ innovar ]
+#
+#  866425039194545:
+#    period: 86400
+#    groups: [ innovar ]

+ 1 - 1
gradle.properties

@@ -1,3 +1,3 @@
 projectGroup=cz.senslog
 projectGroup=cz.senslog
 projectName=watchdog
 projectName=watchdog
-projectVersion=1.1.0
+projectVersion=1.1.1

+ 1 - 1
src/main/java/cz/senslog/watchdog/app/Application.java

@@ -26,7 +26,7 @@ public class Application extends Thread {
 
 
     private static final Logger logger = LogManager.getLogger(Application.class);
     private static final Logger logger = LogManager.getLogger(Application.class);
 
 
-    public static String COMPILED_VERSION = "1.1.0";
+    public static String COMPILED_VERSION = "1.1.1";
     public static String BUILD_VERSION = "unknown";
     public static String BUILD_VERSION = "unknown";
 
 
     private final Parameters params;
     private final Parameters params;

+ 26 - 0
src/main/java/cz/senslog/watchdog/config/ConfigOperationProperties.java

@@ -0,0 +1,26 @@
+package cz.senslog.watchdog.config;
+
+public enum ConfigOperationProperties {
+    GROUP_NAME  ("$group.name"),
+    RESULT      ("$result")
+
+
+    ;
+    private final String key;
+    ConfigOperationProperties(String key) {
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public static boolean isValid(String property) {
+        for (ConfigOperationProperties value : values()) {
+            if (value.key.equalsIgnoreCase(property)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 1 - 3
src/main/java/cz/senslog/watchdog/config/Configuration.java

@@ -138,8 +138,7 @@ public class Configuration {
                 }
                 }
                 GroupConfig gConfig = group.getConfig();
                 GroupConfig gConfig = group.getConfig();
                 GroupConfig newGConfig = new GroupConfig(gConfig.getId(), gConfig.getName(), true,
                 GroupConfig newGConfig = new GroupConfig(gConfig.getId(), gConfig.getName(), true,
-                        gConfig.getDataProviderId(), gConfig.getMessageBrokerId(),
-                        sGConfig.getResultType(), sGConfig.getPeriod()
+                        gConfig.getDataProviderId(), gConfig.getMessageBrokerId(), sGConfig.getPeriod()
                 );
                 );
 
 
                 executableSuperGroup.addNode(groupId, ExecutableGroup.copy(group, newGConfig));
                 executableSuperGroup.addNode(groupId, ExecutableGroup.copy(group, newGConfig));
@@ -274,7 +273,6 @@ public class Configuration {
             groups.put(id, new SuperGroupConfig(id,
             groups.put(id, new SuperGroupConfig(id,
                     groupConfig.getStringProperty("name"),
                     groupConfig.getStringProperty("name"),
                     groupConfig.getStringProperty("messageBroker"),
                     groupConfig.getStringProperty("messageBroker"),
-                    ResultType.of(groupConfig.getStringProperty("resultType")),
                     groupConfig.getOptionalProperty("period", Integer.class).orElse(null),
                     groupConfig.getOptionalProperty("period", Integer.class).orElse(null),
                     subGroupNames
                     subGroupNames
             ));
             ));

+ 1 - 1
src/main/java/cz/senslog/watchdog/config/ExecutableGroup.java

@@ -43,7 +43,7 @@ public class ExecutableGroup extends Graph<String, MonitoredObject> {
 
 
     public GroupConfig getConfig() {
     public GroupConfig getConfig() {
         return new GroupConfig(config.getId(), config.getName(), config.isActive(), config.getDataProviderId(),
         return new GroupConfig(config.getId(), config.getName(), config.isActive(), config.getDataProviderId(),
-                config.getMessageBrokerId(), config.getResultType(), root.getPeriod()
+                config.getMessageBrokerId(), root.getPeriod()
         );
         );
     }
     }
 }
 }

+ 1 - 8
src/main/java/cz/senslog/watchdog/config/GroupConfig.java

@@ -9,7 +9,6 @@ public class GroupConfig {
     private final boolean active;
     private final boolean active;
     private final String dataProviderId;
     private final String dataProviderId;
     private final String messageBrokerId;
     private final String messageBrokerId;
-    private final ResultType resultType;
     private final Integer period;
     private final Integer period;
 
 
     public static GroupConfig create(PropertyConfig config) {
     public static GroupConfig create(PropertyConfig config) {
@@ -18,19 +17,17 @@ public class GroupConfig {
                 config.getBooleanProperty("active"),
                 config.getBooleanProperty("active"),
                 config.getStringProperty("dataProvider"),
                 config.getStringProperty("dataProvider"),
                 config.getStringProperty("messageBroker"),
                 config.getStringProperty("messageBroker"),
-                ResultType.of(config.getStringProperty("resultType")),
                 config.getOptionalProperty("period", Integer.class).orElse(null)
                 config.getOptionalProperty("period", Integer.class).orElse(null)
 
 
         );
         );
     }
     }
 
 
-    public GroupConfig(String id, String name, boolean active, String dataProviderId, String messageBrokerId, ResultType resultType, Integer period) {
+    public GroupConfig(String id, String name, boolean active, String dataProviderId, String messageBrokerId, Integer period) {
         this.id = id;
         this.id = id;
         this.name = name;
         this.name = name;
         this.active = active;
         this.active = active;
         this.dataProviderId = dataProviderId;
         this.dataProviderId = dataProviderId;
         this.messageBrokerId = messageBrokerId;
         this.messageBrokerId = messageBrokerId;
-        this.resultType = resultType;
         this.period = period;
         this.period = period;
     }
     }
 
 
@@ -46,10 +43,6 @@ public class GroupConfig {
         return messageBrokerId;
         return messageBrokerId;
     }
     }
 
 
-    public ResultType getResultType() {
-        return resultType;
-    }
-
     public Integer getPeriod() {
     public Integer getPeriod() {
         return period;
         return period;
     }
     }

+ 0 - 10
src/main/java/cz/senslog/watchdog/config/ResultType.java

@@ -1,10 +0,0 @@
-package cz.senslog.watchdog.config;
-
-public enum ResultType {
-    ALL, FAIL
-
-    ;
-    public static ResultType of(String value) {
-        return valueOf(value.toUpperCase());
-    }
-}

+ 2 - 2
src/main/java/cz/senslog/watchdog/config/SuperGroupConfig.java

@@ -6,8 +6,8 @@ public class SuperGroupConfig extends GroupConfig {
 
 
     private final Set<String> groups;
     private final Set<String> groups;
 
 
-    public SuperGroupConfig(String id, String name, String messageBrokerId, ResultType resultType, Integer period, Set<String> groups) {
-        super(id, name, true, null, messageBrokerId, resultType, period);
+    public SuperGroupConfig(String id, String name, String messageBrokerId, Integer period, Set<String> groups) {
+        super(id, name, true, null, messageBrokerId, period);
         this.groups = groups;
         this.groups = groups;
     }
     }
 
 

+ 17 - 33
src/main/java/cz/senslog/watchdog/core/Watcher.java

@@ -1,6 +1,7 @@
 package cz.senslog.watchdog.core;
 package cz.senslog.watchdog.core;
 
 
 import cz.senslog.watchdog.config.AllMonitoredObjects;
 import cz.senslog.watchdog.config.AllMonitoredObjects;
+import cz.senslog.watchdog.config.ConfigOperationProperties;
 import cz.senslog.watchdog.config.ExecutableGroup;
 import cz.senslog.watchdog.config.ExecutableGroup;
 import cz.senslog.watchdog.config.MonitoredObject;
 import cz.senslog.watchdog.config.MonitoredObject;
 import cz.senslog.watchdog.core.adt.Node;
 import cz.senslog.watchdog.core.adt.Node;
@@ -17,6 +18,8 @@ import java.time.*;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.*;
 
 
+import static cz.senslog.watchdog.config.ConfigOperationProperties.GROUP_NAME;
+import static cz.senslog.watchdog.config.ConfigOperationProperties.RESULT;
 import static cz.senslog.watchdog.domain.StatusReport.*;
 import static cz.senslog.watchdog.domain.StatusReport.*;
 import static java.time.LocalDateTime.ofInstant;
 import static java.time.LocalDateTime.ofInstant;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.emptyList;
@@ -57,6 +60,7 @@ public final class Watcher {
 
 
         List<SimpleReport> reports = new ArrayList<>();
         List<SimpleReport> reports = new ArrayList<>();
         List<String> reportedMessages = new ArrayList<>();
         List<String> reportedMessages = new ArrayList<>();
+        StatusReport overallStatus = null;
 
 
         if (data.isErrorOccurred()) {
         if (data.isErrorOccurred()) {
             reportedMessages.addAll(data.getErrorMessages());
             reportedMessages.addAll(data.getErrorMessages());
@@ -73,18 +77,13 @@ public final class Watcher {
                         Node<String, ProvidedObject> pUnitNode = data.getNode(pUnitId);
                         Node<String, ProvidedObject> pUnitNode = data.getNode(pUnitId);
                         String unitName = pUnitNode.getValue().getName();
                         String unitName = pUnitNode.getValue().getName();
                         for (ProvidedObject pObject : pUnitNode.getValues()) {
                         for (ProvidedObject pObject : pUnitNode.getValues()) {
-                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
+                            StatusReport status = pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK;
+                            reports.add(new SimpleReport(new ObservationInfo(
                                     new Unit(Long.parseLong(pUnitId), unitName),
                                     new Unit(Long.parseLong(pUnitId), unitName),
                                     new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
                                     new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
                                     pObject.getTimestamp()
                                     pObject.getTimestamp()
-                            ),
-                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
-                            );
-
-                            // ResultType from config is ignored
-//                            if (isAllowedToReport(simpleReport)) {
-                                reports.add(simpleReport);
-//                            }
+                            ), status));
+                            overallStatus = status.compareSeverity(overallStatus);
                         }
                         }
                     }
                     }
                 } else if (!data.containsNode(unitId)) {
                 } else if (!data.containsNode(unitId)) {
@@ -100,43 +99,34 @@ public final class Watcher {
                                 singletonList(pUnitNode.getNode(mSensor.getId()).getValue()) : emptyList();
                                 singletonList(pUnitNode.getNode(mSensor.getId()).getValue()) : emptyList();
 
 
                         if (providedObjects.isEmpty()) {
                         if (providedObjects.isEmpty()) {
+                            StatusReport status = NO_DATA;
                             reports.add(new SimpleReport(new ObservationInfo(
                             reports.add(new SimpleReport(new ObservationInfo(
                                     new Unit(Long.parseLong(unitId), unitName),
                                     new Unit(Long.parseLong(unitId), unitName),
                                     new Sensor(Long.parseLong(mSensor.getId()), "unknown"),
                                     new Sensor(Long.parseLong(mSensor.getId()), "unknown"),
                                     null
                                     null
-                            ),
-                                    NO_DATA
-                            ));
+                            ), status));
+                            overallStatus = status.compareSeverity(overallStatus);
                         }
                         }
 
 
                         for (ProvidedObject pObject : providedObjects) {
                         for (ProvidedObject pObject : providedObjects) {
-                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
+                            StatusReport status = pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK;
+                            reports.add(new SimpleReport(new ObservationInfo(
                                     new Unit(Long.parseLong(unitId), unitName),
                                     new Unit(Long.parseLong(unitId), unitName),
                                     new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
                                     new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
                                     pObject.getTimestamp()
                                     pObject.getTimestamp()
-                            ),
-                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
-                            );
-
-                            // ResultType from config is ignored
-                         //   if (isAllowedToReport(simpleReport)) {
-                                reports.add(simpleReport);
-                       //     }
+                            ), status));
+                            overallStatus = status.compareSeverity(overallStatus);
                         }
                         }
                     }
                     }
                 }
                 }
             }
             }
-
-            if (reports.isEmpty()) {
-                reportedMessages.add("All sensors received data up to date.");
-            }
         }
         }
 
 
         Map<String, String> operationProperties = new HashMap<>();
         Map<String, String> operationProperties = new HashMap<>();
-        operationProperties.put("$group.name", group.getConfig().getName());
+        operationProperties.put(GROUP_NAME.getKey(), group.getConfig().getName());
 
 
         LocalDateTime reportCreated = ofInstant(now, ZoneId.systemDefault());
         LocalDateTime reportCreated = ofInstant(now, ZoneId.systemDefault());
-        messageBroker.send(new Report(reportCreated, reports, reportedMessages, operationProperties), status -> {
+        messageBroker.send(new Report(reportCreated, overallStatus, reports, reportedMessages, operationProperties), status -> {
             String brokerType = status.getBrokerName().toLowerCase();
             String brokerType = status.getBrokerName().toLowerCase();
             if (status.isSuccess()) {
             if (status.isSuccess()) {
                 logger.info("The report at '{}' was send via '{}' broker successfully for the group's name '{}'.",
                 logger.info("The report at '{}' was send via '{}' broker successfully for the group's name '{}'.",
@@ -149,10 +139,4 @@ public final class Watcher {
             }
             }
         });
         });
     }
     }
-
-
-    private boolean isAllowedToReport(SimpleReport report) {
-        if (report == null) { return false; }
-        return report.getStatus().ordinal() >= group.getConfig().getResultType().ordinal();
-    }
 }
 }

+ 42 - 36
src/main/java/cz/senslog/watchdog/domain/Report.java

@@ -1,36 +1,42 @@
-package cz.senslog.watchdog.domain;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-public class Report {
-
-    private final LocalDateTime created;
-    private final List<SimpleReport> reports;
-    private final List<String> messages;
-    private final Map<String, String> operationProperties;
-
-    public Report(LocalDateTime created, List<SimpleReport> reports, List<String> messages, Map<String, String> operationProperties) {
-        this.created = created;
-        this.reports = reports;
-        this.messages = messages;
-        this.operationProperties = operationProperties;
-    }
-
-    public LocalDateTime getCreated() {
-        return created;
-    }
-
-    public List<SimpleReport> getReports() {
-        return reports;
-    }
-
-    public List<String> getMessages() {
-        return messages;
-    }
-
-    public Map<String, String> getOperationProperties() {
-        return operationProperties;
-    }
-}
+package cz.senslog.watchdog.domain;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+public class Report {
+
+    private final LocalDateTime created;
+    private final List<SimpleReport> reports;
+    private final List<String> messages;
+    private final Map<String, String> operationProperties;
+    private final StatusReport status;
+
+    public Report(LocalDateTime created, StatusReport status, List<SimpleReport> reports, List<String> messages, Map<String, String> operationProperties) {
+        this.created = created;
+        this.status = status;
+        this.reports = reports;
+        this.messages = messages;
+        this.operationProperties = operationProperties;
+    }
+
+    public LocalDateTime getCreated() {
+        return created;
+    }
+
+    public StatusReport getStatus() {
+        return status;
+    }
+
+    public List<SimpleReport> getReports() {
+        return reports;
+    }
+
+    public List<String> getMessages() {
+        return messages;
+    }
+
+    public Map<String, String> getOperationProperties() {
+        return operationProperties;
+    }
+}

+ 18 - 5
src/main/java/cz/senslog/watchdog/domain/StatusReport.java

@@ -1,5 +1,18 @@
-package cz.senslog.watchdog.domain;
-
-public enum StatusReport {
-    OK, FAIL, NO_DATA
-}
+package cz.senslog.watchdog.domain;
+
+public enum StatusReport {
+    OK      (1),
+    NO_DATA (3),
+    FAIL    (5),
+
+
+    ;
+    private final int severity;
+    StatusReport(int severity) {
+        this.severity = severity;
+    }
+
+    public StatusReport compareSeverity(StatusReport status) {
+        return status == null || severity > status.severity ? this : status;
+    }
+}

+ 17 - 12
src/main/java/cz/senslog/watchdog/messagebroker/broker/EmailMessageBroker.java

@@ -1,5 +1,6 @@
 package cz.senslog.watchdog.messagebroker.broker;
 package cz.senslog.watchdog.messagebroker.broker;
 
 
+import cz.senslog.watchdog.config.ConfigOperationProperties;
 import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
 import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
 import cz.senslog.watchdog.core.connection.EmailServerConnection;
 import cz.senslog.watchdog.core.connection.EmailServerConnection;
 import cz.senslog.watchdog.domain.*;
 import cz.senslog.watchdog.domain.*;
@@ -16,12 +17,12 @@ import javax.mail.*;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
 
 
+import static cz.senslog.watchdog.config.ConfigOperationProperties.RESULT;
 import static cz.senslog.watchdog.config.MessageBrokerType.EMAIL;
 import static cz.senslog.watchdog.config.MessageBrokerType.EMAIL;
+import static cz.senslog.watchdog.domain.StatusReport.OK;
 
 
 public class EmailMessageBroker extends MultiMessageBroker {
 public class EmailMessageBroker extends MultiMessageBroker {
 
 
-    private static final String SUBSTITUTABLE_VARIABLE_PREFIX = "$";
-
     private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class);
     private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class);
 
 
     private final EmailServerConnection serverConnection;
     private final EmailServerConnection serverConnection;
@@ -41,6 +42,7 @@ public class EmailMessageBroker extends MultiMessageBroker {
         try {
         try {
             HtmlTemplate template = HtmlTemplateManager.getTemplate(messageConfig.getTemplateType());
             HtmlTemplate template = HtmlTemplateManager.getTemplate(messageConfig.getTemplateType());
             Report report = mergeReports(reports);
             Report report = mergeReports(reports);
+            report.getOperationProperties().put(RESULT.getKey(), report.getStatus().equals(OK) ? "Ok" : "Check");
             String reportMessage = template.createMessage(report);
             String reportMessage = template.createMessage(report);
             logger.info("Sending a message via email.");
             logger.info("Sending a message via email.");
             serverConnection.send(reportMessage, report.getOperationProperties(), messageConfig);
             serverConnection.send(reportMessage, report.getOperationProperties(), messageConfig);
@@ -59,22 +61,25 @@ public class EmailMessageBroker extends MultiMessageBroker {
         if (reports.length == 1) {
         if (reports.length == 1) {
             return reports[0];
             return reports[0];
         }
         }
-        Report newReport = new Report(reports[0].getCreated(), new ArrayList<>(), new ArrayList<>(), new HashMap<>());
+        List<SimpleReport> allSimpleReports = new ArrayList<>();
+        List<String> allMessages = new ArrayList<>();
+        Map<String, String> allOpVariables = new HashMap<>();
+        StatusReport allStatuses = reports[0].getStatus();
+
         for (Report report : reports) {
         for (Report report : reports) {
-            newReport.getReports().addAll(report.getReports());
-            newReport.getMessages().addAll(report.getMessages());
-            Map<String, String> opVar = newReport.getOperationProperties();
+            allSimpleReports.addAll(report.getReports());
+            allMessages.addAll(report.getMessages());
             for (Map.Entry<String, String> entry : report.getOperationProperties().entrySet()) {
             for (Map.Entry<String, String> entry : report.getOperationProperties().entrySet()) {
-                if (entry.getKey().startsWith(SUBSTITUTABLE_VARIABLE_PREFIX)) {
-                    if (opVar.containsKey(entry.getKey())) {
-                        String oldValue = opVar.get(entry.getKey());
-                        opVar.put(entry.getKey(), oldValue + " & " + entry.getValue());
+                if (ConfigOperationProperties.isValid(entry.getKey())) {
+                    if (allOpVariables.containsKey(entry.getKey())) {
+                        String oldValue = allOpVariables.get(entry.getKey());
+                        allOpVariables.put(entry.getKey(), oldValue + " & " + entry.getValue());
                     } else {
                     } else {
-                        opVar.put(entry.getKey(), entry.getValue());
+                        allOpVariables.put(entry.getKey(), entry.getValue());
                     }
                     }
                 }
                 }
             }
             }
         }
         }
-        return newReport;
+        return new Report(reports[0].getCreated(), allStatuses, allSimpleReports, allMessages, allOpVariables);
     }
     }
 }
 }

+ 12 - 0
src/main/java/cz/senslog/watchdog/messagebroker/template/DefaultHtmlTemplate.java

@@ -64,6 +64,18 @@ public class DefaultHtmlTemplate extends HtmlTemplate {
         public boolean isHasSensors() {
         public boolean isHasSensors() {
             return !this.sensors.isEmpty();
             return !this.sensors.isEmpty();
         }
         }
+
+        public boolean isOk() {
+            return unit_result.equals(OK);
+        }
+
+        public boolean isFail() {
+            return unit_result.equals(FAIL);
+        }
+
+        public boolean isNo_data() {
+            return unit_result.equals(NO_DATA);
+        }
     }
     }
 
 
     private static final class SensorToReport {
     private static final class SensorToReport {

+ 35 - 53
src/main/resources/templates/default.mustache

@@ -1,62 +1,43 @@
-<html>
-<head>
-
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="UTF-8">
+<title>Watchdog Report</title>
 <style>
 <style>
-footer p {
-    font-size: 0.75em;
-}
-
-table {
-    width: 100%;
-}
-
-.table_header {
-    background-color: #dddddd;
-}
-
-.table_row_OK {
-    border: 1px solid #dddddd;
-    text-align: left;
-    padding: 8px;
-    background-color: #CCFFCC;
-}
-
-.table_row_FAIL {
-    border: 1px solid #dddddd;
-    text-align: left;
-    padding: 8px;
-    background-color: #FFCCCC;
-}
-
-.table_row_cell {
-    border: 1px solid #dddddd;
-    text-align: left;
-    padding: 8px;
-}
-
 tr.table_row_space>td {
 tr.table_row_space>td {
   padding-bottom: 1em;
   padding-bottom: 1em;
 }
 }
-
 </style>
 </style>
-</head>
 
 
 <body>
 <body>
-<table>
-	<tr class='table_header'>
+<table style="width: 100%;">
+	<tr style="background-color: #dddddd;">
 		<th>unitName</th>
 		<th>unitName</th>
 		<th>unitId</th>
 		<th>unitId</th>
 	</tr>
 	</tr>
 	{{#units}}
 	{{#units}}
-        <tr class='table_row_{{unit_result}}'>
-            <td class='table_row_cell'>{{unit_name}}</td>
-            <td class='table_row_cell'>{{unit_id}}</td>
+	    {{#ok}}
+        <tr style="border: 1px solid #dddddd;text-align: left; background-color: #CCFFCC; padding: 8px;">
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_name}}</td>
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_id}}</td>
+        </tr>
+        {{/ok}}
+        {{#fail}}
+        <tr style="border: 1px solid #dddddd; text-align: left; background-color: #FFCCCC; padding: 8px;">
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_name}}</td>
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_id}}</td>
         </tr>
         </tr>
+        {{/fail}}
+        {{#no_data}}
+        <tr style="border: 1px solid #dddddd;text-align: left; background-color: white; padding: 8px;">
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_name}}</td>
+            <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_id}}</td>
+        </tr>
+        {{/no_data}}
 	{{/units}}
 	{{/units}}
 </table>
 </table>
 &nbsp;
 &nbsp;
-<table>
-	<tr class='table_header'>
+<table style="width: 100%;">
+	<tr style="background-color: #dddddd;">
 		<th>unitName (unitId)</th>
 		<th>unitName (unitId)</th>
 		<th>sensorName (sensorId)</th>
 		<th>sensorName (sensorId)</th>
 		<th>timestamp</th>
 		<th>timestamp</th>
@@ -64,20 +45,21 @@ tr.table_row_space>td {
 	{{#units}}
 	{{#units}}
         {{#hasSensors}}
         {{#hasSensors}}
 	        {{#sensors}}
 	        {{#sensors}}
-            <tr class='table_row_{{sensor_result}}'>
-                <td class='table_row_cell'>{{unit_name}} ({{unit_id}})</td>
-                <td class='table_row_cell'>{{sensor_name}} ({{sensor_id}})</td>
-                <td class='table_row_cell'>{{timestamp}}</td>
+            <tr style="border: 1px solid #dddddd; text-align: left; background-color: #FFCCCC; padding: 8px;">
+                <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{unit_name}} ({{unit_id}})</td>
+                <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{sensor_name}} ({{sensor_id}})</td>
+                <td style="border: 1px solid #dddddd; text-align: left; padding: 8px;">{{timestamp}}</td>
             </tr>
             </tr>
             {{/sensors}}
             {{/sensors}}
-            <tr class='table_row_space'><td></td></tr>
+            <tr class='table_row_space'><td></td><td></td><td></td></tr>
         {{/hasSensors}}
         {{/hasSensors}}
 	{{/units}}
 	{{/units}}
 </table>
 </table>
-<br/>
-</body>
+
 <footer>
 <footer>
-<hr><p>{{#__opt}}{{key}}: {{value}} | {{/__opt}}</p><hr>
+<hr><p style="font-size: 0.75em;">{{#__opt}}{{key}}: {{value}} | {{/__opt}}</p><hr>
 </footer>
 </footer>
-</html>
 
 
+</body>
+
+</html>