Benutzer:Kirmse/fip05

Aus Delixs
Zur Navigation springen Zur Suche springen

Name

fip4arktur4 = feste IP-Adressen für Arktur 4

Installation

  • Download von http://www.arktur.th.schule.de/fip4arktur4.zip
  • bringen Sie die Datei als root nach /root
  • entpacken Sie die Datei (z.B. mit dem MC)
  • geben Sie dem Script ausreichende Rechte
    • chown root:root fip4arktur4.pl
    • chmod 0700 fip4arktur4.pl
  • die aktuelle Version finden Sie als Quelltext hier im Wiki.

Aufruf

./fip4arktur4.pl              # Konsolenversion
./fip4arktur4.pl -h           # die Hilfe (alle Parameter)

Kurzfassung

fip4arktur4 dient zur automatischen Einrichtung von festen IP-Adressen sowie der Datenübernahme von alten Arkturversionen. Dazu liest das Script aus der aktuellen dhcpd.leases (optional: dhcpd.leases~) oder einer übergebenen dhcpd.conf bzw. alten dhcpd.leases die Rechnernamen, die MAC-Adressen und die IPs aus. Falls die Bildungsvorschrift für den Rechnernamen eingehalten wurde, erkennt das Script selbst die Gruppeneinteilung. Alternativ kann dem Script auch eine neue Bildungsvorschrift als Regex oder als Code-Schnipsel übergeben werden.

Konzept

Um ein realistisches Konzept zu erstellen, wurde ersteinmal davon ausgegangen, dass man alle Optionen offen hat, wie es bei der kompletten Neueinrichtung eines Schulnetzes gegeben ist. Wenn hierfür eine praktikable Lösung in Sicht ist, sollten die Einschränkungen "aufgeweicht" werden.

die Neueinrichtung eines Schulnetzes als Ausgangspunkt

Es wird davon ausgegangen, dass alle Arbeitsplatzrechner mindestens einmal im Netz angemeldet worden sind, wobei die IP-Adresse durch den DHCP-Server vergeben wurde. Beim ersten Aufruf dieses Scripts wird die dhcpd.leases gelesen und daraus die Rechnernamen und MAC-Adressen ausgelesen. Wenn dem Script die Bildungsvorschrift für den Rechnernamen bekannt ist, dann kann mit einem regulären Ausdruck daraus die Gruppenzugehörigkeit ermittelt werden.

Nach dem Ermitteln der Gruppierungen sollten diese Gruppen nach der Anzahl der Rechner sortiert und danach entsprechende Namen generiert werden (Raum01, Raum02, usw.). Beim Einsortieren der Rechner in diese Gruppen können dann die IP-Adressen z.B. nach dem Vorschlag im Wiki hochgezählt werden. Damit wären alle Daten vorhanden und die Datei computer kann auf die Festplatte geschrieben werden.

Damit dem Script die Bildungsvorschrift bekannt gemacht werden kann, wurde einfach (von mir) folgende Bildungsvorschrift vorgegeben: der Rechnernamen wird zusammengesetzt aus einem Bezeichner für den Raum und dann einem Bezeichner für den Rechner mit einer Nummer. Anm. für Experten: das Script verwendet als regulären Ausdruck "(.*\D+)\d+", um damit die Gruppierungen zu finden.

Beispiel bei uns: KAB2AP01, KAB2AP02, KAB2AP03 usw. als Rechnernamen für unser zweites Kabinett, für die Medien-Ecke in Mathematik MathePC01, MathePC02 und MathePC03 und für die Medien-Ecke in Geographie Geo01, Geo02, Geo03 usw.

Schwachpunkt dieser Lösung ist, dass die Bezeichnung der Gruppen/Räume fest vorgegeben ist. Es wird nun folgende Strategie verfolgt:

  • Die vom Script erkannten Gruppennamen (als Teil des Rechnernamens) sollten in derselben Reihenfolge wie die generierten Namen auf dem Monitor angezeigt werden.
  • Bei einem erneuten Aufruf des Scripts braucht man dann nur in derselben Reihenfolge die gewünschten Gruppennamen zu übergeben und das Script führt alles nocheinmal genauso aus, nur das jetzt die übergebenen Gruppennamen verwendet werden.

Fazit: das Script muss zweimal aufgerufen werden. Beim zweiten Mal müssen dem Script zusätzlich die Gruppennamen in der richtigen Reihenfolge mitgegeben werden.

Einrichtung eines neuen Servers bei vorhandenem Netz

Es dürfte häufiger der Fall sein, dass man z.B. von Arktur 3.X auf Arktur 4 umsteigt und möchte natürlich die Einrichtung des vorhandenen Netzes erhalten wissen, insbesondere wenn in die Einrichtung und Konfiguration der Clients viel Zeit investiert wurde.

Eine andere Bildungsvorschrift für die Rechnernamen
Um dem Script eine andere Bildungsvorschrift beizubringen, braucht man dem Script nur einen anderen regulären Ausdruck übergeben. z.B. bedeutet "\D+\d+(\D+\d*)", dass der Raum nach dem Rechner angegeben wird, wobei immer der Rechner mit einer Zahl endet und der Raum mit einem Buchstaben beginnt. Beispiele dazu wären AP05Kab2 oder PC3Geo. Wenn man für alle Rechnernamen die Bildungsvorschrift nach dem Beispiel im Wiki verwenden würde, wäre die Regex "pc-(\d+)-\d+". Der Ausdruck in der Klammer ist derjenige, der temporaer für die Gruppe verwendet wird. Anm. fuer Experten: der Klammerausdruck wird an die Variable $1 übergeben.
Obwohl diese Variante schon sehr ausdrucksstark ist und sicher schon sehr viele Möglichkeit abdeckt, können reguläre Ausdrücke mit 2 Klammern nur dann verwendet werden, wenn die erste Klammer den Gruppennamen ergibt. Kompliziertere Ausdrücke oder gar Verzweigungen sind ebenso wie der Zugriff auf die IP nicht möglich. Deswegen ist noch vorgesehen, als Alternative gleich den Teil des Programm-Codes, welcher den Gruppennamen heraussucht, als Code-Schnipsel in einem Textfile zu übergeben. Auch dazu ein Beispiel: Angenommen man hätte 2 Räume und im ersten Raum heißen die Rechner Aachen, Bremen, Cottbus, usw. und im zweiten Raum ClientA-40, ClientA-41, usw. dann könnte in einer Textdatei folgender Code übergeben werden:
  if ( $pc =~ m/ClientA-\d+/ ) { 
    $gruppe = Raum2 
  } else { 
    $gruppe = Raum1 
  } 
Es dürfte kein Problem darstellen, eine dokumentierte Sammlung von solchen Code-Schnipseln bereitzustellen. In "schan-user" sind genügend Entwickler präsent, die ebenfalls solche Code-Schnipsel erstellen können.
Gruppieren der Rechner anhand der IP-Adresse
Bei Arktur 3.X wurden bei der Nutzung von mehreren physischen Teilnetzen die IP-Adressen nach dem Muster 192.168.<Teilnetz>.* vergeben, wobei für das erste Teilnetz die "0", für das zweite die "1" usw. vergeben wurde. Wenn diese Gruppierung übernommen werden soll, dann bietet sich an, folgenden Code-Schnipsel in einer Textdatei zu übergeben:
  my $nr  = ( $ip =~ /192\.168\.(\d).\d+/ );
  $gruppe = 'Teilnetz'.$nr; 
Die temporären Gruppennamen würden dann Teilnetz0, Teilnetz1, ... heißen.
Übernahme vorhandener Rechnergruppierungen
Falls schon Rechnergruppierungen eingerichtet wurden, dann sollte diese Konfigurationen übernommen werden können. Hier wurde an die Lösungen für die Freischaltung des Internets von Gisbert Friege und Alfred Bergkemper gedacht.

Nach dem Ermitteln der Gruppierungen sollten diese Gruppen nach der Anzahl der Rechner sortiert und danach entsprechende Namen generiert werden (Raum01, Raum02, usw.). Beim Einsortieren (nach dem Namen) der Rechner in diese Gruppen können dann die IP-Adressen nach dem Vorschlag im Wiki hochgezählt werden. Damit wären alle Daten vorhanden und die Datei computer kann auf die Festplatte geschrieben werden.

Schwachpunkt dieser Lösung ist, dass die Bezeichnung der Gruppen (Räume) fest vorgegeben ist. Es wird nun folgende Strategie verfolgt:

  • Die vom Script erkannten Gruppennamen (als Teil des Rechnernamens) sollten in derselben Reihenfolge wie die generierten Namen auf dem Monitor angezeigt werden.
  • Bei einem erneuten Aufruf des Scripts braucht man dann nur in derselben Reihenfolge die gewünschten Gruppennamen zu übergeben und das Script führt alles nocheinmal genauso aus, nur das es jetzt die angedachten Gruppennamen verwendet.

weiteren Rechnern feste IPs vergeben (mehrfacher Aufruf)

Die nächste Überlegung war, dass bestehende Einrichtungen um weitere Rechner erweitert werden könnten. Das bedeutet, dass das Script nicht die vorhandenen Daten im LDAP überschreiben darf, sondern bei schon vorhandenen Gruppen mit der Numerierung beim Vergeben der IPs fortsetzt. Außerdem dürfen Rechner, die schon im LDAP stehen nicht nochmal erfasst werden. Dazu ist es notwendig, dass das Script aus dem LDAP die schon vorhandenen Rechner(namen), die Gruppen und die vergebenen IPs erhält und entsprechend verarbeitet.

Integration ins Sysadmin-Menü

Unter der letzten Bedingung, dass dieses Script mehrfach aufgerufen werden kann (also die festen IPs in Etappen vergeben werden können), wäre es sinnvoll, dieses Script ins Sysadmin-Menü zu integrieren.

Ein Menü für dieses Script

Es ergeben sich aus meiner Sicht zwei verschiedene Herangehensweisen, nämlich einmal ein Shell-Script als Wrapper für dieses Perlscript zu schreiben oder innerhalb dieses Scripts über system()-Aufrufe die Dialogfenster zu erzeugen. Unabhängig von den gerade genannten Möglichkeiten erscheint folgendes auf jeden Fall machbar:

  • es wird zuerst ein Dialogtyp "checklist" aufgerufen, wo alle Optionen "angeklickt" werden können, die man auch über die Kommandozeile aufrufen könnte.
  • für alle aktivierten Menüpunkte wird dann Nacheinander ein Fenster (vermutlich vom Typ "inputbox") aufgerufen.
  • das letzte Fenster ruft dann das (eigentliche) Script auf.

Das ist m.E. auf jeden Fall machbar. Aber obwohl das erste Dialogfenster nur (maximal) soviel Menüpunkte hat, wie es Optionen für dieses Script gibt, erscheint mir diese Zahl für einen Einsteiger-Admin viel zu hoch. Es sollte deshalb nach Möglichkeiten gesucht werden, nur die Menüpunkte anzuzeigen, die für diese Konfiguration sinnvoll sind. Ein weiteres Problem sehe ich in der Tatsache, dass bei mehrfachen Aufrufen jedesmal dieselben Eingaben getätigt werden müssen. Auch das ist sicher nicht optimal und noch dazu fehlerträchtig.

Fazit dieser Überlegung, dass das Menü nicht fest vorgegeben werden sollte, sondern entsprechend den Gegebenheiten vor Ort ein Menü generiert werden sollte. Zumindest für mich scheint damit die Lösung innerhalb des Perlscripts deutlich einfacher.

ein einfaches Menü für dieses Script

Um zu weiteren Vereinfachungen zu kommen, wird nochmal der eigentliche Ausgangspunkt betrachtet. Es ging um das Auslesen der dhcpd.leases und beim zweiten Aufruf werden zusätzlich noch die Gruppennamen übergeben. Die meisten Parameter betreffen die Ersteinrichtung oder die Übernahme. Danach machen diese Parameter keinen Sinn mehr, brauchen also auch nicht mehr bereitgestellt werden. Das Script wäre durchaus in der Lage, diese Situation zu erkennen, weil ja keine Daten vom LDAP geliefert werden.

Solche Parameter wie die Bildungsvorschrift (Regex oder Code-Schnipsel) werden sich normalerweise nicht ändern. Es reicht also, wenn diese Daten einmal bereitgestellt werden und das bedeutet entweder, dass die Eingaben gespeichert oder als File bereitgestellt werden.

Wenn man jetzt noch den Ort festlegt, wo solche Dateien bereitgestellt werden, dann brauchen die über das Menü gar nicht mehr abgefragt werden, sondern das Script sucht sofort nach den entsprechenden Dateien in diesem festgelegten Verzeichnis und stellt entsprechend dieser Informationen ein einfaches Menü bereit. Da diese Dateien dort liegen bleiben können, wäre auch abgesichert, dass bei einem erneuten Aufruf wieder dieses einfache Menü erscheint.

Das bedeutet, wenn möglich werden Dateien an fest vorgegebenen Platz übergeben. Das Script erkennt die entsprechende Datei an der Endung. Damit sollte sich jede Variante mit 2 Fenstern abarbeiten lassen.

Ein Menü mit allen Optionen (Expertenmodus) sollte trotzdem möglich sein. Es erscheint auch sinnvoll, mehrere mögliche Orte anzugeben, die durch das Script abgearbeitet werden. Sollten die nicht im favorisierten Verzeichnis gefunden werden, dann werden die durch das Script dorthin kopiert.

Beschreibung

der Entwicklungsstand des Scripts hier dem Stand bis einschließlich Punkt 5.2.2.

Man ruft es mit ./fip4arktur4.pl auf. Es erstellt dann sofort die Datei computer, aber die Räume bzw. Rechnergruppierungen heißen dann Raum01, Raum02, usw. Sie erhalten auf dem Monitor eine Zusammenfassung, welche Gruppen erkannt und wie die Gruppen bezeichnet wurden.

Sie rufen das Script noch einmal auf, wobei Sie dem Script eine Liste mit den von Ihnen gewünschten Namen übergeben, und zwar in derselben Reihenfolge. z.B.: ./fip4arktur4 -n Kabinett1,Kabinett2,Geografie. Dann wird die Datei computer mit diesen Bezeichnern erstellt.

Optionen

Sie koennen das Script mit folgenden Parametern aufrufen:

  -d  oder  -debug       Schalter, dann wird geloggt (fip4arktur4.log)
  -g  oder  -gen_ip      1 oder 0 uebergeben, generieren der IP an/aus
  -r  oder  -regex       regulaeren Ausdruck fuer Bildungsvorschrift
  -q  oder  -quellcode   Pfad fuer Datei mit Code fuer Gruppennamen
  -n  oder  -namen       fuer Namensliste der Gruppen
  -l  oder  -lease       Pfad fuer dhcpd.leases-Datei
  -c  oder  -conf        Pfad fuer dhcpd.conf-Datei
  -e  oder  -extended    Schalter, dann auch dhcpd.leases~
  -h  oder  -help        diese Hilfe

Fehlerbehandlung

es sind weniger Rechner gefunden worden, als Sie erwartet haben

Die fehlenden Rechner sind entweder noch nicht oder nicht mehr in der leases-Datei erfasst. Im ersten Fall müssen die Rechner im Netz bekannt gemacht werden, wobei sie vom DHCP-Server die IP erhalten müssen. Im zweiten Fall könnten die Daten im Backup der dhcpd.leases stehen. Mit dem Schalter -e wird zusätzlich die dhcpd.leases~ ausgewertet.

es sind viel mehr Teilnetze, als Sie erwartet haben

Dann sind die Rechnernamen nicht nach der verwendeten Bildungsvorschrift vergeben worden. Das könnten einfach Schreibfehler im Rechnernamen sein oder aber, Sie haben eine andere Bildungsvorschrift verwendet. Bei Schreibfehlern geht es am schnellsten, wenn Sie die Datei 'computer' editieren (die Gruppe und die IP anpassen). Falls Sie eine andere Bildungsvorschrift verwendet haben, sollten Sie das Script nochmal aufrufen, wobei Sie Ihre Bildungsvorschrift als Regex oder als Code-Schnipsel übergeben.

völlig andere Probleme

Sollten andere (unerwartete) Probleme auftreten, dann verwenden Sie den Schalter -d für Debug. Dann schreibt das Script nach jedem Schritt (siehe Hauptprogramm) die Daten in ein Logfile fip4arktur4.log im aktuellen Verzeichnis. Lenken Sie die Ausgabe auf der Standardausgabe in eine Datei um (z.B. mit ./fip4arktur4.pl > ausgabe.txt) und schicken Sie mir diese beiden Dateien mit einem Kommentar, was Sie erwartet haben.

Changelog

  • 25.10.2005 erstes lauffähiges Script und Doku im Netz, Übergabe der Bildungsvorschrift als Regex möglich, Einlesen einer alten dhcpd.conf- und dhcpd.leases-Datei möglich
  • 26.10.2005 Anwenderhandbuch
  • 27.10.2005 neue Ablaufsteuerung ($status), Hilfefunktion, arbeitet nun auch mit 2 Dateien bzw. der dhcpd.leases~
  • 29.10.2005 debug-Funktion, Übergabe Code-Schnipsel, diese Doku, kleine Verbesserungen

Todo

  • Nutzung der Daten des Friege-Scripts und der Bergkemper-Lösung
  • Nutzung der Daten aus dem LDAP
  • Erkennen der übergebenen Dateien
  • Menü (Dialog-Shell)

Copyright, Lizenz

(c) Hans-Dietrich Kirmse, Erasmus-Reinhold-Gymnasium Saalfeld, Thüringen
Dieses Script und seine Doku steht unter der GPL

Dank

  • Steffen Schwiggon (Perl Mongers Dresden)