Informationen Host Online / Offline von linbo-remote loggen

Hallo,

wir möchten bei uns gern Rechner am Morgen aufwachen lassen um sie zu synchronisieren. Einige machen das ja hier so. Deshalb ein paar Fragen an alle, die das bei sich so eingerichtet haben:

  • Lasst ihr euch über alle Rechner informieren, die nicht online waren?
  • Falls ja: Wie macht ihr das? Einfach die Ausgaben von linbo-remote irgendwo hin loggen?
  • Oder extrahiert jmd. diese Infos und lässt sie sich per Mail zustellen?
  • Falls ja: Wie?

Danke!
Stephan

Hi Stephan.
Ich lasse die Rechner zwar nicht sync. hochfahren, doch wenn ich sync., lasse ich per Postsync eine Datei anlegen, in der steht, wann dies zuletzt geschehen ist. Vielleicht hilft dir das ja schon weiter?

Ganz am Ende meiner postsync-Datei steht:

.....
    # Eintrag dient dazu, in die Logdatei das Datum der letzten Sync. zu schreiben!
    LOGFILE=/mnt/last-SYNC.log
    echo "$(date) - $(hostname) der Gruppe $(hostgroup) wurde synchronisiert!" > $LOGFILE

echo "##### POSTSYNC END #####"

Schöne Grüße,
Michael

Ach ja … den Status, ob ein Client on-/offline ist, habe ich hier über ein kleines PHP-Script geregelt. Es ist zwar nicht sonderlich schnell aber funktioniert dafür ootb:

https://fam.tuwien.ac.at/~schamane/sysadmin/netstat/

Per e-Mail mache ich das nicht. Wenn du natürlich eine x-fache Größe hast, würde sich das wahrscheinlich lohnen.
Schöne Grüße,
Michael

Hallo Michael,

Danke für deine Vorschläge. Das hilft schon mal weiter, doch mir geht es im Prinzip darum welche Rechner z.B. nicht aufgeweckt werden konnten und deshalb der Sync nicht ausgeführt werden konnte (aus welchen Gründen auch immer). Ziel ist ist es zu wissen, wo man noch mal per Hand nachhelfen muss - falls notwendig.

VG

Vielleicht lässt sich das PHP Script einfach erweitern: sobald es “offline” meldet --> Email an dich.
Dann wüsstest du Bescheid.

Alternative Idee (aber wahrscheinlich mit Kanonen auf Spatzen geschossen):
Wenn du einen MoniPi einsetzt, könntest du auch den nehmen, um einen Raum zu überwachen. Der unterstützt dann auch Benachrichtigen im Alarmfall…

Michael

Hi,

mir geht es nicht darum, ob ein Host offline geht, sondern ob der linbo-remite Befehl abgesetzt werden konnte oder nicht. Linbo-remote wartet ja nach dem aufwecken der Rechner per WoL eine bestimmte Zeit und versucht dann die Befehle z.B. sync auszuführen. Falls das nicht geht, kommt dann in etwa so eine Meldung. Host offline…skipping. Die Hists, die das betrifft, die möchte ich gern wissen :wink:

Diese Logfiles liegen serverseitig, oder? Kann man dann nicht einfach mit grep da durch pflügen?

Das ist nur die Ausgabe auf der Konsole. Dafür gibt es leider keine Logfile, aber man kann sich die natürlich selber schaffen - deshalb frage ich ja, ob und wie das schon jmd. gemacht hat :wink:

Ok.
Ich habe es gerade mal laufen lassen (alle Rechner sind im Moment aus):

linbo-remote -r raum2 -c start:1
###
### linbo-remote (7601) start: Mo 19. Mär 13:55:13 CET 2018
###

Sending command(s) to:
 10.20.200.1 ... Not online, host skipped.
 10.20.200.2 ... Not online, host skipped.
 10.20.200.3 ... Not online, host skipped.
 10.20.200.4 ... Not online, host skipped.
 10.20.200.5 ... Not online, host skipped.
....

Würde es dir reichen, wenn man diese Ausgabe in eine Datei umleitet?

 linbo-remote -r raum2 -c start:1 > output.log

Wenn du die Ausgabe in eine Datei umleitest, kannst du mit diesem kleinen Script anzeigen lassen, wo es nicht geklappt hat (Quick & Dirty – ohne Gewähr):

#!/bin/bash

#Dieses Script zeigt alle Clients an, die nicht per linbo-remote synchronisiert werden konnten. 
#Syntax:  linbo-remote -r raum2 -c start:1 > output.log
# ./compare.sh 

logfile=output.log

echo ---------------------------------------------------------------
head -n2 $logfile |tail -n1 |cut -c32- 
echo "konnten folgende Rechner nicht synchronisiert werden:";
echo ---------------------------------------------------------------

while read line; 
  do     
   if [[ "echo $line | awk '{print $3}'" == *Not* ]]; then 
     echo $line | awk '{print $1}'
   else
     exit 0;
   fi
done < <(tail -n +6 $logfile )
1 „Gefällt mir“

Hi Michael,

super, vielen Dank! Sieht gut aus! :thumbsup:

Ich habe in der letzten Stunde angefangen das ganze mit Python auszulesen und zu verarbeiten, da ich am Ende gern die offline Hosts in unseren Monitoring Channel in Mattermost posten will. Das Gerüst steht, Feinheiten fehlen noch. Ich poste es, wenn ich es fertig habe.

VG

Hallo,

wenn man den Befehl in einen Cronjob einbindet, dann bekommt der Administrator automatisch eine Mail. In der Mail sieht man dann welche Rechner aufgewacht sind und welche nicht.

Gruß

Alois

Hi Stephan,

wenn du statt -c die Option -p verwendest, also z.B.

linbo-remote -i r100-pc01 -w 0 -p sync:1

dann liegt auf dem Server in /var/linbo/linbocmd eine mit der IP von r100-pc01 benannte Datei, z.B. 10.16.100.1.cmd mit den per -p übergebenen Befehlen.

Wenn r100-pc01 dann hochfährt, holt er sich diese Datei, d.h. wenn sie später noch da ist, siehst du, dass da irgendwas nicht geklappt hat.

(Weiterer Vorteil von -p ist für mich, dass man für -w keine Wartezeit schätzen muss, nach der die Befehle übergeben werden, sondern der Client sich die Befehlsdatei automatisch dann holt, wenn linbo startet)

Viele Grüße

Andreas

1 „Gefällt mir“

Hallo Andreas,

vielen Dank für den Hinweis und den Tipp. Die Option -p passt viel besser! Ich habe eine erste Version des Skripts fertig. Muss es die Tage noch mal im produktiven Betrieb testen, aber bisher schaut es ganz gut aus. Das Skript gibt am Ende die Hostnamen der Rechner aus, die es nicht bis in Linbo geschafft haben (warum auch immer :slight_smile: )

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import requests
import json

#CONFIG
linbocmdPath = "/var/linbo/linbocmd"
workstations = "/etc/linuxmuster/workstations"
#optional
mattermostUrl = ""
channel = "#monitoring"
botName = "Linbo"
icon_url = ""

# Read workstations for hostname lookup
workstationsFile = open(workstations, "r")
devices = workstationsFile.readlines()

#IP to hostname
def lookupIP(ip):
    for host in devices:
        if host.find(";"+ip+";") != -1:
            return host.split(";")[1]
            break;

# Post message to Mattermost channel
def postMessage(message):
    attachment = {"color": "danger", "text":  message}
    data = {"channel": channel, "username": botName, "attachments": [attachment], "icon_url": icon_url}
    conn = requests.post(mattermostUrl, data = json.dumps(data))

# Check if there are files left from Linbo (linbo-remote -r room -p command -w 0)
offlineHosts = sorted(os.listdir(linbocmdPath))
numberOfHosts = len(offlineHosts)
if numberOfHosts > 0:
    message = ":warning: " + str(numberOfHosts) + " host(s) were offline:\n"
    for host in offlineHosts:
        message += "* " + lookupIP(host.replace(".cmd", "")) + "\n"

        # Remove Linbo command files
        commandFile = os.path.join(linbocmdPath, host)
        try:
            if os.path.isfile(commandFile):
                os.unlink(commandFile)
        except Exception as e:
            print(e)

    print(message)

    # Post to Mattermost if a URL is configured
    if mattermostUrl != "":
        postMessage(message)
else:
    print("Everything is OK!")

vG Stephan

Hallo Stephan,

ich benutze zwar auch die Option -p, lösche aber die verbliebenen Dateien.

Grund: Wenn am Morgen Rechner gestartet werden und dann das tun, was unter -p geplant ist, dann gibt es Beschwerden dass die Rechner ja ewig brauchen bis sie starten. Deshalb werden nur die synchronisiert, die sich per wakeonlan wecken liesen, der Rest bleibt so wie er ist. Meist werden die Recher beim nächsten Versuch gesynct und andere lassen sich nicht wecken. Macht aber m.E. nichts.

Gruß

Alois

1 „Gefällt mir“

Hallo Alois,

danke für den Hinweis - macht Sinn. Ich habe das Skript erweitert und oben aktualisiert.

vG Stephan