Benutzer:Kirmse/delixs-hostlist
delixs-hostlist
- dieses Script listet alle DHCP-Hosts für einen Pool (Raum) auf
- Parameter: --help oder -h, --tnetz oder -t, -pool oder -p
- Aufruf: delixs-hostlist -p chemie
das Teilnetz muss normalerweise nicht angegeben werden. Voreinstellung ist '10.100.0.0'. Das Script wird also normalerweise nur mit dem Parameter für den Pool (Raum) aufgerufen.
das Script
<source lang="perl">
- !/usr/bin/perl
use warnings; use strict;
use Net::LDAP; use Getopt::Long;
my ($ldap, $ldap_base, $entry, $mesg, $teilnetz, $vorgabe_teilnetz, $temp,
$poolname, @temp);
$vorgabe_teilnetz = '10.100.0.0';
- Initialisieren der Variablen fuer die Parameter
$teilnetz = ; $poolname = ;
- wir holen uns zuerst die Parameter,
- falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden
GetOptions('tnetz=s'=> \$teilnetz,
'pool=s' => \$poolname, 'help' => \&help);
- Wenn kein Parameter -p oder --poolname uebergeben wurde, dann Abbruch
if ($poolname eq ) {
die "Abbruch: es wurde kein Name fuer die Rechnergruppe uebergeben!\n";
}
- Wenn der Poolname nicht den (meinen) Konventionen entspricht, dann Abbruch
unless ($poolname =~ /^[a-zA-Z]\w{1,10}$/) {
die "Abbruch: Der Name fuer die Rechnergruppe ist nicht korrekt!\n";
}
- Wenn Parameter Teilnetz uebergeben, dann kontrollieren
unless ($teilnetz eq ) {
# ob richtiges Format unless ($teilnetz =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.0$/) { die "Abbruch: Das Teilnetz $teilnetz ist keine gueltige Angabe!\n" }
}
- Wenn der Parameter nicht uebergeben
else {
# dann setzen wir das Teilnetz $teilnetz = $vorgabe_teilnetz;
}
- wir holen uns die Such-Basis ($ldap_base) aus der ldap.conf
open DATEI, '<', '/etc/ldap/ldap.conf'
or die "Abbruch: konnte ldap.conf nicht oeffnen, $!\n";
while (my $zeile = <DATEI>) {
if ($zeile =~ m/^\s*base\s+(\w.*\w)\s*$/i) { $ldap_base = $1; last; }
} close DATEI;
- wir verbinden uns mit dem LDAP
$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@"; $ldap->bind or die "Abbruch: konnte mich nicht mit dem LDAP verbinden";
- wir ueberpruefen, ob das Teilnetz im LDAP existiert
$mesg = $ldap->search(base => "cn=$teilnetz,cn=DHCP Config,$ldap_base",
filter => "cn=$teilnetz");
- wenn wir keinen Eintrag erhalten haben, dann Abbruch
if (scalar ($mesg->entries) == 0) {
die "Abbruch: Das Teilnetz $teilnetz existiert nicht im LDAP!\n";
}
- Wir ueberpruefen, ob der Pool im LDAP existiert
$mesg = $ldap->search(
base => "cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base", filter => "cn=$poolname");
- Wenn der Pool nicht gefunden wird dann Abbruch
if (scalar ($mesg->entries) == 0) {
die "Abbruch: Der Pool $poolname existiert nicht im LDAP!\n";
}
- wir holen uns von diesem Pool die DHCP-Hosts
$mesg = $ldap->search(
base => "cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base", filter => 'objectClass=dhcpHost', attrs => ['cn', 'dhcpStatements'] );
- wir trennen uns vom LDAP
$ldap->unbind;
- wir geben die Hosts aus
if (scalar ($mesg->entries) > 0) {
foreach my $entry ($mesg->entries) { $temp = $entry->get_value('dhcpStatements'); ($temp) = $temp =~ /^fixed-address (.*)$/; push @temp, $entry->get_value('cn'). ': ' . $temp ; } @temp = sort { &ip_vergleich($a,$b) } @temp; foreach my $element (@temp) { print $element, "\n"; }
} else {
print "Warnung: keinen DHCP-Host im Pool $poolname gefunden!\n";
}
- Programm-Ende #####################################
- Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help {
print "Hilfe muss noch erstellt werden.\n"; exit (0);
}
- bei den (festen) IPs in einem Pool unterscheidet sich nur das letzte Oktett
sub ip_vergleich {
my $ip1 = shift; my $ip2 = shift;
my ($str, $temp1, $temp2, @oktetts1, @oktetts2); ($str, $temp1) = split /: /, $ip1; # den Name abtrennen (verwerfen) ($str, $temp2) = split /: /, $ip2; # den Name abtrennen (verwerfen) @oktetts1 = split /\./, $temp1; # die IP an dem Punkt splitten @oktetts2 = split /\./, $temp2; # die IP an dem Punkt splitten return $oktetts1[3] <=> $oktetts2[3]; # das Ergebnis ist -1, 0, 1
}
__END__
</source>