Benutzer:Kirmse/fip03: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Kirmse (Diskussion | Beiträge) Formatierung geändert |
K 6 Versionen |
||
| (3 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
| Zeile 4: | Zeile 4: | ||
<font color="#C0C0C0"><i>#!/usr/bin/perl -w</i></font> | |||
use strict; <font color="#C0C0C0"><i># Variablen | 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 15: | 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 31: | 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 36: | Zeile 39: | ||
<font color="#C0C0C0"><i># Deklaration der globalen Variablen</i></font> | <font color="#C0C0C0"><i># Deklaration der globalen Variablen</i></font> | ||
<font color="#C0C0C0"><i># | my (@daten,@daten1,@daten2,@daten3,$liste1,$liste2,%gruppen, | ||
$start1,$start2,$debug,$verbose,$gen_ip,$keinldap,$reg, | |||
$namen,$lease,$conf,$friege,$bergkemper,$extended,$code, | |||
$status); | |||
<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: | <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># Schalter -> viele Meldungen, dann 2. Bit gesetzt</i></font> | |||
$status = $status | 2 if (defined($verbose)); | |||
<font color="#C0C0C0"><i># | <font color="#C0C0C0"><i># Schalter 0|1, dann wird Voreinstellung ueberschrieben</i></font> | ||
<font color="#C0C0C0"><i># | if (defined($gen_ip)) { | ||
if ($gen_ip == 0) { | |||
$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># Konf. Bergkemper uebergeben, dann 11. Bit gesetzt</i></font> | |||
$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># | <font color="#C0C0C0"><i># initialisieren</i></font> | ||
@ | @daten = @daten1 = @daten2 = @daten3 = (); | ||
<font color="#C0C0C0"><i># gewuenschten Daten werden eingelesen, falls in der</i></font> | |||
<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># | <font color="#C0C0C0"><i># diese vernichten wir in Bezug auf die MAC-Adresse</i></font> | ||
@daten = &vernichte_Doubletten(@daten); | @daten = &vernichte_Doubletten(@daten); | ||
| Zeile 81: | 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 | @daten = &bestimme_Gruppen($regex,@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 90: | 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> | ||
($ | ($liste1,@daten) = &sortieren($liste1,@daten); | ||
| Zeile 96: | 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,$ | $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($ | @daten = &setze_Gruppenname($liste1,$liste2,$namen,@daten); | ||
| Zeile 104: | 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> | ||
@daten = &setze_ip(@daten) | if ($status & 4) { | ||
@daten = &setze_ip(@daten) | |||
} | |||
| Zeile 113: | Zeile 221: | ||
print "\n"; | print "\n"; | ||
unless | <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 $ | print $liste1."\n" | ||
} else { | } else { | ||
print "bin fertig! \n" | print "bin fertig! \n"; | ||
} | } | ||
<font color="#C0C0C0"><i># =================== Funktionen ================================</i></font> | |||
<font color="#C0C0C0"><i># ==== | |||
<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 141: | 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 158: | Zeile 303: | ||
return @temp; | return @temp; | ||
} | |||
<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># 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># 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.: die Gruppe ist einfach der String 'Raum'</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> | |||
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 ($hostname, $mac, $ip, @daten, @temp, @tmp); | |||
<font color="#C0C0C0"><i># die Datei einlesen</i></font> | |||
open (DATEI,'<'.$datei) or die "die Datei $datei wurde nicht gefunden \n$!"; | |||
@daten = <DATEI>; | |||
close DATEI; | |||
<font color="#C0C0C0"><i># wir vernichten jetzt alle Kommentar</i></font> | |||
@temp = @tmp = (); | |||
foreach my $zeile (@daten) { | |||
if ($zeile =~ /<font color="#C0C0C0"><i>#/) {</i></font> | |||
@tmp = split '<font color="#C0C0C0"><i>#', $zeile;</i></font> | |||
push @temp, $tmp[0]."\n" | |||
} else { | |||
push @temp, $zeile | |||
} | |||
} | |||
@daten = @temp; | |||
<font color="#C0C0C0"><i># jetzt holen wir uns die Daten</i></font> | |||
$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'; <font color="#C0C0C0"><i># falls die IP im DNS steht</i></font> | |||
$status = $status | (4+ 4096) | |||
} | |||
} | |||
if (($z =~ /}/) and ($mac ne "")) { | |||
push @temp, $ip.','.$hostname.','.$mac.',Raum'; | |||
<font color="#C0C0C0"><i># wir initialisieren die Variablen neu</i></font> | |||
$hostname = $mac = $ip = ""; | |||
} | |||
} | |||
return $status,@temp; | |||
} | } | ||
| Zeile 344: | 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> | ||
sub generiere_Gruppennamen { | sub generiere_Gruppennamen { | ||
my $name = shift; | my $name = shift; | ||
| Zeile 379: | Zeile 581: | ||
<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> | ||
sub setze_Gruppenname { | sub setze_Gruppenname { | ||
my $liste = shift; | my $liste = shift; | ||
| Zeile 475: | Zeile 676: | ||
my @daten = @_; | my @daten = @_; | ||
open (DATEI, ">$datei | open (DATEI, ">$datei") or die "konnte Datei $datei nicht oeffnen $!"; | ||
foreach my $datensatz (@daten) { | foreach my $datensatz (@daten) { | ||
print DATEI $datensatz."\n" | print DATEI $datensatz."\n" | ||
| Zeile 481: | Zeile 682: | ||
close DATEI | close DATEI | ||
} | } | ||
| Zeile 489: | Zeile 689: | ||
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]] | --[[Benutzer:Kirmse|Kirmse]] 09:00, 27. Okt 2005 (CEST) | ||
Aktuelle Version vom 4. März 2008, 21:08 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)