Benutzer:Kirmse/delixs-hostdel
delixs-hostdel
- Dieses Script dient dazu, Hosts im LDAP zu löschen
- Parameter: --help oder -h, --pool oder -p, --tnetz oder -t, --rechner oder -r
- Aufruf: delixs-hostdel -p mathe -r Aachen
das Teilnetz muss normalerweise nicht angegeben werden. Voreinstellung ist '10.100.0.0'. Dieser Parameter ist nur dazu da, damit dieses Script (später) auch dann genutzt werden kann, wenn weitere echte Netzwerkkarten eingebaut wurden.
das Script
<source lang="perl">
- !/usr/bin/perl
use warnings; use strict;
use Net::LDAP; use Getopt::Long;
my ($ldap, $ldap_base, $pass, $entry, $mesg, $teilnetz, $vorgabe_teilnetz,
$poolname, $pcname);
- --------- Konfigurationsbereich --------------------------------------------
$vorgabe_teilnetz = '10.100.0.0'; # Vorgabe fuer das Teilnetz
- ----------------------------------------------------------------------------
- Initialisieren der Variablen fuer die Parameter
$pcname = ; $poolname = ; $teilnetz = ;
- wir holen uns zuerst die Parameter,
- falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden
GetOptions('rechner=s' => \$pcname,
'pool=s' => \$poolname, 'tnetz=s' => \$teilnetz, 'help' => \&help);
- Wenn kein Parameter -r oder --rechner uebergeben wurde, dann Abbruch
if ($pcname eq ) {
die "Abbruch: es wurde kein Name fuer den Rechner uebergeben!\n";
}
- Wenn der Rechnername nicht den (meinen) Konventionen entspricht, dann Abbruch
unless ($pcname =~ /^[a-zA-Z]\w{1,10}$/) {
die "Abbruch: Der Name $pcname fuer den Rechner ist nicht korrekt!\n";
}
- 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;
}
- Wenn wir keine root-Rechte haben, dann Abbruch
if ($> != 0) { # siehe $EFFECTIVE_USER_ID,$EUID
die "Abbruch: das Script muss mit root-Rechten ausgefuehrt werden!\n";
}
- 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;
- da wir (spaeter) in den LDAP schreiben wollen, brauchen wir noch das Passwort
open DATEI, '<', '/etc/ldap.secret'
or die "Abbruch: konnte ldap.secret nicht oeffnen, $!\n";
$pass = <DATEI>; chomp($pass); close DATEI;
- wir verbinden uns mit dem LDAP
$ldap = Net::LDAP->new('127.0.0.1', version => 3) or die "Abbruch: $@"; $ldap->bind( dn => "cn=admin, $ldap_base", password => $pass)
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", attrs => 'dhcpNetMask' ); # nur ein Dummy
$mesg->code and die $mesg->error;
- 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 wir keinen Eintrag erhalten haben, dann Abbruch
if (scalar ($mesg->entries) == 0) {
die "Abbruch: Der angegebene Pool $poolname existiert nicht im LDAP!\n";
}
- wir ueberpruefen, ob der Host im LDAP existiert
$mesg = $ldap->search(
base => "cn=$pcname,cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base", filter => 'objectClass=dhcpHost' );
- Wenn der Host nicht gefunden wird, dann Abbruch
if (scalar ($mesg->entries) == 0) {
die "Abbruch: Der Host $pcname existiert nicht im LDAP!\n";
}
- nun loeschen wir den Host
$mesg = $ldap->delete("cn=$pcname,cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base"); $mesg->code and die $mesg->error;
- wir trennen uns vom LDAP
$ldap->unbind;
- Ausgabe auf der Konsole (Rueckmeldung)
print "Der DHCP-Host \"$pcname\" wurde geloescht.\n";
- Programm-Ende #####################################
- Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help {
print "Hilfe muss noch erstellt werden.\n"; exit (0);
}
__END__
</source>