Benutzer:Kirmse/fip03: Unterschied zwischen den Versionen

Aus Delixs
Zur Navigation springen Zur Suche springen
(Formatierung korrigiert)
(neue Ablaufsteuerung, Hilfe)
Zeile 2: Zeile 2:


einfach mit der Maus runterkratzen :)
einfach mit der Maus runterkratzen :)




  <font color="#C0C0C0"><i>#!/usr/bin/perl -w</i></font>
  <font color="#C0C0C0"><i>#!/usr/bin/perl -w</i></font>
   
   
  use strict;                        <font color="#C0C0C0"><i># Variablen -> deklariert sein</i></font>
  use strict;                        <font color="#C0C0C0"><i># Variablen deklarieren</i></font>
  use Getopt::Long;                  <font color="#C0C0C0"><i># fuer Kommandozeilenparameter</i></font>
  use Getopt::Long;                  <font color="#C0C0C0"><i># fuer Kommandozeilenparameter</i></font>
   
   
Zeile 16: Zeile 15:
  <font color="#C0C0C0"><i># Voreinstellung gilt für Arktur 4, wird aber ueber schrieben,</i></font>
  <font color="#C0C0C0"><i># Voreinstellung gilt für Arktur 4, wird aber ueber schrieben,</i></font>
  <font color="#C0C0C0"><i># wenn man mit Kommandozeilenparameter -f eine Datei uebergibt</i></font>
  <font color="#C0C0C0"><i># wenn man mit Kommandozeilenparameter -f eine Datei uebergibt</i></font>
  my $leasedatei = "dhcpd.leases";
  my $leasedatei = "dhcpd.leases";
   
   
  <font color="#C0C0C0"><i># hier die Bildungsvorschrift fuer den Namen als Regex uebergeben</i></font>
  <font color="#C0C0C0"><i># hier die Bildungsvorschrift fuer den Namen als Regex uebergeben</i></font>
Zeile 32: Zeile 31:
  <font color="#C0C0C0"><i># Parameter -n oder -name ueberschrieben werden.</i></font>
  <font color="#C0C0C0"><i># Parameter -n oder -name ueberschrieben werden.</i></font>
  my $name  = 'Raum:2';
  my $name  = 'Raum:2';
<font color="#C0C0C0"><i># hier wird die Datei festgelegt, die erstellt wird</i></font>
my $datei = 'computer';
   
   
   
   
Zeile 37: Zeile 39:
   
   
  <font color="#C0C0C0"><i># Deklaration der globalen Variablen</i></font>
  <font color="#C0C0C0"><i># Deklaration der globalen Variablen</i></font>
my @daten = ();                    <font color="#C0C0C0"><i># Element = Zeile von 'computer'</i></font>
my @temp1 = ();                    <font color="#C0C0C0"><i># Daten vom 1. File</i></font>
my @temp2 = ();                    <font color="#C0C0C0"><i># Daten vom 2. File</i></font>
my $liste = "";                    <font color="#C0C0C0"><i># String mit temp.Gruppennamen</i></font>
my $liste2 = "";                  <font color="#C0C0C0"><i># String mit gener. Gruppennamen</i></font>
my %gruppen = ();                  <font color="#C0C0C0"><i># Gruppenname => \@Gruppe</i></font>
my $datei = "computer";            <font color="#C0C0C0"><i># Daten nicht ok, dann .= '.not_okay'</i></font>
my $startwerte = 20;              <font color="#C0C0C0"><i># Initialisierung fuer IP</i></font>
   
   
  <font color="#C0C0C0"><i># Deklaration Variablen für Parameter, wenn kein Schalter: undef</i></font>
  my (@daten,@daten1,@daten2,@daten3,$liste1,$liste2,%gruppen,
  my $namen;                        <font color="#C0C0C0"><i># Namensliste als String (Komma)</i></font>
    $start1,$start2,$debug,$verbose,$gen_ip,$keinldap,$reg,
my $reg;                          <font color="#C0C0C0"><i># Regex fuer Bildungsvorschrift</i></font>
    $namen,$lease,$conf,$friege,$bergkemper,$extended,$code,
  my $conf;                          <font color="#C0C0C0"><i># alte dhcpd.conf</i></font>
    $status);
my $leases;                       <font color="#C0C0C0"><i># alte dhcpd.leases</i></font>
<font color="#C0C0C0"><i># hier werden die Zuordnungen fuer die Parameter erstellt</i></font>
GetOptions (                      <font color="#C0C0C0"><i># Parameter fuer:</i></font>
    'debug'        => \$debug,     <font color="#C0C0C0"><i># Schalter, dann wird viel geloggt</i></font>
    'verbose'      => \$verbose,    <font color="#C0C0C0"><i># Schalter -> viele Meldungen</i></font>
    'gen_ip=i'    => \$gen_ip,    <font color="#C0C0C0"><i># 1|0 - IP generieren an/aus</i></font>
    'keinldap'    => \$keinldap,  <font color="#C0C0C0"><i># Schalter, dann kein LDAP</i></font>
    'regex=s'      => \$reg,        <font color="#C0C0C0"><i># fuer Bildungsvorschrift</i></font>
    'quellcode=s' => \$code,      <font color="#C0C0C0"><i># -- reserviert --</i></font>
    'namen=s'      => \$namen,      <font color="#C0C0C0"><i># fuer Namensliste - Gruppen</i></font>
    'lease=s'      => \$lease,      <font color="#C0C0C0"><i># fuer dhcpd.leases-Datei</i></font>
    'conf=s'      => \$conf,      <font color="#C0C0C0"><i># fuer dhcpd.conf-Datei</i></font>
    'friege=s'    => \$friege,    <font color="#C0C0C0"><i># fuer Konf.datei dieses Scripts</i></font>
    'bergkemper=s' => \$bergkemper, <font color="#C0C0C0"><i># fuer Konf.dateien dieses Scripts</i></font>
    'extended'    => \$extended,  <font color="#C0C0C0"><i># Schalter -> auch dhcpd.leases~</i></font>
    'help'        => \&hilfe);     <font color="#C0C0C0"><i># zeigt dann Parameter u. Aufrufe</i></font>
my $leasebackup = $leasedatei.'~';
   
   
   
   
  <font color="#C0C0C0"><i># =================== Hauptprogramm =============================</i></font>
  <font color="#C0C0C0"><i># =================== Hauptprogramm =============================</i></font>
   
   
  <font color="#C0C0C0"><i># ------- 1. Schritt: Kommandozeilenparameter uebernehmen -------</i></font>
  <font color="#C0C0C0"><i># ------- 1. Schritt: Status bestimmen --------------------------</i></font>
<font color="#C0C0C0"><i># in $status werden die folgenden Informationen gespeichert.</i></font>
<font color="#C0C0C0"><i># Hinweis: meine Zählung beginnt ab "1", dass entspricht 2^0</i></font>
<font color="#C0C0C0"><i>#------------------------------------------------------</i></font>
<font color="#C0C0C0"><i># nur  1. Bit gesetzt (DEBUG)      =>  $status =    1;</i></font>
<font color="#C0C0C0"><i># nur  2. Bit gesetzt (VERBOSE)    =>  $status =    2;</i></font>
<font color="#C0C0C0"><i># nur  3. Bit gesetzt (GEN_IP)      =>  $status =    4;</i></font>
<font color="#C0C0C0"><i># nur  4. Bit gesetzt (LDAP)        =>  $status =    8;</i></font>
<font color="#C0C0C0"><i># nur  5. Bit gesetzt (REGEX)      =>  $status =  16;</i></font>
<font color="#C0C0C0"><i># nur  6. Bit gesetzt (NAMEN)      =>  $status =  32;</i></font>
<font color="#C0C0C0"><i># nur  7. Bit gesetzt (CONFDATEI)  =>  $status =  64;</i></font>
<font color="#C0C0C0"><i># nur  8. Bit gesetzt (LEASEDATEI)  =>  $status =  128;</i></font>
<font color="#C0C0C0"><i># nur  9. Bit gesetzt (LEASEBACKUP) =>  $status =  256;</i></font>
<font color="#C0C0C0"><i># nur 10. Bit gesetzt (FRIEGE)      =>  $status =  512;</i></font>
<font color="#C0C0C0"><i># nur 11. Bit gesetzt (BERGKEMPER)  =>  $status = 1024;</i></font>
<font color="#C0C0C0"><i># nur 12. Bit gesetzt -reserviert-  =>  $status = 2048;</i></font>
<font color="#C0C0C0"><i># nur 13. Bit gesetzt (Datenfehler) =>  $status = 4096;</i></font>
<font color="#C0C0C0"><i>#------------------------------------------------------</i></font>
<font color="#C0C0C0"><i># Bsp.: 3. Bit wird gesetzt:  $status = $status | 4 ;  - "or"</i></font>
<font color="#C0C0C0"><i># Bsp.: 3. Bit wird negiert:  $status = $status ^ 4 ;  - "xor"</i></font>
<font color="#C0C0C0"><i># alles bitweise negieren:    $status = ~$status    ;  - "not"</i></font>
<font color="#C0C0C0"><i># Bsp.: 3. Bit wird abgefragt: if ($status & 4) { ... } - "and"</i></font>
<font color="#C0C0C0"><i># Bsp.: 3. Bit wird geloescht: $status = $status & ~4;</i></font>
<font color="#C0C0C0"><i># standardmaessig IP generiert ->    3. Bit gesetzt</i></font>
<font color="#C0C0C0"><i># standardmaessig LDAP verwendet ->  4. Bit gesetzt</i></font>
<font color="#C0C0C0"><i># standardmaessig lease-Datei ->    12. Bit gesetzt</i></font>
$status = 4 + 8 + 2048;
<font color="#C0C0C0"><i># Schalter -> viel geloggt, dann      1. Bit gesetzt</i></font>
$status = $status | 1  if (defined($debug));
   
   
  <font color="#C0C0C0"><i># hier werden die Zuordnungen fuer die Parameter erstellt</i></font>
  <font color="#C0C0C0"><i># Schalter -> viele Meldungen, dann  2. Bit gesetzt</i></font>
  <font color="#C0C0C0"><i># Bsp.: 'conf' bedeutet Aufruf mit "-c dhcpd_alt.conf"</i></font>
$status = $status | 2  if (defined($verbose));
  GetOptions (                       <font color="#C0C0C0"><i># Parameter fuer:</i></font>
   'namen=s'     => \$namen,      <font color="#C0C0C0"><i># Namensliste</i></font>
  <font color="#C0C0C0"><i># Schalter 0|1, dann wird Voreinstellung ueberschrieben</i></font>
   'regex=s'     => \$reg,        <font color="#C0C0C0"><i># Regex</i></font>
  if (defined($gen_ip)) {
   'conf=s'      => \$conf,        <font color="#C0C0C0"><i># Pfad fuer alte dhcpd.conf</i></font>
   if ($gen_ip == 0) {
  'leases=s'    => \$leases);     <font color="#C0C0C0"><i># Pfad fuer alte dhcpd.leases</i></font>
     $status = $status & ~4          <font color="#C0C0C0"><i># 3. Bit geloescht</i></font>
   } else {
     $status = $status | 4          <font color="#C0C0C0"><i># 3. Bit gesetzt</i></font>
   }
}
<font color="#C0C0C0"><i># Schalter -> kein LDAP, dann        4. Bit loeschen</i></font>
$status = $status & ~8  if (defined($keinldap));
   
   
  <font color="#C0C0C0"><i># wenn Regex uebergeben, dann wird Voreinstellung ueberschrieben</i></font>
  <font color="#C0C0C0"><i># wenn Regex uebergeben, dann wird Voreinstellung ueberschrieben</i></font>
  if (defined($reg)) { $regex = $reg }
  if (defined($reg)) {
  $status = $status | 16 ;          <font color="#C0C0C0"><i># 5. Bit gesetzt</i></font>
  $regex = $reg
}
<font color="#C0C0C0"><i># wenn Namensliste uebergeben, dann  6. Bit gesetzt</i></font>
$status = $status | 32  if (defined($namen));
<font color="#C0C0C0"><i># wenn dhcpd.conf uebergeben, dann</i></font>
if (defined($conf)) {
  $status = $status | 64 ;        <font color="#C0C0C0"><i>#  7. Bit gesetzt</i></font>
  $status = $status & ~ 4;        <font color="#C0C0C0"><i>#  3. Bit geloescht (keine IP)</i></font>
  $status = $status & ~2048;      <font color="#C0C0C0"><i># 12. Bit geloescht (k. Lease)</i></font>
}
<font color="#C0C0C0"><i># wenn leases-Datei uebergeben, dann wird Einstellung ueberschrieben</i></font>
if (defined($lease)) {
  $status = $status | 128 ;        <font color="#C0C0C0"><i>#  8. Bit gesetzt</i></font>
  $status = $status & ~ 4;        <font color="#C0C0C0"><i>#  3. Bit geloescht (keine IP)</i></font>
  $status = $status | 2048;        <font color="#C0C0C0"><i># 11. Bit gesetzt</i></font>
  $leasedatei = $lease
}
<font color="#C0C0C0"><i># wenn dhcpd.leases~ uebergeben</i></font>
if (defined($extended)) {
  <font color="#C0C0C0"><i># aber nur, wenn die aktuelle leases verwendet wird</i></font>
  unless ($status & (64 + 128)) {
    $status = $status | 256        <font color="#C0C0C0"><i>#  9. Bit gesetzt</i></font>
  }
}
<font color="#C0C0C0"><i># Konf. Friege-Script uebergeben,    10. Bit gesetzt</i></font>
$status = $status | 512  if (defined($friege));
   
   
  <font color="#C0C0C0"><i># wenn leases-Datei uebergeben, dann wird Voreinstellung ueberschrieben</i></font>
  <font color="#C0C0C0"><i># Konf. Bergkemper uebergeben, dann 11. Bit gesetzt</i></font>
  if (defined($leases)) { $leasedatei = $leases }
$status = $status | 1024 if (defined($bergkemper));
   
   
   
   
  <font color="#C0C0C0"><i># ------- 2. Schritt: Einlesen der Daten ------------------------</i></font>
  <font color="#C0C0C0"><i># ------- 2. Schritt: Einlesen der Daten ------------------------</i></font>
   
   
  <font color="#C0C0C0"><i># wenn eine conf-Datei uebergeben wurde, dann wird diese genommen</i></font>
  <font color="#C0C0C0"><i># initialisieren</i></font>
  if (defined($conf)) {
@daten = @daten1 = @daten2 = @daten3 = ();
  @daten  = &einlesen_conf($conf)
  } else {
<font color="#C0C0C0"><i># gewuenschten Daten werden eingelesen, falls in der</i></font>
  @daten  = &einlesen_leases($leasedatei)
<font color="#C0C0C0"><i># dhcpd.conf keine IP-Adressen stehen, dann wird 3. Bit gesetzt</i></font>
  }
  ($status,@daten1)= &einlesen_conf($status,$conf) if ($status & 64);
@daten2  = &einlesen_leases($leasedatei)  if ($status & 2048);
  <font color="#C0C0C0"><i>#@daten3  = &einlesen_leases($leasebackup) if ($status & 256);</i></font>
<font color="#C0C0C0"><i># und zusammengefuegt (Reihenfolge ist Wesentlich!)</i></font>
push @daten, @daten1, @daten2, @daten3;
   
   
   
  <font color="#C0C0C0"><i># ------- 3. Schritt: Vernichten von Doubletten -----------------</i></font>
  <font color="#C0C0C0"><i># ------- 3. Schritt: Vernichten von Doubletten -----------------</i></font>
   
   
  <font color="#C0C0C0"><i># bei der dhcpd.leases ist es bei kurzer LEASE-Time normal,</i></font>
  <font color="#C0C0C0"><i># bei der dhcpd.leases ist es z.B. bei kurzer LEASE-Time normal,</i></font>
  <font color="#C0C0C0"><i># dass fuer einen Rechner mehrere Eintraege (Doubletten) stehen</i></font>
  <font color="#C0C0C0"><i># dass fuer einen Rechner mehrere Eintraege (Doubletten) stehen,</i></font>
  <font color="#C0C0C0"><i># sicherheitshalber vernichten wir in Bezug auf die MAC und Namen</i></font>
  <font color="#C0C0C0"><i># diese vernichten wir in Bezug auf die MAC-Adresse</i></font>
  @daten  = &vernichte_Doubletten(@daten);
  @daten  = &vernichte_Doubletten(@daten);
   
   
Zeile 93: Zeile 182:
  <font color="#C0C0C0"><i># mit Hilfe der Regex versuchen wir die Gruppen zu bestimmen</i></font>
  <font color="#C0C0C0"><i># mit Hilfe der Regex versuchen wir die Gruppen zu bestimmen</i></font>
  <font color="#C0C0C0"><i># mit diesen (temporaeren) Namen ueberschreiben wir das 4. Feld</i></font>
  <font color="#C0C0C0"><i># mit diesen (temporaeren) Namen ueberschreiben wir das 4. Feld</i></font>
  @daten   = &bestimme_Gruppen($regex,@daten);
  @daten = &bestimme_Gruppen($regex,@daten);
  $liste  = &bestimme_Gruppenliste(@daten);
  $liste1 = &bestimme_Gruppenliste(@daten);
<font color="#C0C0C0"><i># ------- 4. Schritt: Testen der Daten --------------------------</i></font>
<font color="#C0C0C0"><i># noch nicht implementiert</i></font>
   
   
   
   
Zeile 102: Zeile 196:
  <font color="#C0C0C0"><i># werden entsprechend der Anzahl der PCs sortiert und innerhalb</i></font>
  <font color="#C0C0C0"><i># werden entsprechend der Anzahl der PCs sortiert und innerhalb</i></font>
  <font color="#C0C0C0"><i># der Gruppe alphabetisch nach dem Rechnernamen</i></font>
  <font color="#C0C0C0"><i># der Gruppe alphabetisch nach dem Rechnernamen</i></font>
  ($liste,@daten) = &sortieren($liste,@daten);
  ($liste1,@daten) = &sortieren($liste1,@daten);
   
   
   
   
Zeile 108: Zeile 202:
   
   
  <font color="#C0C0C0"><i># es wird in gleicher Reihenfolge der temp. Namen ein Name generiert</i></font>
  <font color="#C0C0C0"><i># es wird in gleicher Reihenfolge der temp. Namen ein Name generiert</i></font>
  $liste2  = &generiere_Gruppennamen($name,$liste);
  $liste2  = &generiere_Gruppennamen($name,$liste1);
  <font color="#C0C0C0"><i># es wird das 4. Feld von @daten ueberschrieben</i></font>
  <font color="#C0C0C0"><i># es wird das 4. Feld von @daten ueberschrieben</i></font>
  @daten  = &setze_Gruppenname($liste,$liste2,$namen,@daten);
  @daten  = &setze_Gruppenname($liste1,$liste2,$namen,@daten);
   
   
   
   
Zeile 116: Zeile 210:
   
   
  <font color="#C0C0C0"><i># es wird das 1. Feld @daten ueberschrieben</i></font>
  <font color="#C0C0C0"><i># es wird das 1. Feld @daten ueberschrieben</i></font>
  unless (defined($conf) or defined($leases)) {
  if ($status & 4) {
   @daten  = &setze_ip(@daten)
   @daten  = &setze_ip(@daten)
  }
  }
   
   
  <font color="#C0C0C0"><i># ------- 8. Schritt: Schreiben der Datei 'computer' ------------</i></font>
  <font color="#C0C0C0"><i># ------- 8. Schritt: Schreiben der Datei 'computer' ------------</i></font>
Zeile 126: Zeile 221:
  print "\n";
  print "\n";
   
   
  unless (defined($namen)) {
<font color="#C0C0C0"><i># wenn keine Namen uebergeben wurden, dann ...</i></font>
  unless ($status & 32) {
   print 'Es wurden die Namen Raum01, Raum02, ... vergeben'."\n";
   print 'Es wurden die Namen Raum01, Raum02, ... vergeben'."\n";
   print 'Als temporaere Namen wurden in dieser Reihenfolge ermittelt:'."\n\n";
   print 'Als temporaere Namen wurden in dieser Reihenfolge ermittelt:'."\n\n";
   print $liste."\n"
   print $liste1."\n"
  } else {
  } else {
   print "bin fertig! \n"
   print "bin fertig! \n";
  }
  }
   
   
   
   
<font color="#C0C0C0"><i># =================== Funktionen ================================</i></font>
   
   
  <font color="#C0C0C0"><i># =================== Funktionen ================================</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
<font color="#C0C0C0"><i># Funktion: gibt die Parameter und ein Beispiel fuer einen Aufruf aus</i></font>
<font color="#C0C0C0"><i># Aufruf:  als Kommandozeilenparameter (Schalter) ./fip -h</i></font>
<font color="#C0C0C0"><i># Update:  27.10.2005</i></font>
<font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
sub hilfe {
    my $text =<<ENDE;
Dieses Script erstellt die Datei $datei.
Sie koennen das Script mit folgenden Parametern aufrufen:
    -d  oder  -debug      Schalter, dann wird viel geloggt (fip.log)
    -v  oder  -verbose    Schalter, dann sehen Sie viele Meldungen
    -g  oder  -gen_ip      1 oder 0 uebergeben, generieren der IP an/aus
    -k  oder  -keinldap    Schalter, dann wird LDAP nicht abgefragt
    -r  oder  -regex      regulaeren Ausdruck fuer Bildungsvorschrift
    -n  oder  -namen      fuer Namensliste der Gruppen
    -l  oder  -lease      Pfad fuer dhcpd.leases-Datei
    -c  oder  -conf        Pfad fuer dhcpd.conf-Datei
    -f  oder  -friege      Pfad fuer Konfigurationsdatei dieses Scripts
    -b  oder  -bergkemper  Pfad zum Verzeichnis fuer Konfigurationsdateien
    -e  oder  -extended    Schalter, dann auch dhcpd.leases~
    -h  oder  -help        diese Hilfe
Ein Beispiel: Sie wollen eine alte leases-Datei uebergeben, aber neue
IPs generieren (bei Uebergabe von Dateien ist das standardmaessig aus),
aber keinen LDAP nutzen, weil Sie es auf einen Arktur 3.5 ausprobieren
    ./fip.pl  -l /home/tmp/dhcpd.leases.alt  -g 1  -keinldap
ENDE
  print $text;
  exit(0);
}
   
   
   
   
Zeile 154: Zeile 286:
   
   
   <font color="#C0C0C0"><i># die Datei einlesen</i></font>
   <font color="#C0C0C0"><i># die Datei einlesen</i></font>
   open (DATEI,'<'.$datei) or die "die Datei wurde nicht gefunden";
   open (DATEI,'<'.$datei) or die "die Datei $datei wurde nicht gefunden \n$!";
   @daten = <DATEI>;
   @daten = <DATEI>;
   close DATEI;
   close DATEI;
Zeile 176: Zeile 308:
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
  <font color="#C0C0C0"><i># Funktion: Liest alte(!) dhcpd.conf ein und erstellt eine Datenliste</i></font>
  <font color="#C0C0C0"><i># Funktion: Liest alte(!) dhcpd.conf ein und erstellt eine Datenliste</i></font>
  <font color="#C0C0C0"><i># Aufruf:  @daten = &einlesen_conf($pfad);</i></font>
  <font color="#C0C0C0"><i># Aufruf:  ($status,@daten) = &einlesen_conf($status,$pfad);</i></font>
  <font color="#C0C0C0"><i># Input:    Pfad zu einer Datei dhcpd.conf</i></font>
  <font color="#C0C0C0"><i># Input:    Pfad zu einer Datei dhcpd.conf</i></font>
  <font color="#C0C0C0"><i># Output:  Liste von Strings: IP, Rechnername, MAC, Gruppe</i></font>
  <font color="#C0C0C0"><i># Output:  Liste von Strings: IP, Rechnername, MAC, Gruppe</i></font>
  <font color="#C0C0C0"><i># Bemerk.:  Es wird dieses File (siehe bei Input) eingelesen</i></font>
  <font color="#C0C0C0"><i># Bemerk.:  Es wird dieses File (siehe bei Input) eingelesen</i></font>
  <font color="#C0C0C0"><i># Bemerk.:  die Gruppe ist einfach der String 'Raum'</i></font>
  <font color="#C0C0C0"><i># Bemerk.:  die Gruppe ist einfach der String 'Raum'</i></font>
  <font color="#C0C0C0"><i># Update:  24.10.2005</i></font>
<font color="#C0C0C0"><i># Bemerk.:  Wenn keine IP gefunden, dann wird 3. und 13. Bit gesetzt</i></font>
  <font color="#C0C0C0"><i># Update:  27.10.2005</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
  sub einlesen_conf {
  sub einlesen_conf {
  my $status = shift;              <font color="#C0C0C0"><i># Status</i></font>
   my $datei = shift;              <font color="#C0C0C0"><i># Pfad zur lease-Datei</i></font>
   my $datei = shift;              <font color="#C0C0C0"><i># Pfad zur lease-Datei</i></font>
   
   
Zeile 215: Zeile 349:
         $ip = $1
         $ip = $1
       } else {
       } else {
         $ip = '192.168.X.XX'     <font color="#C0C0C0"><i># falls die IP im DNS steht</i></font>
         $ip = '192.168.X.XX';    <font color="#C0C0C0"><i># falls die IP im DNS steht</i></font>
        $status = $status | (4+ 4096)
       }
       }
     }
     }
Zeile 225: Zeile 360:
   }
   }
   
   
   return @temp;
   return $status,@temp;
  }
  }
   
   
Zeile 412: Zeile 547:
  <font color="#C0C0C0"><i># Update:  25.10.2005</i></font>
  <font color="#C0C0C0"><i># Update:  25.10.2005</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
  <font color="#C0C0C0"><i>#--------------------------------------------------------------------</i></font>
$liste2  = &generiere_Gruppennamen($name,$liste);
  sub generiere_Gruppennamen {
  sub generiere_Gruppennamen {
   my $name  = shift;
   my $name  = shift;
Zeile 554: Zeile 688:


Achja, ich programmiere nicht auf Arktur 4, deshalb im Konfigurationsteil die Pfade anpassen
Achja, ich programmiere nicht auf Arktur 4, deshalb im Konfigurationsteil die Pfade anpassen
--[[Benutzer:Kirmse|Kirmse]] 09:00, 27. Okt 2005 (CEST)

Version vom 27. Oktober 2005, 07:00 Uhr

Quelltext

einfach mit der Maus runterkratzen :)


#!/usr/bin/perl -w

use strict;                        # Variablen deklarieren
use Getopt::Long;                  # fuer Kommandozeilenparameter


# ------------------- Konfigurationsbereich ---------------------

# hier wird der Pfad zur Datei "dhcpd.leases" eingetragen. Diese
# Voreinstellung gilt für Arktur 4, wird aber ueber schrieben,
# wenn man mit Kommandozeilenparameter -f eine Datei uebergibt
my $leasedatei  = "dhcpd.leases";

# hier die Bildungsvorschrift fuer den Namen als Regex uebergeben
# diese Voreinstellung bedeutet, dass am Ende die Rechnernummer
# erwartet wird und davor der Raumname. Hinweis: die erste Klammer
# muss der Raumname sein
my $regex = '(.*\D)\d+';

# hier wird die Standardbezeichnung für die Gruppierung festgelegt
# dabei werden die Gruppierungen hochgezaehlt und an diesen Namen
# die Nummer standardmaessig als zweistellige Zahl angehangen.
# die Stelligkeit muss durch eine nachgestellte Zahl hinter dem
# Doppelpunkt angegeben werden z.B. Raum:3 bedeutet Raum007
# diese Standardbezeichnung kann durch eine Liste hinter dem
# Parameter -n oder -name ueberschrieben werden.
my $name   = 'Raum:2';

# hier wird die Datei festgelegt, die erstellt wird
my $datei = 'computer';


# ------------------- Initialisierungsbereich -------------------

# Deklaration der globalen Variablen

my (@daten,@daten1,@daten2,@daten3,$liste1,$liste2,%gruppen,
    $start1,$start2,$debug,$verbose,$gen_ip,$keinldap,$reg,
    $namen,$lease,$conf,$friege,$bergkemper,$extended,$code,
    $status);

# hier werden die Zuordnungen fuer die Parameter erstellt
GetOptions (                       # Parameter fuer:
   'debug'        => \$debug,      # Schalter, dann wird viel geloggt
   'verbose'      => \$verbose,    # Schalter -> viele Meldungen
   'gen_ip=i'     => \$gen_ip,     # 1|0 -  IP generieren an/aus
   'keinldap'     => \$keinldap,   # Schalter, dann kein LDAP
   'regex=s'      => \$reg,        # fuer Bildungsvorschrift
   'quellcode=s'  => \$code,       # -- reserviert --
   'namen=s'      => \$namen,      # fuer Namensliste - Gruppen
   'lease=s'      => \$lease,      # fuer dhcpd.leases-Datei
   'conf=s'       => \$conf,       # fuer dhcpd.conf-Datei
   'friege=s'     => \$friege,     # fuer Konf.datei dieses Scripts
   'bergkemper=s' => \$bergkemper, # fuer Konf.dateien dieses Scripts
   'extended'     => \$extended,   # Schalter -> auch dhcpd.leases~
   'help'         => \&hilfe);     # zeigt dann Parameter u. Aufrufe

my $leasebackup = $leasedatei.'~';


# =================== Hauptprogramm =============================

# ------- 1. Schritt: Status bestimmen --------------------------

# in $status werden die folgenden Informationen gespeichert.
# Hinweis: meine Zählung beginnt ab "1", dass entspricht 2^0
#------------------------------------------------------
# nur  1. Bit gesetzt (DEBUG)       =>  $status =    1;
# nur  2. Bit gesetzt (VERBOSE)     =>  $status =    2;
# nur  3. Bit gesetzt (GEN_IP)      =>  $status =    4;
# nur  4. Bit gesetzt (LDAP)        =>  $status =    8;
# nur  5. Bit gesetzt (REGEX)       =>  $status =   16;
# nur  6. Bit gesetzt (NAMEN)       =>  $status =   32;
# nur  7. Bit gesetzt (CONFDATEI)   =>  $status =   64;
# nur  8. Bit gesetzt (LEASEDATEI)  =>  $status =  128;
# nur  9. Bit gesetzt (LEASEBACKUP) =>  $status =  256;
# nur 10. Bit gesetzt (FRIEGE)      =>  $status =  512;
# nur 11. Bit gesetzt (BERGKEMPER)  =>  $status = 1024;
# nur 12. Bit gesetzt -reserviert-  =>  $status = 2048;
# nur 13. Bit gesetzt (Datenfehler) =>  $status = 4096;
#------------------------------------------------------
# Bsp.: 3. Bit wird gesetzt:   $status = $status | 4 ;  - "or"
# Bsp.: 3. Bit wird negiert:   $status = $status ^ 4 ;  - "xor"
# alles bitweise negieren:     $status = ~$status    ;  - "not"
# Bsp.: 3. Bit wird abgefragt: if ($status & 4) { ... } - "and"
# Bsp.: 3. Bit wird geloescht: $status = $status & ~4;


# standardmaessig IP generiert ->     3. Bit gesetzt
# standardmaessig LDAP verwendet ->   4. Bit gesetzt
# standardmaessig lease-Datei ->     12. Bit gesetzt
$status = 4 + 8 + 2048;

# Schalter -> viel geloggt, dann      1. Bit gesetzt
$status = $status | 1   if (defined($debug));

# Schalter -> viele Meldungen, dann   2. Bit gesetzt
$status = $status | 2   if (defined($verbose));

# Schalter 0|1, dann wird Voreinstellung ueberschrieben
if (defined($gen_ip)) {
  if ($gen_ip == 0) {
    $status = $status & ~4          # 3. Bit geloescht
  } else {
    $status = $status | 4           # 3. Bit gesetzt
  }
}

# Schalter -> kein LDAP, dann         4. Bit loeschen
$status = $status & ~8   if (defined($keinldap));

# wenn Regex uebergeben, dann wird Voreinstellung ueberschrieben
if (defined($reg)) {
  $status = $status | 16 ;          # 5. Bit gesetzt
  $regex  = $reg
}

# wenn Namensliste uebergeben, dann   6. Bit gesetzt
$status = $status | 32   if (defined($namen));

# wenn dhcpd.conf uebergeben, dann
if (defined($conf)) {
  $status = $status | 64 ;         #  7. Bit gesetzt
  $status = $status & ~ 4;         #  3. Bit geloescht (keine IP)
  $status = $status & ~2048;       # 12. Bit geloescht (k. Lease)
}

# wenn leases-Datei uebergeben, dann wird Einstellung ueberschrieben
if (defined($lease)) {
  $status = $status | 128 ;        #  8. Bit gesetzt
  $status = $status & ~ 4;         #  3. Bit geloescht (keine IP)
  $status = $status | 2048;        # 11. Bit gesetzt
  $leasedatei = $lease
}

# wenn dhcpd.leases~ uebergeben
if (defined($extended)) {
  # aber nur, wenn die aktuelle leases verwendet wird
  unless ($status & (64 + 128)) {
    $status = $status | 256        #  9. Bit gesetzt
  }
}

# Konf. Friege-Script uebergeben,    10. Bit gesetzt
$status = $status | 512  if (defined($friege));

# Konf. Bergkemper uebergeben, dann  11. Bit gesetzt
$status = $status | 1024  if (defined($bergkemper));


# ------- 2. Schritt: Einlesen der Daten ------------------------

# initialisieren
@daten = @daten1 = @daten2 = @daten3 = ();

# gewuenschten Daten werden eingelesen, falls in der
# dhcpd.conf keine IP-Adressen stehen, dann wird 3. Bit gesetzt
($status,@daten1)= &einlesen_conf($status,$conf) if ($status & 64);
@daten2  = &einlesen_leases($leasedatei)  if ($status & 2048);
#@daten3  = &einlesen_leases($leasebackup) if ($status & 256);


# und zusammengefuegt (Reihenfolge ist Wesentlich!)
push @daten, @daten1, @daten2, @daten3;


# ------- 3. Schritt: Vernichten von Doubletten -----------------

# bei der dhcpd.leases ist es z.B. bei kurzer LEASE-Time normal,
# dass fuer einen Rechner mehrere Eintraege (Doubletten) stehen,
# diese vernichten wir in Bezug auf die MAC-Adresse
@daten   = &vernichte_Doubletten(@daten);


# ------- 4. Schritt: Bestimmen der Gruppen ---------------------

# mit Hilfe der Regex versuchen wir die Gruppen zu bestimmen
# mit diesen (temporaeren) Namen ueberschreiben wir das 4. Feld
@daten  = &bestimme_Gruppen($regex,@daten);
$liste1 = &bestimme_Gruppenliste(@daten);


# ------- 4. Schritt: Testen der Daten --------------------------

# noch nicht implementiert


# ------- 5. Schritt: Reihenfolge bestimmen ---------------------

# die Daten werden jetzt folgendermassen sortiert: die Gruppen
# werden entsprechend der Anzahl der PCs sortiert und innerhalb
# der Gruppe alphabetisch nach dem Rechnernamen
($liste1,@daten) = &sortieren($liste1,@daten);


# ------- 6. Schritt: Gruppennamem vergeben -------------------

# es wird in gleicher Reihenfolge der temp. Namen ein Name generiert
$liste2  = &generiere_Gruppennamen($name,$liste1);
# es wird das 4. Feld von @daten ueberschrieben
@daten  = &setze_Gruppenname($liste1,$liste2,$namen,@daten);


# ------- 7. Schritt: IP vergeben -------------------------------

# es wird das 1. Feld @daten ueberschrieben
if ($status & 4) {
  @daten  = &setze_ip(@daten)
}


# ------- 8. Schritt: Schreiben der Datei 'computer' ------------

&schreibe_datei($datei,@daten);

print "\n";

# wenn keine Namen uebergeben wurden, dann ...
unless ($status & 32) {
  print 'Es wurden die Namen Raum01, Raum02, ... vergeben'."\n";
  print 'Als temporaere Namen wurden in dieser Reihenfolge ermittelt:'."\n\n";
  print $liste1."\n"
} else {
  print "bin fertig! \n";
}


# =================== Funktionen ================================


#--------------------------------------------------------------------
# Funktion: gibt die Parameter und ein Beispiel fuer einen Aufruf aus
# Aufruf:   als Kommandozeilenparameter (Schalter) ./fip -h
# Update:   27.10.2005
#--------------------------------------------------------------------
sub hilfe {

   my $text =<<ENDE;

Dieses Script erstellt die Datei $datei.
Sie koennen das Script mit folgenden Parametern aufrufen:
   -d  oder  -debug       Schalter, dann wird viel geloggt (fip.log)
   -v  oder  -verbose     Schalter, dann sehen Sie viele Meldungen
   -g  oder  -gen_ip      1 oder 0 uebergeben, generieren der IP an/aus
   -k  oder  -keinldap    Schalter, dann wird LDAP nicht abgefragt
   -r  oder  -regex       regulaeren Ausdruck fuer Bildungsvorschrift
   -n  oder  -namen       fuer Namensliste der Gruppen
   -l  oder  -lease       Pfad fuer dhcpd.leases-Datei
   -c  oder  -conf        Pfad fuer dhcpd.conf-Datei
   -f  oder  -friege      Pfad fuer Konfigurationsdatei dieses Scripts
   -b  oder  -bergkemper  Pfad zum Verzeichnis fuer Konfigurationsdateien
   -e  oder  -extended    Schalter, dann auch dhcpd.leases~
   -h  oder  -help        diese Hilfe

Ein Beispiel: Sie wollen eine alte leases-Datei uebergeben, aber neue
IPs generieren (bei Uebergabe von Dateien ist das standardmaessig aus),
aber keinen LDAP nutzen, weil Sie es auf einen Arktur 3.5 ausprobieren

   ./fip.pl  -l /home/tmp/dhcpd.leases.alt  -g 1  -keinldap

ENDE

  print $text;
  exit(0);
}


#--------------------------------------------------------------------
# Funktion: Liest die dhcpd.leases ein und erstellt eine Datenliste
# Aufruf:   @daten = &einlesen_leases($pfad);
# Input:    Pfad zur Datei dhcpd.leases
# Output:   Liste von Strings: IP, Rechnername, MAC, Gruppe
# Bemerk.:  Es wird dieses File (siehe bei Input) eingelesen
# Bemerk.:  die Gruppe ist einfach der String 'Raum'
# Update:   24.10.2005
#--------------------------------------------------------------------
sub einlesen_leases {
  my $datei = shift;               # Pfad zur lease-Datei

  my ($hostname, $mac, $ip, @daten, @temp);

  # die Datei einlesen
  open (DATEI,'<'.$datei) or die "die Datei $datei wurde nicht gefunden \n$!";
  @daten = <DATEI>;
  close DATEI;

  foreach my $zeile (@daten) {
    if ($zeile =~ /lease\s+(\d+\.\d+\.\d+\.\d+)/i) { $ip = $1 }
    if ($zeile =~ /client-hostname\s*"?(\S*)";?/i) { $hostname = $1 }
    if ($zeile =~ /ethernet\s+(\w+:\w+:\w+:\w+:\w+:\w+)/) { $mac = $1 }
    if ($zeile =~ /}/ and defined($ip)) {
      # sichern die Werte in die Liste @pcs
      push @temp, $ip.','.$hostname.','.$mac.',Raum';
      # wir initialisieren die Variablen neu
      $hostname = $mac = $ip = "";
    }
  }

  return @temp;
}


#--------------------------------------------------------------------
# Funktion: Liest alte(!) dhcpd.conf ein und erstellt eine Datenliste
# Aufruf:   ($status,@daten) = &einlesen_conf($status,$pfad);
# Input:    Pfad zu einer Datei dhcpd.conf
# Output:   Liste von Strings: IP, Rechnername, MAC, Gruppe
# Bemerk.:  Es wird dieses File (siehe bei Input) eingelesen
# Bemerk.:  die Gruppe ist einfach der String 'Raum'
# Bemerk.:  Wenn keine IP gefunden, dann wird 3. und 13. Bit gesetzt
# Update:   27.10.2005
#--------------------------------------------------------------------
sub einlesen_conf {
  my $status = shift;              # Status
  my $datei = shift;               # Pfad zur lease-Datei

  my ($hostname, $mac, $ip, @daten, @temp, @tmp);

  # die Datei einlesen
  open (DATEI,'<'.$datei) or die "die Datei $datei wurde nicht gefunden \n$!";
  @daten = <DATEI>;
  close DATEI;

  # wir vernichten jetzt alle Kommentar
  @temp = @tmp = ();
  foreach my $zeile (@daten) {
    if ($zeile =~ /#/) {
      @tmp = split '#', $zeile;
      push @temp, $tmp[0]."\n"
    } else {
      push @temp, $zeile
    }
  }
  @daten = @temp;

  # jetzt holen wir uns die Daten
  $hostname = $mac = $ip = "";
  @temp = @tmp = ();
  foreach my $z (@daten) {
    if ($z =~ /host\s+(\S+)\s*{/) { $hostname = $1 };
    if ($z =~ /hardware ethernet\s+(\w+:\w+:\w+:\w+:\w+:\w+)/){$mac = $1}
    if ($z =~ /fixed-address\s/) {
      if ($z =~ /fixed-address\s+(\d+\.\d+\.\d+\.\d+);?/){
        $ip = $1
      } else {
        $ip = '192.168.X.XX';     # falls die IP im DNS steht
        $status = $status | (4+ 4096)
      }
    }
    if (($z =~ /}/) and ($mac ne "")) {
      push @temp, $ip.','.$hostname.','.$mac.',Raum';
      # wir initialisieren die Variablen neu
      $hostname = $mac = $ip = "";
    }
  }

  return $status,@temp;
}


#--------------------------------------------------------------------
# Funktion: vernichtet die Doubletten bzgl. MAC und Name
# Aufruf:   @daten = &vernichte_Doubletten(@daten);
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Update:   24.10.2005
#--------------------------------------------------------------------
sub vernichte_Doubletten {
  my @daten = @_;

  my @temp = ();
  my %h    = ();
  my ($pc,$ip,$mac,$gruppe);

  # jeder Datensatz kommt in den Hash %h: $h{$mac} -> Datensatz
  foreach my $datensatz (@daten) {
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    $h{$mac} = $datensatz;
  }
  # und dann wird daraus wieder eine Liste erstellt
  foreach my $ds (keys %h) {
    push @temp, $h{$ds}
  }

  # jeder Datensatz kommt in den Hash %h: $h{$pc} -> Datensatz
  %h    = ();
  foreach my $datensatz (@temp) {
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    $h{$pc} = $datensatz;
  }
  # und dann wird daraus wieder eine Liste erstellt
  @daten = ();
  foreach my $rechner (keys %h) {
    push @daten, $h{$rechner}
  }

  return @daten
}


#--------------------------------------------------------------------
# Funktion: Ermittelt temporaeren Gruppennamen, schreibt ins 4. Feld
# Aufruf:   @daten = &bestimme_Gruppen($regex,@daten);
# Input:    Regex als Bildungsvorschrift fuer den Rechnernamen
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Update:   24.10.2005
#--------------------------------------------------------------------
sub bestimme_Gruppen
{
  my $regex = shift;               # die Regex uebergeben
  my @liste = @_;                  # es wird @daten uebergeben

  my ($pc,$ip,$mac,$gruppe,@temp);

  foreach my $datensatz (@liste) {
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    if ($pc =~ /$regex/i) {        # wir suchen den Gruppenname
      $gruppe = $1
    } else {
      $gruppe = $pc                # sonst den ganzen Rechnername
    }
    push @temp, $ip.','.$pc.','.$mac.','.$gruppe
  }

  return @temp
}


#--------------------------------------------------------------------
# Funktion: Ermittelt eine doublettenfreie Liste der Gruppennamen
# Aufruf:   @liste = &bestimme_Gruppenliste(@daten);
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   der String Gruppe1,Gruppe2,Gruppe3,Gruppe4,...
# Update:   24.10.2005
#--------------------------------------------------------------------
sub bestimme_Gruppenliste {
  my @daten = @_;

  my $liste = "";
  my ($pc,$ip,$mac,$gruppe,%h);

  foreach my $datensatz (@daten) {
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    $h{$gruppe} = 1;               # Gruppenname in den Hash
  }

  foreach my $x (keys %h) {
    $liste .= $x.',' ;
  }
  chop($liste);                    # das letzte Komma weg

  return $liste
}


#--------------------------------------------------------------------
# Funktion: sortiert $liste und @daten (nach Anzahl der PCs)
# Aufruf:   ($liste,@daten) = &sortieren($liste,@daten);
# Input:    der String Gruppe1,Gruppe2,Gruppe3,Gruppe4,...
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   der sortierte String Gruppe1,Gruppe2,Gruppe3,...
# Output:   die sortierte Liste @daten "IP,Rechnername,MAC,Gruppe"
# Update:   24.10.2005
#--------------------------------------------------------------------
sub sortieren {
  my $liste = shift;
  my @daten = @_;

  my ($pc,$ip,$mac,$gruppe);       # zum Zerlegen des Datensatzes
  my (@gruppen,%h,%anz);           # Gruppen, Hash auf DS und Anzahl
  my (@tmp,@tmp2,@tmp3,%namen);

  # den String zerlegen, damit wir auf jede Gruppe zugreifen koennen
  @gruppen = split ',', $liste;

  # wir legen jetzt fuer jede Gruppe eine Liste an und erzeugen
  # einen Hash %h mit $h{Gruppenname} -> Zeiger auf die Liste
  foreach my $gr (@gruppen) {
    my @temp  = ();
    # fuer jeden Datensatz
    foreach my $datensatz (@daten) {
      # zerlege den Datensatz und hole die Gruppe
      ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
      if ($gr eq $gruppe) { push @temp, $datensatz };
    }
    $h{$gr} = \@temp;
  }

  # wir holen uns von jeder Gruppe die Anzahl und erzeugen
  # einen Hash %anz mit $anz{Gruppenname} -> Anzahl
  foreach my $gr (@gruppen) {
    my $ref = $h{$gr};
    my $anz = @$ref;
    $anz{$gr} = $anz
  }

  # eine sortierte Liste der Gruppen erzeugen (groesste zuerst)
  @gruppen = sort {$anz{$b} <=> $anz{$a} or lc($a) cmp lc($b)} keys %anz;

  # wir basteln aus der Liste einen String, Trennzeichen Komma
  $liste = "";                     # initialisieren
  foreach my $element (@gruppen) {
    $liste .= $element.','
  }                                # das letzte Komma wieder weg
  chop($liste);                    # -> unser erster Rueckgabewert

  # wir sortieren jetzt jede Gruppe nach dem Rechnernamen
  @tmp2 = ();
  foreach my $gr (@gruppen) {
    my $ref = $h{$gr};
    @tmp = @$ref;

    # fuer jeden Datensatz dieser Gruppe
    %namen = ();
    foreach my $datensatz (@tmp) {
      # zerlege den Datensatz und hole den Rechnername und erzeuge
      # einen Hash %namen mit $namen{Rechnername} -> Datensatz
      ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
      $namen{$pc} = $datensatz;
    }

    # fuer jeden Rechnernamen dieser Gruppe hole den Datensatz
    @tmp3 = ();
    foreach my $pc (sort keys %namen) {
       push @tmp3, $namen{$pc}
    }

    push @tmp2, @tmp3
  }

  return ($liste,@tmp2)
}


#--------------------------------------------------------------------
# Funktion: es wird der Gruppenname generiert (RaumXX)
# Aufruf:   $liste2  = &generiere_Gruppennamen($name,$liste);
# Input:    der String $name wird im Konfigurationsteil festgelegt
# Input:    die String $liste enthält die sortierten Gruppennamen
# Output:   der String mit Raum01,Raum02,Raum03,...
# Update:   25.10.2005
#--------------------------------------------------------------------
sub generiere_Gruppennamen {
  my $name  = shift;
  my $liste = shift;

  my $liste2 = "";
  my @gruppe = ();
  my $zaehler = 1;

  # wir bauen den Formatstring
  my ($temp,$anz) = split ':', $name;
  my $string  = '%0'.$anz.'u';

  # wir zerlegen den String $liste in eine echte Liste
  @gruppe = split ',' , $liste;

  # nun erzeugen wir die Namensliste
  foreach my $gruppe (@gruppe) {
    $temp    = sprintf($string,$zaehler);
    $liste2 .= 'Raum'.$temp.',';
    $zaehler++;
  }
  chop ($liste2);

  return $liste2
}


#--------------------------------------------------------------------
# Funktion: # es wird das 4. Feld von @daten ueberschrieben
# Aufruf:   @daten  = &setze_Gruppenname($liste,$liste2,$namen,@daten);
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Update:   25.10.2005
#--------------------------------------------------------------------
sub setze_Gruppenname {
  my $liste  = shift;
  my $liste2 = shift;
  my $namen  = shift;
  my @daten  = @_;

  my ($ip,$pc,$mac,$gruppe);

  my @neu    = ();
  my %namen  = ();
  my @neuername = ();
  my @tempnamen = split ',', $liste;
  my @gen_name  = split ',', $liste2;
  if (defined($namen)) {
    @neuername = split ',', $namen
  }

  my $help1 = "";
  my $help2 = "";

  foreach my $name (@tempnamen) {
    $help1 = shift @gen_name;
    $help2 = shift @neuername;
    if (defined($help2)) {
      $namen{$name} = $help2
    } else {
      $namen{$name} = $help1
    }
  }

  foreach my $datensatz (@daten) {
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    if (defined($namen{$gruppe})) {
      $gruppe = $namen{$gruppe}
    }
    push @neu, $ip.','.$pc.','.$mac.','.$gruppe;
  }

  return @neu;
}

#--------------------------------------------------------------------
# Funktion: setzt die IP-Werte nach der Vorgabe im Wiki
# Aufruf:   @daten  = &setze_ip(@daten);
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Update:   25.10.2005
#--------------------------------------------------------------------
sub setze_ip {
  my @daten = @_;

  my $gr = "";
  my ($pc,$ip,$mac,$gruppe,@temp);

  my $start1 = undef;
  my $start2 = 21;

  my $ip1 = $start1;
  my $ip2 = $start2;

  # fuer jeden Datensatz tue
  foreach my $datensatz (@daten) {
    # zerlege den Datensatz und hole die Gruppe
    ($ip,$pc,$mac,$gruppe) = split ',', $datensatz;
    if ($gr ne $gruppe) {
      $gr = $gruppe;
      unless (defined($ip1)) {
        $ip1 = 0
      } else {
        $ip1++
      }
      $ip2 = $start2
    } else {
      $ip2++
    }

    push @temp, '192.168.'.$ip1.'.'.$ip2.','.$pc.','.$mac.','.$gruppe;
  }

  return @temp
}


#--------------------------------------------------------------------
# Funktion: schreibt die gesuchte Datei (normalerweise 'computer')
# Aufruf:   &schreibe_datei($datei,@daten);
# Input:    Pfad zur zur schreibenden Datei
# Input:    die Liste @daten aus "IP,Rechnername,MAC,Gruppe"
# Output:   die Datei 'computer' auf die Festpaltte
# Update:   25.10.2005
#--------------------------------------------------------------------
sub schreibe_datei {
  my $datei = shift;
  my @daten = @_;

  open (DATEI, ">$datei") or die "konnte Datei $datei nicht oeffnen $!";
  foreach my $datensatz (@daten) {
    print DATEI $datensatz."\n"
  }
  close DATEI
}




Achja, ich programmiere nicht auf Arktur 4, deshalb im Konfigurationsteil die Pfade anpassen

--Kirmse 09:00, 27. Okt 2005 (CEST)