Strom zu sparen macht nicht erst seit der Energiekrise Sinn. Bei avocado software engineering versuchen wir dazu mit 2 Tools unseren Verbrauch im Büro zu optimieren:
- Das Smart-OfficeTool, über dessen Funktionsweisen im Blogbeitrag vom Juli 2021 zu lesen ist: https://www.avocado-se.de/blog/avocado-goes-smart-office
- Das Wake-On-Lan-Portal, das uns bereits die Möglichkeit bietet Rechner vom Homeoffice aus zu starten. Wie unser Wake-On-Lan Tool funktioniert und wie es umgesetzt wurde, kann in folgendem Blogbeitrag nachgelesen werden: https://www.avocado-se.de/blog/wake-on-lan-portal
Es kann jedoch schnell passieren, dass nach der Arbeit vergessen wird den Rechner wieder herunterzufahren. Um einen besseren Überblick zu bekommen, welche Rechner im Büro noch angeschaltet sind, sollen das Wake-On-Lan-Portal und das Smartoffice-Portal um entsprechende Anzeigen erweitert werden.
Idee
Die Ansicht soll Auskunft darüber geben, welcher Rechner zu welchen Zeiten angeschaltet ist. Dafür wird einmal pro Stunde für jeden Rechner im Büro ermittelt, ob dieser angeschaltet ist oder nicht. Die gesammelten Daten werden in einer Kurzübersicht im Wake-On-Lan-Portal und in einer detaillierteren Übersicht im Smart-Office-Portal dargestellt.
Frontend Umsetzung
Sowohl das Wake-On-Lan-Portal als auch das Smart-Office sind im Frontend mit Angular umgesetzt. Um die Grafiken umzusetzen werden zwei unterschiedliche Bibliotheken verwendet.
Anzeige bei Dropdown
Wählt man einen angeschalteten Rechner auf der, mit Angular umgesetzten, Startseite des Wake-On-Lan-Portals aus, wird angezeigt seit wann der Rechner ununterbrochen als "An" ermittelt ist. Startet man hierüber einen ausgeschalteten Rechner, wird ein neuer Rechnerstatus in die Datenbank geschrieben, in dem der Rechner als "An" erfasst wird.
Grafik
Auf der Verwaltungsseite des Wake-On-Lan-Portals, auf der alle Rechner in einer Übersicht dargestellt sind, gibt es in der Tabelle jeweils eine kleine Inline-Grafik. Diese zeigt den Verlauf des Rechnerstatus (An/Aus) für die letzten 12 Stunden an. Umgesetzt ist diese mit der "APEXCHARTS" - Bibliothek.
Grafik im SmartOffice
Im Smartoffice-Portal gibt es einen neuen Reiter "Betriebszeiten". Unter diesem ist eine ausführlichere Grafik zu finden, in der man den Verlauf des Rechnerstatus für beliebig viele Geräte gleichzeitig in einem einstellbaren Zeitraum sehen kann. Diese ist mit der "amCharts 4" - Bibliothek realisiert.
Backend Umsetzung
Das Wake-On-Lan-Portal ist in der Lage Rechner remote zu starten, indem ein sogenanntes "Magic Packet" an alle Rechner im Netzwerk per Broadcast verschickt wird. Dieses Magic Packet enthält die Mac-Adresse des zu startenden Rechners. Sobald der Netzwerkadapter des Rechners mit der passenden Mac-Adresse dieses Magic Packet empfängt, wird der Rechner gestartet. Genaueres zur Implementierung des Wake-On-Lan-Portals ist im oben verlinkten Blogbeitrag zu finden.
Für die Erweiterung des Wake-On-Lan-Portals muss regelmäßig der Status jedes einzelnen Rechners erfasst werden. Hierfür wird ein Cron-Job verwendet. Die @Scheduled Spring Annotation nimmt als Parameter eine Cron-Expression entgegen. In diesem Fall "0 0 * * * ?", was so viel bedeutet wie: Sekunde Null und Minute Null jeder Stunde, jedes Tags, jedes Monats, egal an welchem Wochentag. Es wird also einmal pro Stunde der Status aller Rechner ermittelt. Die auszuführende Methode muss hierfür den Rückgabetyp void haben und darf keine Übergabeparameter akzeptieren.
@Async
@Scheduled(cron = "0 0 * * * ?")
public void setNewDeviceStates() {
try {
List<Device> allDevices = deviceMapper.fetchDevices();
for (Device device : allDevices) {
boolean powered = cronTestConnection.checkPowered(device.getIp());
DeviceState deviceState = new DeviceState();
deviceState.setDeviceId(device.getId());
deviceState.setPowered(powered);
deviceState.setPointInTime(new Timestamp(System.currentTimeMillis()));
deviceStateMapper.create(deviceState);
}
}
...
}
Damit die Ausführung der @Scheduled-Methode in dem Projekt unterstützt wird, muss man diese noch mit der @EnableScheduling aktivieren.
@EnableScheduling
@SpringBootApplication
public class WolApplication {
...
}
Die checkPowered-Methode bekommt eine IP-Adresse übergeben und testet per Ping ob der dazugehörende Rechner gerade an ist. Der Zusatz "-c 5" ist hierbei wichtig, da der Befehl von einer Linuxmaschine ausgeführt wird. Der Ping-Befehl bei Windows versucht die Zieladresse standardmäßig nur vier mal zu erreichen, bevor er aufhört. Bei Linux hingegen wird beim Ping-Befehl (ohne Zusatz) endlos weiter gepingt. Das sorgt dafür, dass inputStream.readLine() immer einen Wert != null liefert, der auch nur dann den String "ttl=" enthält, wenn der angepingte Rechner auch an ist. Der Zusatz "-c 5" begrenzt die Anzahl an Pings bei Linux auf fünf und vermeidet damit Endlosschleifen im Programm beim anpingen eines ausgeschalteten Rechners.
public boolean checkPowered(String ip) {
String command = "ping -c 5 " + ip;
try {
Process p = Runtime.getRuntime().exec(command);
BufferedReader inputStream = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String s = "";
// reading output stream of the command
while ((s = inputStream.readLine()) != null) {
if(s.contains("ttl=")){
return true;
}
}
} catch (Exception e) {
logger.warn(e.getMessage());
}
return false;
}