Benutzer:Kirmse/delixs-pooldel

Aus Delixs
Zur Navigation springen Zur Suche springen
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

delixs-pooldel

  • Dieses Script dient dazu, Pools im LDAP zu löschen
  • Parameter: --help oder -h, --pool oder -p, --tnetz oder -t
  • Aufruf: delixs-pooldel -p mathe -t 10.101.0.0

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;

  1. dieses Script löscht einen uebergebenen Pool (=> 'delixs-poollist' aufrufen)
  2. der Pool muss existieren
  3. der Pool muss leer sein (keine Hosts eingetragen)

my ($ldap, $ldap_base, $pass, $entry, $mesg, $teilnetz, $vorgabe_teilnetz,

   $poolname);


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

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

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


  1. Initialisieren der Variablen fuer die Parameter

$poolname = ; $teilnetz = ;

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

GetOptions('pool=s' => \$poolname,

          'tnetz=s'  => \$teilnetz,
          'help'     => \&help);


  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 Pool im LDAP leer ist (keine Hosts eingetragen)

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

                     filter => 'objectClass=dhcpHost');
  1. wenn wir Eintraege erhalten haben, dann Abbruch

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

 die "Abbruch: Der angegebene Pool $poolname ist nicht leer!\n";

}

  1. nun loeschen wir den Pool

$mesg = $ldap->delete( "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 "Die Rechnergruppe \"$poolname\" 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>