Rechnerstatus im Smart-Office-Umfeld

Simon Rösch, 14. März 2023
Lesezeit: 10 Minuten
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:

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.

/uploads/WOL_Dropdown_db9866cf6b.png

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.

/uploads/Inline_Graphik_44b6252a1a.png

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.

/uploads/SO_Graphik_428121c4c4.png

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.

Copy
@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.

Copy
@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.

Copy
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;
}
author image
Simon Rösch
Student Informatik, 5. Semester
In meinem Praxissemester bei avocado software engineering konnte ich in Projekten wie dem Wake-On-Lan-Portal meine Kenntnisse und Fähigkeiten sowohl im Backend als auch im Frontend vertiefen und neue Technologien wie Angular und Spring für mich entdecken.