Benutzer:Kirmse/delixs-hostdel

Aus Delixs
Zur Navigation springen Zur Suche springen

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">

  1. !/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);


  1. --------- Konfigurationsbereich --------------------------------------------

$vorgabe_teilnetz = '10.100.0.0'; # Vorgabe fuer das Teilnetz

  1. ----------------------------------------------------------------------------


  1. Initialisieren der Variablen fuer die Parameter

$pcname = ; $poolname = ; $teilnetz = ;

  1. wir holen uns zuerst die Parameter,
  2. falls --help, dann Ausgabe der Hilfe (siehe &help) und beenden

GetOptions('rechner=s' => \$pcname,

          'pool=s'    => \$poolname,
          'tnetz=s'   => \$teilnetz,
          'help'      => \&help);
  1. Wenn kein Parameter -r oder --rechner uebergeben wurde, dann Abbruch

if ($pcname eq ) {

 die "Abbruch: es wurde kein Name fuer den Rechner uebergeben!\n";

}

  1. 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";

}

  1. Wenn kein Parameter -p oder --poolname uebergeben wurde, dann Abbruch

if ($poolname eq ) {

 die "Abbruch: es wurde kein Name fuer die Rechnergruppe uebergeben!\n";

}

  1. 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";

}

  1. 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"
 }

}

  1. Wenn der Parameter nicht uebergeben

else {

 # dann setzen wir das Teilnetz
 $teilnetz = $vorgabe_teilnetz;  

}

  1. 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";

}

  1. 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;

  1. 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;

  1. 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";
  1. 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;

  1. wenn wir keinen Eintrag erhalten haben, dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Das Teilnetz $teilnetz existiert nicht im LDAP!\n";

}

  1. wir ueberpruefen, ob der Pool im LDAP existiert

$mesg = $ldap->search(base => "cn=$poolname,cn=$teilnetz,cn=DHCP Config,$ldap_base",

                     filter => "cn=$poolname");
  1. wenn wir keinen Eintrag erhalten haben, dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Der angegebene Pool $poolname existiert nicht im LDAP!\n";

}

  1. 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' );
  1. Wenn der Host nicht gefunden wird, dann Abbruch

if (scalar ($mesg->entries) == 0) {

 die "Abbruch: Der Host $pcname existiert nicht im LDAP!\n";

}

  1. 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;

  1. wir trennen uns vom LDAP

$ldap->unbind;

  1. Ausgabe auf der Konsole (Rueckmeldung)

print "Der DHCP-Host \"$pcname\" wurde geloescht.\n";


                                      1. Programm-Ende #####################################
  1. Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden

sub help {

  print "Hilfe muss noch erstellt werden.\n";
  exit (0);

}

__END__

</source>