Lukas Cerny 4 роки тому
батько
коміт
bc8fe28927

+ 22 - 41
config/foodie.yaml

@@ -21,73 +21,54 @@ messageBrokers:
     config:
       server: lspEmail
       senderEmail: "watchdog@senslog.org"
-      recipientEmail: "luccerny@ntis.zcu.cz, kepka@ccss.cz"
-      subject: "[Watchdog] Report Foodie SensLog (CZ)"
+      recipientEmail:
+        - "luccerny@ntis.zcu.cz"
+        - "kepka@ccss.cz"
+      subject: "[Watchdog] Report SensLog (CZ)"
 
 dataProviders:
-  wsOldFoodieKynsperk:
+  wsSensLogKynsperk:
     type: WEB_SERVICE
     config:
       server: lspSenslog15
       groupName: "kynsperk"
 
-  wsOldFoodieRostenice:
+  wsSensLogRostenice:
     type: WEB_SERVICE
     config:
       server: lspSenslog15
       groupName: "rostenice_pudni"
 
+  wsSensLogZcu:
+    type: WEB_SERVICE
+    config:
+      server: lspSenslog15
+      groupName: "zcu"
+
 groups:
   kynsperk:
     name: "Kynsperk"
-    dataProvider: wsOldFoodieKynsperk
+    dataProvider: wsSensLogKynsperk
     messageBroker: emailToAll
     resultType: FAIL
     period: 86400
 
   rostenice:
     name: "Rostenice"
-    dataProvider: wsOldFoodieRostenice
+    dataProvider: wsSensLogRostenice
     messageBroker: emailToAll
     resultType: FAIL
     period: 86400
 
-
-monitoredObjects:
-  1305167562293765: # no data
-    period: 86400
-    groups: [kynsperk]
-    sensors: [ 340340092, 360200000, 410130092 ]
-
-  1305167562275270: # no data
-    period: 86400
-    groups: [kynsperk]
-    sensors: [ 340240003, 360200000, 410090003 ]
-
-  1305167562292824: # no data
-    period: 86400
-    groups: [kynsperk]
-
-  1305167549173046: # no data
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549144045:
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549158198:
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549167050:
+  zcu:
+    name: "ZCU Robcice"
+    dataProvider: wsSensLogZcu
+    messageBroker: emailToAll
+    resultType: ALL
     period: 86400
-    groups: [ kynsperk ]
 
-  1305167549167886:
-    period: 86400
-    groups: [ kynsperk ]
+monitoredObjects:
 
-  1305167549149707:
+  1305167562258386:
     period: 86400
-    groups: [ kynsperk ]
+    groups: [ zcu ]

+ 22 - 42
config/test-foodie.yaml

@@ -1,5 +1,5 @@
 general:
-  firstStartAt: "12:00:00" # hh:mm:ss
+  firstStartAt: "00:20:00" # hh:mm:ss
 
 emailServers:
   lspEmail:
@@ -21,73 +21,53 @@ messageBrokers:
     config:
       server: lspEmail
       senderEmail: "watchdog@senslog.org"
-      recipientEmail: "luccerny@ntis.zcu.cz"
-      subject: "[Watchdog] Report Foodie SensLog (CZ)"
+      recipientEmail:
+        - "luccerny@ntis.zcu.cz"
+      subject: "[Watchdog] Test Report SensLog (CZ)"
 
 dataProviders:
-  wsOldFoodieKynsperk:
+  wsSensLogKynsperk:
     type: WEB_SERVICE
     config:
       server: lspSenslog15
       groupName: "kynsperk"
 
-  wsOldFoodieRostenice:
+  wsSensLogRostenice:
     type: WEB_SERVICE
     config:
       server: lspSenslog15
       groupName: "rostenice_pudni"
 
+  wsSensLogZcu:
+    type: WEB_SERVICE
+    config:
+      server: lspSenslog15
+      groupName: "zcu"
+
 groups:
   kynsperk:
     name: "Kynsperk"
-    dataProvider: wsOldFoodieKynsperk
+    dataProvider: wsSensLogKynsperk
     messageBroker: emailToAll
     resultType: FAIL
     period: 86400
 
   rostenice:
     name: "Rostenice"
-    dataProvider: wsOldFoodieRostenice
+    dataProvider: wsSensLogRostenice
     messageBroker: emailToAll
     resultType: FAIL
     period: 86400
 
-
-monitoredObjects:
-  1305167562293765: # no data
-    period: 86400
-    groups: [kynsperk]
-    sensors: [ 340340092, 360200000, 410130092 ]
-
-  1305167562275270: # no data
-    period: 86400
-    groups: [kynsperk]
-    sensors: [ 340240003, 360200000, 410090003 ]
-
-  1305167562292824: # no data
-    period: 86400
-    groups: [kynsperk]
-
-  1305167549173046: # no data
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549144045:
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549158198:
-    period: 86400
-    groups: [ kynsperk ]
-
-  1305167549167050:
+  zcu:
+    name: "ZCU Robcice"
+    dataProvider: wsSensLogZcu
+    messageBroker: emailToAll
+    resultType: FAIL
     period: 86400
-    groups: [ kynsperk ]
 
-  1305167549167886:
-    period: 86400
-    groups: [ kynsperk ]
+monitoredObjects:
 
-  1305167549149707:
+  1305167562258386:
     period: 86400
-    groups: [ kynsperk ]
+    groups: [ zcu ]

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

@@ -2,6 +2,7 @@ package cz.senslog.watchdog.app;
 
 import cz.senslog.watchdog.config.Configuration;
 import cz.senslog.watchdog.config.ExecutableGroup;
+import cz.senslog.watchdog.core.Watcher;
 import cz.senslog.watchdog.messagebroker.MessageBroker;
 import cz.senslog.watchdog.messagebroker.MessageBrokerManager;
 import cz.senslog.watchdog.provider.DataProvider;
@@ -69,12 +70,14 @@ public class Application extends Thread {
         LocalTime startAtTime = config.getGeneralConfig().getFirstStartAt();
         LocalDate startAtDate = now.toLocalTime().isBefore(startAtTime) ? now.toLocalDate() : now.toLocalDate().plusDays(1);
         LocalDateTime startAt = LocalDateTime.of(startAtDate, startAtTime);
+
         Scheduler.SchedulerBuilder schedulerBuilder = Scheduler.createBuilder();
         for (ExecutableGroup exeGroup : config.getExecutableGroups()) {
+
             MessageBroker msgBroker = messageBrokerManager.getInstance(exeGroup.getConfig().getMessageBrokerId());
             DataProvider dataProvider = dataProviderManager.getInstance(exeGroup.getConfig().getDataProviderId());
-
             Watcher watcher = Watcher.create(exeGroup, dataProvider, msgBroker);
+
             Integer period = exeGroup.getConfig().getPeriod();
             if (period == null) {
                 throw new IllegalStateException("Period for the group '"+exeGroup.getConfig().getId()+"' is not specified.");

+ 44 - 41
src/main/java/cz/senslog/watchdog/config/EmailMessageBrokerConfig.java

@@ -1,42 +1,45 @@
-package cz.senslog.watchdog.config;
-
-public class EmailMessageBrokerConfig extends MessageBrokerConfig {
-
-    private final String serverId;
-    private final String senderEmail;
-    private final String recipientEmail;
-    private final String subject;
-
-    public static EmailMessageBrokerConfig create(String id, PropertyConfig config) {
-        return new EmailMessageBrokerConfig(id,
-                config.getStringProperty("server"),
-                config.getStringProperty("senderEmail"),
-                config.getStringProperty("recipientEmail"),
-                config.getStringProperty("subject")
-        );
-    }
-
-    public EmailMessageBrokerConfig(String id, String serverId, String senderEmail, String recipientEmail, String subject) {
-        super(id, MessageBrokerType.EMAIL);
-        this.serverId = serverId;
-        this.senderEmail = senderEmail;
-        this.recipientEmail = recipientEmail;
-        this.subject = subject;
-    }
-
-    public String getServerId() {
-        return serverId;
-    }
-
-    public String getSenderEmail() {
-        return senderEmail;
-    }
-
-    public String getRecipientEmail() {
-        return recipientEmail;
-    }
-
-    public String getSubject() {
-        return subject;
-    }
+package cz.senslog.watchdog.config;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class EmailMessageBrokerConfig extends MessageBrokerConfig {
+
+    private final String serverId;
+    private final String senderEmail;
+    private final Set<String> recipientEmails;
+    private final String subject;
+
+    public static EmailMessageBrokerConfig create(String id, PropertyConfig config) {
+        return new EmailMessageBrokerConfig(id,
+                config.getStringProperty("server"),
+                config.getStringProperty("senderEmail"),
+                new HashSet<>(config.getArrayPropertyOf("recipientEmail", String.class)),
+                config.getStringProperty("subject")
+        );
+    }
+
+    public EmailMessageBrokerConfig(String id, String serverId, String senderEmail, Set<String> recipientEmails, String subject) {
+        super(id, MessageBrokerType.EMAIL);
+        this.serverId = serverId;
+        this.senderEmail = senderEmail;
+        this.recipientEmails = recipientEmails;
+        this.subject = subject;
+    }
+
+    public String getServerId() {
+        return serverId;
+    }
+
+    public String getSenderEmail() {
+        return senderEmail;
+    }
+
+    public Set<String> getRecipientEmails() {
+        return recipientEmails;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
 }

+ 137 - 137
src/main/java/cz/senslog/watchdog/app/Watcher.java → src/main/java/cz/senslog/watchdog/core/Watcher.java

@@ -1,138 +1,138 @@
-package cz.senslog.watchdog.app;
-
-import cz.senslog.watchdog.config.AllMonitoredObjects;
-import cz.senslog.watchdog.config.ExecutableGroup;
-import cz.senslog.watchdog.config.MonitoredObject;
-import cz.senslog.watchdog.core.adt.Node;
-import cz.senslog.watchdog.domain.*;
-import cz.senslog.watchdog.messagebroker.MessageBroker;
-import cz.senslog.watchdog.provider.DataProvider;
-import cz.senslog.watchdog.provider.ProvidedData;
-import cz.senslog.watchdog.provider.ProvidedObject;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import java.time.Instant;
-import java.time.ZoneId;
-import java.util.*;
-
-import static cz.senslog.watchdog.domain.StatusReport.*;
-import static java.time.LocalDateTime.ofInstant;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.singletonList;
-
-public class Watcher {
-
-    private static final Logger logger = LogManager.getLogger(Watcher.class);
-
-    private final ExecutableGroup group;
-    private final DataProvider dataProvider;
-    private final MessageBroker messageBroker;
-
-    public static Watcher create(ExecutableGroup group, DataProvider dataProvider, MessageBroker messageBroker) {
-        return new Watcher(group, dataProvider, messageBroker);
-    }
-
-    private Watcher(ExecutableGroup group, DataProvider dataProvider, MessageBroker messageBroker) {
-        this.group = group;
-        this.dataProvider = dataProvider;
-        this.messageBroker = messageBroker;
-    }
-
-    public void check() {
-
-        Instant now = Instant.now();
-        ProvidedData data = dataProvider.getLastData();
-
-        List<SimpleReport> reports = new ArrayList<>();
-        List<String> reportedMessages = new ArrayList<>(data.getErrorMessages());
-
-        if (!data.isEmpty()) {
-            for (String unitId : group.getKeys()) {
-                Node<String, MonitoredObject> mUnitNode = group.getNode(unitId);
-                if (mUnitNode.getValue() instanceof AllMonitoredObjects) {
-                    // ALL UNITS
-                    int period = mUnitNode.getValue().getPeriod();
-                    Instant minTimestamp = now.minusSeconds(period);
-                    for (String pUnitId : data.getKeys()) {
-                        Node<String, ProvidedObject> pUnitNode = data.getNode(pUnitId);
-                        String unitName = pUnitNode.getValue().getName();
-                        for (ProvidedObject pObject : pUnitNode.getValues()) {
-                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
-                                    new Unit(Long.parseLong(pUnitId), unitName),
-                                    new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
-                                    pObject.getTimestamp()
-                            ),
-                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
-                            );
-
-                            if (isAllowedToReport(simpleReport)) {
-                                reports.add(simpleReport);
-                            }
-                        }
-                    }
-                } else if (!data.containsNode(unitId)) {
-                    reportedMessages.add(String.format("No data for: unit_id - %s", unitId));
-                } else {
-                    Node<String, ProvidedObject> pUnitNode = data.getNode(unitId);
-                    String unitName = pUnitNode.getValue().getName();
-                    for (MonitoredObject mSensor : mUnitNode.getValues()) {
-                        int period = mSensor.getPeriod();
-                        Instant minTimestamp = now.minusSeconds(period);
-                        Collection<ProvidedObject> providedObjects = mSensor instanceof AllMonitoredObjects ?
-                                pUnitNode.getValues() : pUnitNode.containsKey(mSensor.getId()) ?
-                                singletonList(pUnitNode.getNode(mSensor.getId()).getValue()) : emptyList();
-
-                        if (providedObjects.isEmpty()) {
-                            reports.add(new SimpleReport(new ObservationInfo(
-                                    new Unit(Long.parseLong(unitId), unitName),
-                                    new Sensor(Long.parseLong(mSensor.getId()), "unknown"),
-                                    null
-                            ),
-                                    NO_DATA
-                            ));
-                        }
-
-                        for (ProvidedObject pObject : providedObjects) {
-                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
-                                    new Unit(Long.parseLong(unitId), unitName),
-                                    new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
-                                    pObject.getTimestamp()
-                            ),
-                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
-                            );
-
-                            if (isAllowedToReport(simpleReport)) {
-                                reports.add(simpleReport);
-                            }
-                        }
-                    }
-                }
-            }
-        } else {
-            reportedMessages.add("An error has occurred. No data to check.");
-        }
-
-        Map<String, String> operationProperties = new HashMap<>();
-        operationProperties.put("Group name", group.getConfig().getName());
-
-        messageBroker.send(new Report(ofInstant(now, ZoneId.systemDefault()), reports, reportedMessages, operationProperties), status -> {
-            String brokerType = messageBroker.getType().name().toLowerCase();
-            if (status.isSuccess()) {
-                logger.info("The report at '{}' was send via '{}' broker successfully for the group's name '{}'.",
-                        status.getReport().getCreated(), brokerType, group.getConfig().getName()
-                );
-            } else {
-                logger.error("Can not send a message '{}' via '{}' broker because of '{}'.",
-                        status.getReport().getCreated(), brokerType, status.getError()
-                );
-            }
-        });
-    }
-
-
-    private boolean isAllowedToReport(SimpleReport report) {
-        if (report == null) { return false; }
-        return report.getStatus().ordinal() >= group.getConfig().getResultType().ordinal();
-    }
+package cz.senslog.watchdog.core;
+
+import cz.senslog.watchdog.config.AllMonitoredObjects;
+import cz.senslog.watchdog.config.ExecutableGroup;
+import cz.senslog.watchdog.config.MonitoredObject;
+import cz.senslog.watchdog.core.adt.Node;
+import cz.senslog.watchdog.domain.*;
+import cz.senslog.watchdog.messagebroker.MessageBroker;
+import cz.senslog.watchdog.provider.DataProvider;
+import cz.senslog.watchdog.provider.ProvidedData;
+import cz.senslog.watchdog.provider.ProvidedObject;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.util.*;
+
+import static cz.senslog.watchdog.domain.StatusReport.*;
+import static java.time.LocalDateTime.ofInstant;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+
+public class Watcher {
+
+    private static final Logger logger = LogManager.getLogger(Watcher.class);
+
+    private final ExecutableGroup group;
+    private final DataProvider dataProvider;
+    private final MessageBroker messageBroker;
+
+    public static Watcher create(ExecutableGroup group, DataProvider dataProvider, MessageBroker messageBroker) {
+        return new Watcher(group, dataProvider, messageBroker);
+    }
+
+    private Watcher(ExecutableGroup group, DataProvider dataProvider, MessageBroker messageBroker) {
+        this.group = group;
+        this.dataProvider = dataProvider;
+        this.messageBroker = messageBroker;
+    }
+
+    public void check() {
+
+        Instant now = Instant.now();
+        ProvidedData data = dataProvider.getLastData();
+
+        List<SimpleReport> reports = new ArrayList<>();
+        List<String> reportedMessages = new ArrayList<>(data.getErrorMessages());
+
+        if (!data.isEmpty()) {
+            for (String unitId : group.getKeys()) {
+                Node<String, MonitoredObject> mUnitNode = group.getNode(unitId);
+                if (mUnitNode.getValue() instanceof AllMonitoredObjects) {
+                    // ALL UNITS
+                    int period = mUnitNode.getValue().getPeriod();
+                    Instant minTimestamp = now.minusSeconds(period);
+                    for (String pUnitId : data.getKeys()) {
+                        Node<String, ProvidedObject> pUnitNode = data.getNode(pUnitId);
+                        String unitName = pUnitNode.getValue().getName();
+                        for (ProvidedObject pObject : pUnitNode.getValues()) {
+                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
+                                    new Unit(Long.parseLong(pUnitId), unitName),
+                                    new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
+                                    pObject.getTimestamp()
+                            ),
+                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
+                            );
+
+                            if (isAllowedToReport(simpleReport)) {
+                                reports.add(simpleReport);
+                            }
+                        }
+                    }
+                } else if (!data.containsNode(unitId)) {
+                    reportedMessages.add(String.format("No data for: unit_id - %s", unitId));
+                } else {
+                    Node<String, ProvidedObject> pUnitNode = data.getNode(unitId);
+                    String unitName = pUnitNode.getValue().getName();
+                    for (MonitoredObject mSensor : mUnitNode.getValues()) {
+                        int period = mSensor.getPeriod();
+                        Instant minTimestamp = now.minusSeconds(period);
+                        Collection<ProvidedObject> providedObjects = mSensor instanceof AllMonitoredObjects ?
+                                pUnitNode.getValues() : pUnitNode.containsKey(mSensor.getId()) ?
+                                singletonList(pUnitNode.getNode(mSensor.getId()).getValue()) : emptyList();
+
+                        if (providedObjects.isEmpty()) {
+                            reports.add(new SimpleReport(new ObservationInfo(
+                                    new Unit(Long.parseLong(unitId), unitName),
+                                    new Sensor(Long.parseLong(mSensor.getId()), "unknown"),
+                                    null
+                            ),
+                                    NO_DATA
+                            ));
+                        }
+
+                        for (ProvidedObject pObject : providedObjects) {
+                            SimpleReport simpleReport = new SimpleReport(new ObservationInfo(
+                                    new Unit(Long.parseLong(unitId), unitName),
+                                    new Sensor(Long.parseLong(pObject.getId()), pObject.getName()),
+                                    pObject.getTimestamp()
+                            ),
+                                    pObject.getTimestamp().toInstant().isBefore(minTimestamp) ? FAIL : OK
+                            );
+
+                            if (isAllowedToReport(simpleReport)) {
+                                reports.add(simpleReport);
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            reportedMessages.add("An error has occurred. No data to check.");
+        }
+
+        Map<String, String> operationProperties = new HashMap<>();
+        operationProperties.put("Group name", group.getConfig().getName());
+
+        messageBroker.send(new Report(ofInstant(now, ZoneId.systemDefault()), reports, reportedMessages, operationProperties), status -> {
+            String brokerType = messageBroker.getType().name().toLowerCase();
+            if (status.isSuccess()) {
+                logger.info("The report at '{}' was send via '{}' broker successfully for the group's name '{}'.",
+                        status.getReport().getCreated(), brokerType, group.getConfig().getName()
+                );
+            } else {
+                logger.error("Can not send a message '{}' via '{}' broker because of '{}'.",
+                        status.getReport().getCreated(), brokerType, status.getError()
+                );
+            }
+        });
+    }
+
+
+    private boolean isAllowedToReport(SimpleReport report) {
+        if (report == null) { return false; }
+        return report.getStatus().ordinal() >= group.getConfig().getResultType().ordinal();
+    }
 }

+ 2 - 1
src/main/java/cz/senslog/watchdog/core/connection/EmailServerConnection.java

@@ -40,7 +40,8 @@ public class EmailServerConnection {
         Session session = openSession(config);
         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress(messageConfig.getSenderEmail()));
-        message.setRecipients(TO, InternetAddress.parse(messageConfig.getRecipientEmail()));
+        String recipients = String.join(",",messageConfig.getRecipientEmails());
+        message.setRecipients(TO, InternetAddress.parse(recipients));
         message.setSubject(messageConfig.getSubject());
 
         MimeBodyPart mimeBodyPart = new MimeBodyPart();

+ 18 - 7
src/main/java/cz/senslog/watchdog/core/connection/SensLogWSConnection.java

@@ -71,19 +71,14 @@ public class SensLogWSConnection {
         return cookie;
     }
 
-    public List<Map<String, Object>> loadLastObservation(String groupName) {
+    private List<Map<String, Object>> loadLastObservation(HttpRequest.Builder reqBuilder) {
         HttpCookie authCookie = getAuthCookie();
         if (!authCookie.isSecure()) {
             logger.warn("Auth cookie is not valid to be used.");
             return emptyList();
         }
 
-        HttpRequest request = HttpRequest.newBuilder().GET()
-                .url(URLBuilder.newBuilder(config.getBaseUrl(), "/rest/watchdog/group")
-                        .addParam("group_name", groupName)
-                        .build())
-                .addCookie(authCookie)
-                .build();
+        HttpRequest request = reqBuilder.addCookie(authCookie).build();
         logger.info("Getting new data from the server: {}.", request.getUrl());
 
         HttpResponse response = httpClient.send(request);
@@ -98,6 +93,22 @@ public class SensLogWSConnection {
         return jsonToObject(response.getBody(), lastObsType);
     }
 
+    public List<Map<String, Object>> loadLastObservation(String [] unitIds) {
+        return loadLastObservation(HttpRequest.newBuilder().GET()
+                .url(URLBuilder.newBuilder(config.getBaseUrl(), "/rest/watchdog/unit")
+                        .addParam("unit_id", String.join(",", unitIds))
+                        .build())
+        );
+    }
+
+    public List<Map<String, Object>> loadLastObservation(String groupName) {
+        return loadLastObservation(HttpRequest.newBuilder().GET()
+                .url(URLBuilder.newBuilder(config.getBaseUrl(), "/rest/watchdog/group")
+                        .addParam("group_name", groupName)
+                        .build())
+        );
+    }
+
     public String getHost() {
         return config.getBaseUrl();
     }