Serverüberwachung mit Mercurial

Verteilte Versionsverwaltungen sind mächtige Werkzeuge. Sie kommen ohne Serverinfrastruktur aus und können für so ziemlich alles verwendet werden, wo man gern verschiedene Dateistände vorhalten möchte. Je nach Anwendungsfall sind diese Tools sehr einfach einzusetzen. Mein Liebling hierbei ist zur Zeit Mercurial, das sowohl für Windows, Linux als auch MacOS verfügbar ist.

Die Anwendung ist eigentlich kinderleicht: Zuerst einmal muss man ein Repository anlegen. Dazu geht man in einen Ordner, dessen Änderungen man gern verfolgen möchte und führt den Befehl "hg init" aus. Dabei wird ein ".hg"-Ordner angelegt, in dem sich alle relevanten Informationen befinden. Anschließend kann man via "hg add" alle Dateien im aktuellen Ordner dem Repository hinzufügen. Mit "hg commit" erstellt man seine erste gesicherte Version.

Nun kann man beliebig im Ordner weiterarbeiten. Wenn man wissen möchte, was sich seitdem geändert hat, kann man sich mit "hg status" die Liste der geänderten Dateien ausgeben lassen. Mit "hg diff" ist es sogar möglich, Änderungen innerhalb der Dateien zu vergleichen. Sollten einem Änderungen nicht gefallen, kann man mit "hg revert" zur letzten gesicherten Version zurückkehren. Will man die Änderungen stattdessen behalten, führt man wieder ein "hg commit" aus und erstellt eine neue gesicherte Version.

Mit diesem Grundwissen (und etwas PHP) lässt sich bereits eine einfache Serverüberwachung realisieren. Wie das funktioniert, werde ich einmal beispielhaft an den beiden Ordnern "/var/www/example_com/" und "/var/www/example_net" zeigen.

Als allererstes müssen wir einmal die benötigten Tools installieren:

1
2
sudo apt-get update
sudo apt-get install mercurial php5-cli

Als nächstes müssen wir in die jeweiligen Ordner gehen und dort die Repositories anlegen. Zudem legen wir noch jeweils eine Datei ".hgignore" an, um Dateien und Ordner aus der Überwachung ausschließen zu können (z.B. temporäre Ordner, die sich permament ändern könnnen):

1
2
3
4
5
6
7
8
9
10
11
cd /var/www/example_com/
sudo hg init
sudo chmod 700 ./.hg/
sudo touch ./.hgignore
sudo chmod 600 ./.hgignore

cd /var/www/example_net/
sudo hg init
sudo chmod 700 ./.hg/
sudo touch ./.hgignore
sudo chmod 600 ./.hgignore

Die benötigten Dateien gehören root, damit ein Angreifer diese nicht einfach lesen, löschen oder bearbeiten kann. Das ist nicht weiter tragisch, da wir die regelmäßige Prüfung via Cron durchführen werden. Natürlich kann man hier auch einen separaten Nutzer für verwenden. Folgenden Inhalt habe ich typischerweise in meiner ".hgignore"-Datei, aufgrund der chroot-Umgebung:

1
2
3
4
5
6
7
syntax: glob
mysql/mysql.socket
tmp/*
dev/null
dev/random
dev/urandom
dev/zero

Wenn wir fertig sind, können wir das jeweilige Repository mit Dateien befüllen. Dabei werden die Dateien ignoriert, die wir über die Datei ".hgignore" ausgeschlossen haben. Anschließend erstellen wir unseren ersten, initialen Commit. Damit sichern wir die aktuelle Version des Repositories:

1
2
3
4
5
6
7
cd /var/www/example_com/
sudo hg add
sudo hg commit -m "initialer Commit"

cd /var/www/example_net/
sudo hg add
sudo hg commit -m "initialer Commit"

Um nun zu prüfen, ob sich einer der Ordner geändert hat, habe ich mir ein kleines PHP-Script geschrieben und in "/var/check/check.phs" abgelegt. Es geht die in $SOURCEDIRS abgelegten Ordner durch, prüft, ob sich darin Dateien geändert haben und zählt, wieviele Änderungen existieren. Die Anzahl der Änderungen werden zusammen mit dem aktuellen Datum und der aktuellen Uhrzeit in die Datei $CHECKFILE geschrieben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
  $CHECKCMD   = "hg status -R";
  $CHECKDATE  = date("Ymd-Gis");
  $CHECKFILE  = "/var/check/check.txt";
  $SOURCEDIRS = array("/var/www/example_com/",
                      "/var/www/example_net/");

  $output = array();
  $status = 0;
  try {
    foreach ($SOURCEDIRS as $sourcedir) {
      exec($CHECKCMD . " " . escapeshellcmd($sourcedir), $output);

      if (0 < count($output)) {
        print($sourcedir . "\n");

        $status = $status + count($output);

        $output = array();
      }
    }
  } catch (Exception $e) {
    $status = "error";
  }

  file_put_contents($CHECKFILE, $CHECKDATE . " = ". $status);
?>

In meinem persönlichen Fall habe ich es so gemacht, dass die Prüfdatei wiederum per Webbrowser abrufbar ist. So kann ich auch unterwegs relativ schnell den Status überprüfen. Man könnte auch hergehen und bei Abweichungen eine E-Mail versenden. Dafür muss am Ende des Scripts einfach nur geguckt werden, ob "(0 !== $status)" ist.

Um nun regelmäßig zu prüfen, ob eine Änderung stattgefunden hat, kann man das Script (z.B. stündlich) via Cron aufrufen lassen. Natürlich kann man es auch zwischendurch händisch aufrufen, falls man das Verlangen danach hat. Folgende Zeile kann man in seine "/etc/crontab" schreiben:

1
0 * * * * root php /var/check/check.phs >/dev/null 2>&1

So schnell hat man mit einfachen Mitteln eine kleine Serverüberwachung implementiert. Frei Haus bekommt man obendrein eine Versionsverwaltung seiner Webseite geschenkt. Diese kann sich vor allem bei kleineren Webseiten als durchaus nützlich erweisen. Man sollte das ganze jedoch nicht ausschließlich anstelle eines regelmäßigen, ordentlichen Backups verwenden. 🙂

Überwachende Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.